Wir nutzen Cookies, um das allgemeine Benutzerelebnis zu verbessern. Mit der Nutzung unseres Wikis stimmst du der Nutzung von Cookies zu.

Bewegung von Objekten animieren

Da man in Scratch normalerweise nur stillstehende Objekte benützt, können viele Scratcher mit der Bewgungsfunktion nicht viel anfangen. Besonders, wenn es um durchlaufende Animationen geht. Doch gerade für Anfänger ist es wichtig sich damit auseinanderzusetzen. Normalerweise schreibt man als Anfänger einfach 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 Beweung 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 glide with speed (speed) to x: (x) y: (y)
gleite in (([sqrt v] von ((((x) - (x-Position)) * ((x) - (x-Position))) + (((y) - (y-Position)) * ((y) - (y-Position))))) / (speed)) 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 glide with acceleration (a) to x: (x) y: (y)
setze [speed v] auf [0]
setze [totaldist v] auf ([sqrt v] von ((((x) - (x-Position)) * ((x) - (x-Position))) + (((y) - (y-Position)) * ((y) - (y-Position)))))
wiederhole fortlaufend 
  setze [dist v] auf ([sqrt v] von ((((x) - (x-Position)) * ((x) - (x-Position))) + (((y) - (y-Position)) * ((y) - (y-Position)))))
  falls <(dist) > ((0.75) * (totaldist))> dann 
    ändere [speed v] um (a)
  sonst 
    falls <(dist) < ((0.25) * (totaldist))> dann 
      ändere [speed v] um (() - (a))
      falls <(speed) < [0.01]> dann 
        setze [speed v] auf [0.01]
      end
    end
  end
  falls <(speed) > (dist)> dann 
    gehe zu x: (x) y: (y)
    stoppe [dieses Skript v]
  end
  ändere x um (((speed) / (dist)) * ((x) - (x-Position)))
  ändere y um (((speed) / (dist)) * ((y) - (y-Position)))
end

Rollen

Runde Objekte wie Bälle oder Kugeln rollen, dies kann mit folgendem Skript erreicht werden:

Definiere roll to x: (x) y: (y) with radius (r) and speed (speed)
setze [dist v] auf ([sqrt v] von ((((x) - (x-Position)) * ((x) - (x-Position))) + (((y) - (y-Position)) * ((y) - (y-Position)))))
wiederhole bis <(dist) < ((speed) + (1))> 
  ändere x um (((speed) / (dist)) * ((x) - (x-Position)))
  ändere y um (((speed) / (dist)) * ((y) - (y-Position)))
  falls <((x) - (x-Position)) > [0]> dann 
    drehe dich nach rechts um (((speed) * (180)) / ((r) * (3.14159))) Grad
  sonst 
    drehe dich nach links um (((speed) * (180)) / ((r) * (3.14159))) Grad
  end
  setze [dist v] auf ([sqrt 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 (((dist) * (180)) / ((r) * (3.14159))) Grad
sonst 
  drehe dich nach links um (((dist) * (180)) / ((r) * (3.14159))) Grad
end


Beispielprojekt zu den verschiedenen Bewegungsarten



Schau' dir dieses Projekt auf der Scratch-Webseite an...