Aus Das deutschsprachige Scratch-Wiki

(Weitergeleitet von Schwerkraft)

Schwerkraft bedeutet zum Beispiel, dass eine Figur von oben auf den Boden fallen kann, außer, wenn ein Hindernis im Weg ist. Diese Funktionen braucht man oft bei Jump'n'Run-Games.

Wie kann man Schwerkraft simulieren?

Es gibt viele Möglichkeiten, Schwerkraft zu simulieren. In diesem Wiki-Eintrag werden mehrere Lösungen beschrieben, geordnet von einfach bis größere Realitätsnähe.

Möglichkeit 1

Hier seht ihr einen Block aus dem ScrollingDemo-Beispielprojekt:

Wenn die grüne flagge angeklickt
wiederhole fortlaufend
falls <nicht <wird Farbe [#00ff00] berührt?>>, dann // Hindernis wird berührt
ändere y um (-5)
end
falls <wird Farbe [#00ff00] berührt?>, dann // Hindernis wird nicht berührt
ändere y um (5)
end
end

Der "ändere y um 5"-Block bewirkt, dass sich die Figur nach oben bewegt. Dieser Part wird NUR bei Scrolling-Programmen gebraucht, damit sich die Figur nach oben bewegen kann.

Der "ändere y um -5"-Block bewirkt, dass sich die Figur nach unten bewegt, falls Farbe grün nicht berührt wird, also wenn kein Hindernis im Weg steht.

Möglichkeit 2

Diese Möglichkeit sieht der Realität ähnlicher, weil die Figur immer schneller wird, bis sie den Boden, beziehungsweise das Hindernis, erreicht.

Wenn die grüne flagge angeklickt
setze [speedY v] auf (-5)
wiederhole fortlaufend
falls <nicht <wird Farbe [#00ff00] berührt?>>, dann // Hindernis wird berührt
ändere [SpeedY v] um (-0.1)
end
falls <wird Farbe [#00ff00] berührt?>, dann // Hindernis wird nicht berührt
setze [SpeedY v] auf (0)
end
ändere y um (SpeedY)
end

Die Variable "speedY" gibt an, wie schnell sich die Figur nach unten bewegen soll. Falls kein Hindernis berührt wird, soll die Figur immer schneller werden - deswegen verkleinert man den Wert von "speedY". Je kleiner die Zahl (-0.1), desto schneller wird sich die Figur nach unten bewegen. Falls nun ein Hindernis berührt wird, soll der Prozess gestoppt werden. Deshalb setzt man "speedY" auf "0".

Möglichkeit 3

Bei hoher Fallgeschwindigkeit kann es hier aber passieren, dass die Figur mit obigem Skript im Boden "steckenbleibt". Dies kann mit folgendem Code verhindert werden:

Wenn die grüne flagge angeklickt
setze [speedY v] auf (0)
wiederhole fortlaufend
ändere [SpeedY v] um (-0.1) //Schwerkraftbeschleunigung
ändere y um (SpeedY)
falls <wird Farbe [#00ff00] berührt?>, dann // wird Hindernis berührt?
ändere y um ((0)-(SpeedY)) //letzte Bewegung rückgängig machen
setze [SpeedY v] auf (0)
end
end

Schwerkraftsimulation mit Springen

Um die Figur realistisch springen zu lassen, reicht es aus, die Variable "speedY" auf einen positiven Wert zu setzen. Die Variable "readyforjump" verhindert, dass die Figur in der Luft nochmal springen kann.

Wenn die grüne flagge angeklickt
setze [speedY v] auf (0)
wiederhole fortlaufend
ändere [SpeedY v] um (-0.1) //Schwerkraftbeschleunigung
ändere y um (SpeedY)
falls <wird Farbe [#00ff00] berührt?>, dann // wird Hindernis berührt?
ändere y um ((0)-(SpeedY)) //letzte Bewegung rückgängig machen
setze [SpeedY v] auf (0)
falls <<(readyforjump) > (0)> und <Taste [Pfeil nach oben v] gedrückt?>>, dann
setze [SpeedY v] auf (6) //je höher der Wert desto höher springt die Figur
setze [readyforjump v] auf (0)
sonst
ändere y um [-1]
falls <wird Farbe [#00ff00] berührt?>, dann
setze [readyforjump v] auf (1)
end
ändere y um [1]
end

Wie hoch wird der Sprung? Das hängt von den Werten für die Schwerkraftbeschleunigung (ay, -0.1 in obigem Skript) und der Startgeschwindigkeit (vy, 6 in obigem Skript). Die nachfolgende Tabelle gibt die Sprunghöhe für verschiedene Werte von ay und vy an.

vy/ay 0 -0.1 -0.2 -0.3 -0.4 -0.5 -0.6 -0.7 -0.8 -0.9 -1.0
0 0 0 0 0 0 0 0 0 0 0 0
0.2 0 0 0 0 0 0 0 0 0 0
0.4 1 0 0 0 0 0 0 0 0 0
0.6 2 1 0 0 0 0 0 0 0 0
0.8 3 1 1 0 0 0 0 0 0 0
1.0 5 2 1 1 1 0 0 0 0 0
1.2 7 3 2 1 1 1 1 0 0 0
1.4 9 4 3 2 1 1 1 1 1 0
1.6 12 6 3 2 2 1 1 1 1 1
1.8 15 7 4 3 2 2 1 1 1 1
2.0 19 9 6 4 3 2 2 2 1 1
2.2 23 11 7 5 4 3 2 2 2 1
2.4 28 13 8 6 5 4 3 2 2 2
2.6 32 16 10 7 6 4 4 3 3 2
2.8 38 18 12 8 7 5 4 4 3 3
3.0 43 21 14 10 8 6 5 4 4 3
3.2 50 24 16 11 9 7 6 5 4 4
3.4 56 27 18 13 10 8 7 6 5 4
3.6 63 31 20 14 11 9 8 6 5 5
3.8 70 34 22 16 13 10 9 7 6 5
4.0 78 38 25 18 14 11 10 8 7 6
4.2 86 42 27 20 16 13 11 9 8 7
4.4 95 46 30 22 17 14 12 10 9 8
4.6 104 51 33 24 19 15 13 11 10 8
4.8 113 55 36 26 21 17 14 12 11 9
5.0 123 60 39 29 23 18 15 13 12 10
5.2 133 65 43 31 25 20 17 14 13 11
5.4 143 70 46 34 27 22 18 16 14 12
5.6 154 76 50 36 29 23 20 17 15 13
5.8 165 81 53 39 31 25 21 18 16 14
6.0 177 87 57 42 33 27 23 20 17 15
6.2 189 93 61 45 35 29 24 21 18 16
6.4 202 99 65 48 38 31 26 22 20 17
6.6 215 106 69 51 40 33 28 24 21 19
6.8 228 112 74 54 43 35 30 26 22 20
7.0 242 119 78 58 46 37 32 27 24 21
7.2 256 126 83 61 48 40 34 29 25 22
7.4 270 133 88 65 51 42 36 31 27 24
7.6 285 141 93 68 54 44 38 32 28 25
7.8 300 148 98 72 57 47 40 34 30 27
8.0 316 156 103 76 60 49 42 36 32 28
8.2 332 164 108 80 63 52 44 38 33 30
8.4 349 172 113 84 66 55 46 40 35 31
8.6 366 181 119 88 70 57 49 42 37 33
8.8 383 189 125 92 73 60 51 44 39 34
9.0 401 198 131 97 77 63 53 46 40 36
9.2 419 207 136 101 80 66 56 48 42 38
9.4 437 216 143 106 84 69 58 51 44 40
9.6 456 226 149 110 87 72 61 53 46 41
9.8 475 235 155 115 91 75 64 55 48 43
10.0 495 245 162 120 95 78 66 58 51 45


In unserem Fall wird der Sprung 177 Pixel hoch, das entspricht knapp der halben Bildschirmhöhe von Scratch. Die Ergebnisse der Tabelle wurden auf ganz Zahlen gerundet.

Die Tabelle kann auch verwendet werden um den Startwert für eine gewünschte Sprunghöhe zu wählen. Um zum Beispiel den Sprung bei gleichbleibender Schwerkraftbeschlaunigung auf eine Höhe von 100 Pixeln einzustellen wäre ein Wert zwischen 4.4 und 4.6 für die Anfangsgeschwindigkeit zu wählen - mit 4.5 käme man also ziemlich gut hin!

Mit der Kombination -0.2 / 6.4 kommt man ebenfalls auf 100 Pixel Sprunghöhe. Im Unterschied zur -0.1 / 4.5 Variante wird der Sprung aber doppelt so schnell ausgeführt.

Springen mit Zurückprallen

Durch eine kleine Erweiterung des letzten Skripts kann ein Zurückprallen vom Boden bzw. anderen Objekten simuliert werden. Dazu ist statt einer Null eine Formel für die Zurückprallgeschwindigkeit einzutragen:

Wenn die grüne flagge angeklickt
setze [speedY v] auf (0)
wiederhole fortlaufend
ändere [SpeedY v] um (-0.1) //Schwerkraftbeschleunigung
ändere y um (SpeedY)
falls <wird Farbe [#00ff00] berührt?>, dann // wird Hindernis berührt?
ändere y um ((0)-(SpeedY)) //letzte Bewegung rückgängig machen
setze [SpeedY v] auf ((((SpeedY)*(10))gerundet)/(-20)) //Formel für Zurückprallen
falls <<(readyforjump) > (0)> und <Taste (Pfeil nach oben v) gedrückt?>>, dann
setze [SpeedY v] auf (6) //je höher der Wert desto höher springt die Figur
end
setze [readyforjump v] auf (1)
sonst
setze [readyforjump v] auf (0)
end
end

Das Runden bewirkt hier, dass bei kleinen Geschwindigkeiten der Wert auf 0 abgerundet wird, das heißt das Springen hört wieder auf. Der Wert von -20 bewirkt ein Halbieren und Umdrehen der ursprünglichen Geschwindigkeit. Ein erneutes Springen ist erst möglich, nachdem die Figur wieder zur Ruhe gekommen ist.



Code zum Einbinden ins Forum:
[wiki=de:Schwerkraft und Springen]Schwerkraft und Springen[/wiki]
Cookies helfen uns bei der Bereitstellung von Das deutschsprachige Scratch-Wiki. Durch die Nutzung von Das deutschsprachige Scratch-Wiki erklärst du dich damit einverstanden, dass wir Cookies speichern.