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
#include <GUIConstants.au3>
#include <GDIPlus.au3>
#include <ComboConstants.au3>
#include <StaticConstants.au3>
#include 'jQuery_Move.au3'
$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()
$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
; 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)
$intime = TimerInit()
$ms_max = GUICtrlRead($hInput_ms)
While TimerDiff($intime) < $ms_max
; 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)
; 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
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
JQuery_Move.au3
Spoiler anzeigen
#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)
;### 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
;### 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
;### 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
;### 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
;### 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
;### 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
;### 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
;### 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
;### 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
;### 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
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 ![]()