jQuery_Move() Bewegungen UDF

  • Servus..

    [Blockierte Grafik: http://img717.imageshack.us/img717/3323/bild001f.png]

    Ich habe in einem aktuellem Projekt flüssige Bewegungen benötigt. Da bin ich auf ein jQuery Plugin Easing gestoßen.
    Ich habe die ca.30 Funktionen von Javascript in autoit übersetzt. Ich hoffe es kann jemand benutzen... Danke dafür auch nochmal an XovoxKingdom für die kurze Hilfe am Anfang.
    Achja... sorry für die schlampige GDI übersetzung.. aber mangelnde Erfahrung und Zeitdruck kommt nicht gut ;). Falls da noch einmal jemand ran möchte
    um das ganze etwas runder zu gestalten..gerne!! Ich aktualisiere dann den Post.

    Kleines Bsp. für die Benutzung der UDF:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #include <GDIPlus.au3>
    #include <ComboConstants.au3>
    #include <StaticConstants.au3>
    #include 'jQuery_Move.au3'

    [/autoit] [autoit][/autoit] [autoit]

    $hWnd = GUICreate("JQueryMove Bewegungen", 400, 400, Default, Default)
    $hCombo = GUICtrlCreateCombo("", 5, 5,120,22)
    GUICtrlSetData(-1, "|easeSmooth|easeInQuad|easeOutQuad|easeInOutQuad|easeInCubic|easeOutCubic|easeInOutCubic"& _
    "|easeInQuart|easeOutQuart|easeInOutQuart|easeInQuint|easeOutQuint|easeInOutQuint"& _
    "|easeInSine|easeOutSine|easeInOutSine|easeInExpo|easeOutExpo|easeInOutExpo|easeInCirc"& _
    "|easeOutCirc|easeInOutCirc|easeInElastic|easeOutElastic|easeInOutElastic|easeInBack"& _
    "|easeOutBack|easeInOutBack|easeInBounce|easeOutBounce|easeInOutBounce","easeInOutBack")
    $hButton = GUICtrlCreateButton('starten...',130,5,100,22)
    GUICtrlCreateLabel("Dauer in ms" ,235,5,60,22,$SS_CENTERIMAGE)
    $hInput_ms = GUICtrlCreateInput(2000,300,5,50,22)
    $verstrichen = GUICtrlCreateLabel("" ,235,105,60,22,$SS_CENTERIMAGE)
    GUISetState(@SW_SHOW)
    _GDIPlus_Startup()

    [/autoit] [autoit][/autoit] [autoit]

    $graphic = _GDIPlus_GraphicsCreateFromHWND($hWnd)
    $graphic2 = _GDIPlus_GraphicsCreateFromHWND($hWnd)
    $bitmap = _GDIPlus_BitmapCreateFromGraphics(400, 50, $graphic)
    $bitmap2 = _GDIPlus_BitmapCreateFromGraphics(400, 250, $graphic2)
    $buffer = _GDIPlus_ImageGetGraphicsContext($bitmap)
    $buffer2 = _GDIPlus_ImageGetGraphicsContext($bitmap2)
    $hPenRED = _GDIPlus_PenCreate(0xFFFF0000 )
    While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    Exit
    Case $hButton

    [/autoit] [autoit][/autoit] [autoit]

    ; DrawChartLines
    $x_old = 0
    $x_now = 0
    $old_x = 0
    $bewegt = 0
    $bewegt_old = 0
    _GDIPlus_GraphicsClear($buffer2,0xFFFFFFFF)
    _GDIPlus_GraphicsDrawImage($graphic2, $bitmap2, 0, 130)
    _GDIPlus_GraphicsDrawLine($graphic2,50,150,50,350,$hPenRED)
    _GDIPlus_GraphicsDrawLine($graphic2,300,150,300,350,$hPenRED)
    _GDIPlus_GraphicsDrawLine($graphic2,0,250,400,250,$hPenRED)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $intime = TimerInit()
    $ms_max = GUICtrlRead($hInput_ms)
    While TimerDiff($intime) < $ms_max

    [/autoit] [autoit][/autoit] [autoit]

    ; DrawLine
    _GDIPlus_GraphicsClear($buffer,0x11FFFFFF)
    _GDIPlus_GraphicsDrawLine($graphic,50,55,50,85,$hPenRED)
    _GDIPlus_GraphicsDrawLine($graphic,300,55,300,85,$hPenRED)
    $diff = TimerDiff($intime)
    GUICtrlSetData($verstrichen,Round($diff,0)&' ms')
    $art = GUICtrlRead($hCombo)
    $x = _jQuery_Move( $art , $diff ,0,250,$ms_max)
    _GDIPlus_GraphicsDrawLine($graphic,50+$x,60,50+$x,80)
    _GDIPlus_GraphicsDrawImage($graphic, $bitmap, 0, 50)

    [/autoit] [autoit][/autoit] [autoit]

    ; DrawChart
    $x_now = 250/$ms_max*$diff
    $bewegt = $x-$old_x
    _GDIPlus_GraphicsDrawLine($graphic2,50+$x_old,250-Round($bewegt_old*8,0),50+$x_now,250-Round($bewegt*8,0))
    $bewegt_old = $bewegt
    $x_old = $x_now
    $old_x = $x

    [/autoit] [autoit][/autoit] [autoit]

    WEnd
    _GDIPlus_GraphicsClear($buffer,0xFFFFFFFF)
    _GDIPlus_GraphicsDrawImage($graphic, $bitmap, 0, 50)
    _GDIPlus_GraphicsDrawLine($graphic,50,55,50,85,$hPenRED)
    _GDIPlus_GraphicsDrawLine($graphic,300,55,300,85,$hPenRED)
    _GDIPlus_GraphicsDrawLine($graphic,300,60,300,80)
    GUICtrlSetData($verstrichen,$ms_max&' ms')
    EndSwitch
    Sleep(5)
    WEnd

    [/autoit]

    JQuery_Move.au3

    Spoiler anzeigen
    [autoit]

    #include-once
    ; #FUNCTION# ====================================================================================================================
    ; Name...........: _jQuery_Move
    ; Description ...: Berechnet Bewegungen nach wählbaren Art, wie in jQuery
    ; Syntax.........: _jQuery_Move($art, $t, $b, $c, $d))
    ; Parameters ....: $art = Art der Bewegung:- easeSmooth
    ;- easeInQuad
    ;- easeOutQuad
    ;- easeInOutQuad
    ;- easeInCubic
    ;- easeOutCubic
    ;- easeInOutCubic
    ;- easeInQuart
    ;- easeOutQuart
    ;- easeInOutQuart
    ;- easeInQuint
    ;- easeOutQuint
    ;- easeInOutQuint
    ;- easeInSine
    ;- easeOutSine
    ;- easeInOutSine
    ;- easeInExpo
    ;- easeOutExpo
    ;- easeInOutExpo
    ;- easeInCirc
    ;- easeOutCirc
    ;- easeInOutCirc
    ;- easeInElastic
    ;- easeOutElastic
    ;- easeInOutElastic
    ;- easeInBack
    ;- easeOutBack
    ;- easeInOutBack
    ;- easeInBounce
    ;- easeOutBounce
    ;- easeInOutBounce
    ;$t = Aktuelle Zeit ( gemessen von beginn der Bewegung )
    ;$b = Sartwert ( Anfangswert der Bewegung )
    ;$c = Strecke ( Bewegte Strecke der Bewegung )
    ;$d = Dauer ( gesamte Zeit der Bewegung )
    ; Return values .: Erfolg - Gibt die aktuelle Position der Bewegung zurück
    ; Fehler - Gibt -1 zurück und setzt @error auf 1 = Fehler in den Übergabeparametern
    ; Author ........: chrisatack ( C. Schiffer ) schiffer-soft.de
    ; Remarks .......: /
    ; THX ...........: Danke an http://gsgd.co.uk/sandbox/jquery/easing/
    ; ===============================================================================================================================
    Func _jQuery_Move($art, $t, $b, $c, $d)
    If Not $art <> '' And $t >-1 And $d > 0 Then
    SetError(1)
    Return -1
    EndIf
    If $t>$d Then Return $c
    Local $PI = 3.14159265358979
    Switch $art
    ;### easeSmooth ###
    Case 'easeSmooth'
    return ($t/$d)*($c-$b)

    [/autoit] [autoit][/autoit] [autoit]

    ;### easeQuad ###
    Case 'easeInQuad'
    $t/=$d
    Return $c*$t*$t+$b
    Case 'easeOutQuad'
    $t/=$d
    Return -$c*$t*($t-2)+$b
    Case 'easeInOutQuad'
    $t /= $d/2
    if $t < 1 Then
    return $c/2*$t*$t + $b;
    Else
    $t -= 1
    return -$c/2*(($t)*($t-2) -1 )+ $b;
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    ;### easeCubic ###
    Case 'easeInCubic'
    $t/=$d
    Return $c*$t*$t*$t+$b
    Case 'easeOutCubic'
    $t=$t/$d-1
    Return $c*($t*$t*$t+1)+$b
    Case 'easeInOutCubic'
    $t /= $d/2
    if $t < 1 Then
    return $c/2*$t*$t*$t + $b;
    Else
    $t -= 2
    return $c/2*($t*$t*$t + 2 )+ $b;
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    ;### easeQuart ###
    Case 'easeInQuart'
    $t/=$d
    Return $c*$t*$t*$t*$t+$b
    Case 'easeOutQuart'
    $t=$t/$d-1
    Return -$c*($t*$t*$t*$t-1)+$b
    Case 'easeInOutQuart'
    $t /= $d/2
    if $t < 1 Then
    return (($c-1)/2*$t*$t*$t*$t+$b)
    Else
    $t -= 2
    Return -1*($c-1)/2*($t*$t*$t*$t-2)+$b
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    ;### easeQuint ###
    Case 'easeInQuint'
    $t/=$d
    Return $c*$t*$t*$t*$t*$t+$b
    Case 'easeOutQuint'
    $t=$t/$d-1
    Return $c*($t*$t*$t*$t*$t+1)+$b
    Case 'easeInOutQuint'
    $t /= $d/2
    if $t < 1 Then
    return $c/2*$t*$t*$t*$t*$t + $b
    Else
    $t -= 2
    Return $c/2*($t*$t*$t*$t*$t+2)+$b
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    ;### easeSine ###
    Case 'easeInSine'
    Return -$c*cos($t/$d*($PI/2))+$c+$b
    Case 'easeOutSine'
    Return $c*sin($t/$d*($PI/2))+$b
    Case 'easeInOutSine'
    Return -$c/2 * (cos($PI*$t/$d) - 1) + $b

    [/autoit] [autoit][/autoit] [autoit]

    ;### easeExpo ###
    Case 'easeInExpo'
    If $t=0 Then
    Return $b
    Else
    Return $c*(2^(10*($t/$d-1)))+$b
    EndIf
    Case 'easeOutExpo'
    If $t=$d Then
    Return $b+$c
    Else
    Return $c*(-(2^(-10*$t/$d))+1)+$b
    EndIf
    Case 'easeInOutExpo'
    If $t=0 Then Return $b
    If $t=$d Then Return $b+$c
    $t/=$d/2
    If $t<1 Then Return $c/2*(2^(10 *($t-1)))+$b
    $t -= 1
    Return $c/2*(-(2^(-10*$t))+2)+$b

    [/autoit] [autoit][/autoit] [autoit]

    ;### easeCirc ###
    Case 'easeInCirc'
    $t/=$d
    Return -$c*(Sqrt(1-$t*$t)-1)+$b
    Case 'easeOutCirc'
    $t=$t/$d-1
    Return $c*Sqrt(1-$t*$t)+$b
    Case 'easeInOutCirc'
    Local $s=1.70158
    Local $p=0
    Local $a=$c
    If $t = 0 Then Return $b
    $t/=$d/2
    If $t = 2 Then Return $b+$c
    If $p=0 Then $p=$d*(.3*1.5)
    If $a < Abs($c) Then
    $a=$c
    Local $s=$p/4
    Else
    Local $s=$p/(2*$PI)*ASin($c/$a)
    EndIf
    If $t < 1 Then
    $t-=1
    Return -.5*($a*(2^(10*$t))*Sin(($t*$d-$s)*(2*$PI)/$p))+$b
    EndIf
    $t-=1
    Return $a*(2^(-10*$t))*Sin(($t*$d-$s)*(2*$PI)/$p)*.5+$c+$b

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;### easeElastic ###
    Case 'easeInElastic'
    Local $s=1.70158
    Local $p=0
    Local $a=$c
    If $t=0 Then Return $b
    $t/=$d
    If $t=1 Then Return $b+$c
    If Not $p Then $p=$d*.3
    If $a<Abs($c) Then
    $a=$c
    $s=$p/4
    Else
    $s=$p/(2*$PI)*ASin($c/$a)
    EndIf
    $t-=1
    Return -($a*(2^(10*$t))*sin(($t*$d-$s)*(2*$PI)/$p))+$b
    Case 'easeOutElastic'
    Local $s=1.70158
    Local $p=0
    Local $a=$c
    If $t=0 Then Return $b
    $t/=$d
    If $t=1 Then Return $b+$c
    If Not $p Then $p=$d*.3
    If $a<Abs($c) Then
    $a=$c
    $s=$p/4
    Else
    $s=$p/(2*$PI)*ASin($c/$a)
    EndIf
    Return $a*(2^(-10*$t))*sin(($t*$d-$s)*(2*$PI)/$p)+$c+$b
    Case 'easeInOutElastic'
    Local $s=1.70158
    Local $p=0
    Local $a=$c
    If $t=0 Then Return $b
    $t/=$d/2
    If $t=2 Then Return $b+$c
    If Not $p Then $p=$d*(.3*1.5)
    If $a<Abs($c) Then
    $a=$c
    $s=$p/4
    else
    $s=$p/(2*$PI)*ASin($c/$a)
    EndIf
    If $t<1 Then
    $t-=1
    Return -.5*($a*(2^(10*$t))*sin(($t*$d-$s)*(2*$PI)/$p))+$b
    EndIf
    $t-=1
    Return $a*(2^(-10*$t))*sin(($t*$d-$s)*(2*$PI)/$p)*.5+$c+$b

    [/autoit] [autoit][/autoit] [autoit]

    ;### easeBack ###
    Case 'easeInBack'
    If Not IsDeclared('s') Then $s = 1.70158
    $t/=$d
    Return $c*$t*$t*(($s+1)*$t-$s)+$b
    Case 'easeOutBack'
    If Not IsDeclared('s') Then $s = 1.70158
    $t=$t/$d-1
    Return $c*($t*$t*(($s+1)*$t+$s)+1)+$b
    Case 'easeInOutBack'
    If Not IsDeclared('s') Then $s = 1.70158
    $t/=$d/2
    $s*=1.525
    If $t<1 Then Return $c/2*($t*$t*(($s+1)*$t-$s))+$b
    $s*=1.525
    $t-=2
    return $c/2*($t*$t*(($s+1)*$t+$s)+2)+$b

    [/autoit] [autoit][/autoit] [autoit]

    ;### easeOutBounce ###
    Case 'easeInBounce'
    return $c - _jQuery_Move('easeOutBounce',$d-$t,0,$c,$d)+$b;
    Case 'easeOutBounce'
    $t/=$d
    If $t<(1/2.75) Then
    Return $c*(7.5625*$t*$t)+$b
    ElseIf $t<(2/2.75) Then
    $t-=(1.5/2.75)
    Return $c*(7.5625*$t*$t+.75)+$b
    ElseIf $t < (2.5/2.75) Then
    $t-=(2.25/2.75)
    Return $c*(7.5625*$t*$t+.9375)+$b
    Else
    $t-=(2.625/2.75)
    Return $c*(7.5625*$t*$t+.984375)+$b
    EndIf
    Case 'easeInOutBounce'
    If $t<($d/2) Then Return _jQuery_Move('easeInBounce',$t*2,0,$c,$d)*.5+$b
    Return _jQuery_Move('easeOutBounce',$t*2-$d,0,$c,$d)*.5+$c*.5+$b
    EndSwitch
    ;wenn nichts dann smooth
    return ($t/$d)*($c-$b)
    EndFunc

    [/autoit]

    Kleine Voransichten der Charts:

    Spoiler anzeigen


    easeInOutBounce
    [Blockierte Grafik: http://img705.imageshack.us/img705/919/bild002.png]

    easeInOutElastic
    [Blockierte Grafik: http://img15.imageshack.us/img15/1472/bild003w.png]

    easeInOutBack
    [Blockierte Grafik: http://img835.imageshack.us/img835/5765/bild004.png] 
    und noch 27 weitere...

    MFG Chris :D