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.
[wiki=de:Schwerkraft und Springen]Schwerkraft und Springen[/wiki]