Verfasst: 11.10.2006 23:32
Ahoi Agent.
Hierfür eignen sich parametrisierte Kurven. Das ist nicht Schlimmes, sondern Folgendes:
Du nutzt eine Variable t, die einfacherweise von 0 nach 1 rennt.
Zu jedem 'Zeitpunkt' t dazwischen berechnest du die aktuelle Position (cx, cy) zwischen Start (sx, sy) und Ziel (zx,zy).
Z.B. so:
Setze mal t=0 und t=1 ein, dann siehst du was passiert. Allgemein nennt sich das Geradengleichung in Parameterform.
Je nachdem, ob du dein t nun linear von 0 bis 1 laufen lässt, oder aber anders gestaucht, gestreckt, kannst du hierdurch andere Bewegungsabläufe erzeugen. z.B. durch:
wird die Bewegung erst langsam, und dann schneller sein. (Beachte: für t in [0,1] bleibt t^2 in [0,1] !)
Durch die Formel um die cx/cy zu berechnen kannst du außerdem einen anderen Weg, als den direkten nutzen. Z.B. führt folgendes:
über einen bogenförmigen Weg (setze wieder mal t=0 und t=1 ein, das liefert wieder Start- bzw. Zielpunkt. Dazwischen wird cx über Sinus und cy über 1-Cosinus interpoliert.)
Hier ein Beispiel, das verschiedene Bewegungsabläufe mit den beiden genannten Wegen kombiniert:
Generell kannst du da mit der Funktion für t den Geschwindigkeitsverlauf kontrollieren (Hier eignen sich einfacherweise alle Funktionen, die von [0,1] nach [0,1] abbilden, wie z.B. t^2 oder Sqr(t) oder der modifizierte Sinus)
und mit der Funktion um aus t die cx und cy zu berechnen, den Weg verändern.
Viel Spaß beim rumprobieren!
Hierfür eignen sich parametrisierte Kurven. Das ist nicht Schlimmes, sondern Folgendes:
Du nutzt eine Variable t, die einfacherweise von 0 nach 1 rennt.
Zu jedem 'Zeitpunkt' t dazwischen berechnest du die aktuelle Position (cx, cy) zwischen Start (sx, sy) und Ziel (zx,zy).
Z.B. so:
Code: Alles auswählen
cx = sx + t * (zx-sx)
cy = sy + t * (zy-sy)
Je nachdem, ob du dein t nun linear von 0 bis 1 laufen lässt, oder aber anders gestaucht, gestreckt, kannst du hierdurch andere Bewegungsabläufe erzeugen. z.B. durch:
Code: Alles auswählen
t = t*t
Durch die Formel um die cx/cy zu berechnen kannst du außerdem einen anderen Weg, als den direkten nutzen. Z.B. führt folgendes:
Code: Alles auswählen
cx = sx + Sin(t*#Pi/2) * (zx-sx)
cy = sy + (1-Cos(t*#Pi/2)) * (zy-sy)
Hier ein Beispiel, das verschiedene Bewegungsabläufe mit den beiden genannten Wegen kombiniert:
Code: Alles auswählen
; 11.10.06 by Froggerprogger
sx.f = 600
sy.f = 600
zx.f = 400
zy.f = 200
t.f = 0
Procedure Display(cx, cy)
ClearScreen(0)
StartDrawing(ScreenOutput())
Circle(cx, cy, 35, RGB(255,0,0))
StopDrawing()
FlipBuffers()
EndProcedure
InitSprite()
OpenWindow(0,0,0,600,400,"Bewegungs-Tests")
OpenWindowedScreen(WindowID(0), 0, 0, 1024, 768, 1, 0, 0)
For run=0 To 2
Display(sx, sy) : Delay(1000)
For i=0 To 100
t = i/100.0
Select run
Case 0 :
; Bewegungsablauf
;t = t ; lineare Bewegung
;t = Sqr(t) ; erst schnell, dann langsam
t = t*t ; erst langsam, dann schnell
; direkter Weg
cx = sx + t * (zx-sx)
cy = sy + t * (zy-sy)
Case 1 :
; Bewegungsablauf
t = 0.5 + Sin(t*#Pi-#Pi/2)/2 ; langsam -> schneller -> langsam
; direkter Weg
cx = sx + t * (zx-sx)
cy = sy + t * (zy-sy)
Case 2 :
; Bewegungsablauf
t = 0.5 + Sin(t*#Pi-#Pi/2)/2
; bogenförmiger Weg
cx = sx + Sin(t*#Pi/2) * (zx-sx)
cy = sy + (1-Cos(t*#Pi/2)) * (zy-sy)
EndSelect
Display(cx, cy)
While WindowEvent()
Wend
Delay(10)
Next
Display(zx, zy) : Delay(1000)
Next
und mit der Funktion um aus t die cx und cy zu berechnen, den Weg verändern.
Viel Spaß beim rumprobieren!