Aus Das deutschsprachige Scratch-Wiki
In vielen Scratch-Projekten geht es darum eine Figur auf der Bühne zu bewegen. Dabei gibt es verschiedene Bewegungsarten, welche im folgenden Artikel vorgestellt werden.
Wenn man zum ersten Mal in Scratch programmiert, schreibt man als Anfänger*in oft folgenden Code:
gehe zu x: (100) y: (0)
um eine Figur an die Position x=100 und y=0 zu bewegen. Dabei wird die Figur aber sofort an die betreffende Stelle geschickt, d.h. sie "geht" nicht wirklich dahin sonder teleportiert sich eher.
Bewegung mit dem gleite-Befehl in konstanter Zeit
Der Gleite-Block erlaubt es den Weg zum Ziel in die Bewegung miteinzubeziehen, z.B.:
gleite in (1) Sek. zu x: (100) y: ()
Die Bewegung zum Ziel dauert hier allerdings unabhängig vom Ausgangspunkt immer genau eine Sekunde.
Bewegung mit dem gleite-Befehl mit konstanter Geschwindigkeit
Um eine Bewegung mit vorgegebener Geschwindigkeit zu erreichen, ist es notwendig die Zeit abhängig vom zurückzulegenden Weg auszurechnen:
Definiere gleite mit Geschwindigkeit (Geschwindigkeit) zu x: (x) y: (y) gleite in (([Wurzel v] von ((((x) - (x-Position)) * ((x) - (x-Position))) + (((y) - (y-Position)) * ((y) - (y-Position))))) / (Geschwindigkeit)) Sek. zu x: (x) y: (y)
Die Formel mit der Wurzel dient zum Berechnen der Distanz nach Pythagoras.
Bewegung mit dem gleite-Befehl mit konstanter Beschleunigung
Noch eleganter sieht es aus wenn man eine Beschleunigung einbaut:
Definiere gleite mit Beschleunigung (a) zu x: (x) y: (y) setze [Geschwindigkeit v] auf [0] setze [insgesamt Abstand v] auf ([Wurzel v] von ((((x) - (x-Position)) * ((x) - (x-Position))) + (((y) - (y-Position)) * ((y) - (y-Position))))) wiederhole fortlaufend setze [Abstand v] auf ([Wurzel v] von ((((x) - (x-Position)) * ((x) - (x-Position))) + (((y) - (y-Position)) * ((y) - (y-Position))))) falls <(Abstand :: variables) > ((0.75) * (insgesamt Abstand))>, dann ändere [Geschwindigkeit v] um (a) sonst falls <(Abstand :: variables) < ((0.25) * (insgesamt Abstand))>, dann ändere [Geschwindigkeit v] um ((-1) * (a)) falls <(Geschwindigkeit) < [0.01]>, dann setze [Geschwindigkeit v] auf [0.01] end end end falls <(Geschwindigkeit) > (Abstand :: variables)>, dann gehe zu x: (x) y: (y) stoppe [dieses Skript v] end ändere x um (((Geschwindigkeit) / (Abstand :: variables)) * ((x) - (x-Position))) ändere y um (((Geschwindigkeit) / (Abstand :: variables)) * ((y) - (y-Position))) end
Rollen
Runde Figuren wie Bälle oder Kugeln rollen, dies kann mit folgendem Skript erreicht werden:
Definiere roll to x: (x) y: (y) with radius (r) and Geschwindigkeit (Geschwindigkeit) setze [Abstand v] auf ([Wurzel v] von ((((x) - (x-Position)) * ((x) - (x-Position))) + (((y) - (y-Position)) * ((y) - (y-Position))))) wiederhole bis <(Abstand :: variables) < ((Geschwindigkeit) + (1))> ändere x um (((Geschwindigkeit) / (Abstand :: variables)) * ((x) - (x-Position))) ändere y um (((Geschwindigkeit) / (Abstand :: variables)) * ((y) - (y-Position))) falls <((x) - (x-Position)) > [0]>, dann drehe dich nach rechts um (((Geschwindigkeit) * (180)) / ((r) * (3.14159))) Grad sonst drehe dich nach links um (((Geschwindigkeit) * (180)) / ((r) * (3.14159))) Grad end setze [Abstand v] auf ([Wurzel v] von ((((x) - (x-Position)) * ((x) - (x-Position))) + (((y) - (y-Position)) * ((y) - (y-Position))))) end gehe zu x: (x) y: (y) falls <((x) - (x-Position)) > [0]>, dann drehe dich nach rechts um (((Abstand :: variables) * (180)) / ((r) * (3.14159))) Grad sonst drehe dich nach links um (((Abstand :: variables) * (180)) / ((r) * (3.14159))) Grad end
Beispielprojekt zu den verschiedenen Bewegungsarten
Zum Starten Leertaste drücken.
Schau' dir dieses Projekt auf der Scratch-Webseite an...
Die benutzerdefinierten Skripte oben kannst du in obigen Projekt finden um in deinem Projekt die das beschleunigte Gleiten und das Rollen zu verwenden.
Siehe auch
[wiki=de:Bewegung von Figuren animieren]Bewegung von Figuren animieren[/wiki]