http://www.emesn.com/autoitforum/viewto ... dc9e#p8331
hablábamos en una entrada en la que Jonny ponía una UDF para hacer efectos, si se podía hacer un efecto de onda... pues la UDF aquélla no lo hacía, pero lo he montado a base de poner cada letra en un label y desplazarlos... ¡y va sorprendentemente suave!
He aquí el código de ejemplo, lo he modificado para que vaya en la 3.3.6, pero no lo puedo probar porque tengo la 3.3.0 , así que si hay algún problema para compilar me lo comentáis:
Código: Seleccionar todo
#cs ----------------------------------------------------------------------------
AutoIt Version: 3.3.6.0
Author: Ximorro
Script Function:
Efecto de texto en ondas Xísmicas ;-)
#ce ----------------------------------------------------------------------------
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <StaticConstants.au3>
Opt('MustDeclareVars', 1)
Opt("GUIOnEventMode", 1)
Global $WS_EX_COMPOSITED = 0x02000000 ;Evita parpadeos en XP
Global $GUIondas, $aLabels[1], $aX[1], $nlabels, $texto
$GUIondas = GuiCreate("Ondas Xísmicas", 900,200, -1,-1, -1,$WS_EX_COMPOSITED)
GUISetOnEvent($GUI_EVENT_CLOSE, "_Cerrar")
GUISetFont(40, 800, 0, "Courier New")
$texto = "¡XIMORRO SUBE Y BAJA!"
$nlabels = StringLen($texto)
ReDim $aLabels[$nlabels], $aX[$nlabels]
Global $X = 30, $dX = 40, $Y = 70
For $i = 0 To $nlabels-1
$aLabels[$i] = GUICtrlCreateLabel(StringMid($texto,$i+1,1), $X,$Y, 40,-1, $SS_CENTER)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
$aX[$i] = $X ;Guardamos la X para mantenerla al reposicionar las etiquetas
$X += $dX
Next
GUISetState()
; Parámetros para la onda (en realidad cada letra tiene la suya, desfasadas entre sí de forma constante)
Global Const $PI = 3.14159265358979
Global $amplitud = 40, $alfa = 0, $delta = 0.2, $desfase = 0.5
AdlibRegister("_OndaLabels", 25)
While 1
Sleep(1000) ; No afecta a Adlib, que interrumpe
WEnd
Func _OndaLabels()
For $i = 0 To $nlabels-1
GUICtrlSetPos($aLabels[$i], $aX[$i], $Y + Sin($alfa+$i*$desfase)*$amplitud)
Next
;Con estas dos líneas la onda se desplaza de izquierda a derecha:
$alfa -= $delta
If $alfa < 0 Then $alfa += 2*$PI ;Si se pasa de una vuelta lo ponemos de nuevo en la primera revolución
;Sustituyendo lo anterior por estas dos líneas la onda se desplaza de derecha a izquierda:
;$alfa += $delta
;If $alfa > 2*$PI Then $alfa -= 2*$PI ;Si se pasa de una vuelta (360º = 2PI radianes) lo ponemos de nuevo en la primera revolución
EndFunc
Func _Cerrar()
Exit
EndFunc
$amplitud es lo que se desplaza en vertical cada letra, en píxeles
$alfa no lo toquéis, es un ángulo que va dando vueltas para calcular la función trigonométrica
$delta es el "paso" en que se incrementa $alfa, más pequeño = menos saltos = más suave = aparentemente más lento (se moverá menos distancia en el mismo tiempo)
$desfase es la diferencia dentro de la onda para cada letra, si queréis una onda con más picos aumentadlo, si la queréis más suave (más estirada) se hace más pequeño.
Si cambiáis $delta y $desfase que sea en valores pequeñitos ¡que está en radianes!
La velocidad global se cambia con la función Adlib, que ejecuta la actualización del efecto a intervalos regulares. Lo podría haber puesto en el bucle principal, pero así se puede poner otras cosas más fácilmente. Eso sí, con la configuración actual de 25ms igual queda un poco justo si el GUI tiene que hacer otras muchas cosas