Hallo in die Runde!
Ich wollte hier mal ein Thema diskutieren, was mich jetzt noch nicht gleich betrifft, aber bei meinem 3. Spiel (es soll dann ein Jump´n Run werden)!
Der perfekt animierte Sprung im Laufen und Stehen in Assembler.
Eins ist wohl schon klar, es wird eine gute Näherung sein müssen und man wird es nicht berechnen, sondern man wird eine Wertetabelle brauchen für die Zuordnung der Sprungbewegung.
Dennoch möchte ich hier mal gerne die physikalischen Grundlagen erörtern und bin dann schon sehr gespannt auf Eure Lösungen und Erfahrungen.
Physik:
Wir beschäftigen uns hier also mit dem vertikalen und schrägen Wurf! Mehrere Parameter sind dabei bekannt bzw. müssen berücksichtigt werden: Die Anfangsgeschwindigkeit des Sprunges nach oben, der Winkel des Absprunges, die Geschwindigkeit nach vorne und die Gravitation bzw. die Erdbeschleunigung. Betrachten wir gleich noch zusätzlich die Höhe des Absprunges (also wenn der Player von einer höheren Position nach unten springt - bei gleicher Höhe wird der Wert dann 0).
Wir haben also zunächst eine Anfangsgeschwindigkeit V0. Diese Geschwindigkeit teilt sich in zwei Richtungen auf (in x und in y-Richtung) also mathematisch in: V0 = Wurzel (VX Quadrat + VY Quadrat). Für die Anfangsgeschwindigkeit in x-Richtung ergibt das dann: V0,x=V0 x cos Alpha und in y-Richtung: V0,y=V0 * sin Alpha.
In x-Richtung haben wir eine gleichmäßige Bewegung: x = V0 * cos Alpha * t (t ist die Zeit).
In y-Richtung haben wir durch die Erdbeschleunigung eine gleichmäßig beschleunigte Bewegung: y = h0 - g/2 * t Quadrat + V0 x sin Alpha x t - h0 ist dabei die Anfangshöhe und g die Erdbeschleunigung.
Wenn man nun die 2. Gleichung nach t umstellt und in die erste Gleichung t dadurch ersetzt, bekommt man die erwünschte Bahngleichung:
y(x) = h0 - g/(2 * V0 Quadrat * (cos Alpha) Quadrat) * x Quadrat + x * tan Alpha
Mit dieser Formel kann man jetzt alle Werte für den Sprung ausrechnen. Die werte werden sicherlich schön krumm sein und da muss man da wohl für sich und sein Programm die beste Näherung bzw. Rundung finden...
Jump´n Run Sprung
Moderator: Rockford
- Dr. Irata
- Beiträge: 1100
- Registriert: 24.08.2021 14:40
- Has thanked: 156 times
- Been thanked: 339 times
- Kontaktdaten:
Re: Jump´n Run Sprung
Folgende Näherung fällt mir da jetzt gleich ein:
Zunächst mal bei einem Sprung vom Boden hoch und zurück auf den Boden fällt h0 komplett weg.
Für g (9,81m/sec2) nehmen wir mal direkt 10.
Nimmt man 45 Grad (Alpha) ist ja cos 45 Quadrat = 0,5 und tan 45 = 1
Bleibt also: y(x) = x - 10 / v0 Quadrat * x Quadrat
Man könnte jetzt noch eine schöne Laufgeschwindigkeit von 4,5 m/s - entspricht etwa 16 km/h annehmen - dann bleicht am Ende: y(x) = x - 0,5 * x * x - also eine umgekehrte Parabel!
Die Flugbahn dazu:
Zunächst mal bei einem Sprung vom Boden hoch und zurück auf den Boden fällt h0 komplett weg.
Für g (9,81m/sec2) nehmen wir mal direkt 10.
Nimmt man 45 Grad (Alpha) ist ja cos 45 Quadrat = 0,5 und tan 45 = 1
Bleibt also: y(x) = x - 10 / v0 Quadrat * x Quadrat
Man könnte jetzt noch eine schöne Laufgeschwindigkeit von 4,5 m/s - entspricht etwa 16 km/h annehmen - dann bleicht am Ende: y(x) = x - 0,5 * x * x - also eine umgekehrte Parabel!
Die Flugbahn dazu:
Online
- Kveldulfur
- Beiträge: 887
- Registriert: 17.08.2021 02:32
- Has thanked: 380 times
- Been thanked: 317 times
- Kontaktdaten:
Re: Jump´n Run Sprung
Hallo!
Ich hatte zwar schon mit Peter (per Whatsapp) das Thema angesprochen, möchte aber hier gerne noch einmal meine Überlegungen Kund tun.
Bei meinem Jump'n Run habe ich nicht überlegt, wie evtl. der Sprung physikalisch korrekt wäre, sondern welche Bedingungen er zu erfüllen hat.
Ich nutze Zeichensatzgrafik in 5 Farben für mein Spiel, wodurch ein Zeichen 4 Pixel breit ist und 8 Pixel hoch. Zwei Zeichen in der Breite ergeben zudem die Breite eines Players.
Soll meine Figur von einer Plattform auf die andere Springen können, so muss diese 2 Zeichen hoch springen können, was 16 Pixel ergeben.
Da die Figur 2 Zeichen breit ist und der Abstand meiner Plattformen 2-3 Zeichen betragen, sollte die Figur 5 Zeichen weit springen können, was umgerechnet 20 Pixel sind.
Eine weitere Bedingung ist es, über Gegner springen zu können:
Da man i.d.R. recht nah am Gegner steht, bevor man springt, sollte also die Sprungkurve schnell steil ansteigen, dann möglichst lange oben bleiben und dann wieder zum Boden zurück führen.
Ein wenig Realismus soll erhalten bleiben, so dass man die Parameter, schneller Anstieg, der langsamer wird, zum Wendepunkt führt und dann wieder zurück zum Boden beschleunigt, einhalten sollte.
Ich habe 20 Pixel = 20 Schritte für den Sprung, wobei man bei der Hälfte zum Abstieg kommt. Somit 10 Schritte Aufstieg und 10 Schritte Abstieg.
Da mein Gegner ebenfalls 8 Pixel breit und tlw. 16 Pixel hoch ist und man auch etwas Platz für den Sprung benötigt, sollte man den Gegner möglichst schnell überstiegen haben.
Für mich ergaben sich daher folgende Werte:
04 04 04 02 02 01 01 01 01 00 00 01 01 01 01 02 02 04 04 04
5 Schritte braucht es, um gleichauf zu sein, dann folgen 10 Schritte in Sicherheit bevor man ggf. wieder den Gegner berühren kann, da man zu früh gesprungen ist.
Ich weiß nicht, wie andere den Sprung bei sich einprogrammieren, aber da jeder Sprung eine andere Aufgabe hat, wird der Ansatz sicherlich auch ständig ein Anderer sein.
Grüße
Janko
Ich hatte zwar schon mit Peter (per Whatsapp) das Thema angesprochen, möchte aber hier gerne noch einmal meine Überlegungen Kund tun.
Bei meinem Jump'n Run habe ich nicht überlegt, wie evtl. der Sprung physikalisch korrekt wäre, sondern welche Bedingungen er zu erfüllen hat.
Ich nutze Zeichensatzgrafik in 5 Farben für mein Spiel, wodurch ein Zeichen 4 Pixel breit ist und 8 Pixel hoch. Zwei Zeichen in der Breite ergeben zudem die Breite eines Players.
Soll meine Figur von einer Plattform auf die andere Springen können, so muss diese 2 Zeichen hoch springen können, was 16 Pixel ergeben.
Da die Figur 2 Zeichen breit ist und der Abstand meiner Plattformen 2-3 Zeichen betragen, sollte die Figur 5 Zeichen weit springen können, was umgerechnet 20 Pixel sind.
Eine weitere Bedingung ist es, über Gegner springen zu können:
Da man i.d.R. recht nah am Gegner steht, bevor man springt, sollte also die Sprungkurve schnell steil ansteigen, dann möglichst lange oben bleiben und dann wieder zum Boden zurück führen.
Ein wenig Realismus soll erhalten bleiben, so dass man die Parameter, schneller Anstieg, der langsamer wird, zum Wendepunkt führt und dann wieder zurück zum Boden beschleunigt, einhalten sollte.
Ich habe 20 Pixel = 20 Schritte für den Sprung, wobei man bei der Hälfte zum Abstieg kommt. Somit 10 Schritte Aufstieg und 10 Schritte Abstieg.
Da mein Gegner ebenfalls 8 Pixel breit und tlw. 16 Pixel hoch ist und man auch etwas Platz für den Sprung benötigt, sollte man den Gegner möglichst schnell überstiegen haben.
Für mich ergaben sich daher folgende Werte:
04 04 04 02 02 01 01 01 01 00 00 01 01 01 01 02 02 04 04 04
5 Schritte braucht es, um gleichauf zu sein, dann folgen 10 Schritte in Sicherheit bevor man ggf. wieder den Gegner berühren kann, da man zu früh gesprungen ist.
Ich weiß nicht, wie andere den Sprung bei sich einprogrammieren, aber da jeder Sprung eine andere Aufgabe hat, wird der Ansatz sicherlich auch ständig ein Anderer sein.
Grüße
Janko
Meine Projekte findest Du hier...
- LarsImNetz
- Beiträge: 190
- Registriert: 24.08.2021 18:27
- Has thanked: 166 times
- Been thanked: 103 times
- Kontaktdaten:
Re: Jump´n Run Sprung
Hallo Janko,
ich habe es ähnlich implementiert bei Night Knight. Müsste es aber noch mal bearbeiten, der Dude springt mir noch etwas zu steif.
Der Dude stirbt nicht, wenn er von ganz oben runterspringt.
LG
Lars
ich habe es ähnlich implementiert bei Night Knight. Müsste es aber noch mal bearbeiten, der Dude springt mir noch etwas zu steif.
Code: Alles auswählen
; TODO: Jumptable anpassen, das nicht zuu gleichmaessig gesprungen wird
@jump_table
.byte -4,-4,-4,-4,-4,-4,-4,-4,0,0 ; jump up
.byte 4,4,4,4,4,4,4,4 ; jump down
.byte 4,4,4,4,4,4,4,4,4,4
.byte 4,4,4,4,4,4,4,4,4,4
.byte 4,4,4,4,4,4,4,4,4,4,4,4
.byte 127 ; end mark
LG
Lars
Online
- Kveldulfur
- Beiträge: 887
- Registriert: 17.08.2021 02:32
- Has thanked: 380 times
- Been thanked: 317 times
- Kontaktdaten:
Re: Jump´n Run Sprung
Hallo Lars!
Vielen Dank für die Inspiration
Ich hatte meine "Sprung"-Routine in 2 Teile aufgeteilt.
Teil 1 mit SBC, damit meine Figur nach oben springt und nach 10 Schritten den Teil 2 mit ADC, damit die Figur wieder nach unten kommt.
Deine Tabelle nutzt negative und positive Zahlen und darüber habe ich dann nachgedacht... und ich habe verstanden
-4 werden als 252 interpretiert. Wenn ich also nun 100 + 252 rechne kommt 352 heraus, wobei ich nur 8 Bit haben und somit (352-256) 96 erhalten, was das selbe wie bei 100-4 ist.
Okay, dass werden die meisten Programmierer wissen, aber für mich war das wirklich ein super Anstoß darüber nachzudenken.
Nun ist meine Sprung-Routine viel kürzer und flexibler geworden
Danke
Janko
Vielen Dank für die Inspiration
Ich hatte meine "Sprung"-Routine in 2 Teile aufgeteilt.
Teil 1 mit SBC, damit meine Figur nach oben springt und nach 10 Schritten den Teil 2 mit ADC, damit die Figur wieder nach unten kommt.
Deine Tabelle nutzt negative und positive Zahlen und darüber habe ich dann nachgedacht... und ich habe verstanden
-4 werden als 252 interpretiert. Wenn ich also nun 100 + 252 rechne kommt 352 heraus, wobei ich nur 8 Bit haben und somit (352-256) 96 erhalten, was das selbe wie bei 100-4 ist.
Okay, dass werden die meisten Programmierer wissen, aber für mich war das wirklich ein super Anstoß darüber nachzudenken.
Nun ist meine Sprung-Routine viel kürzer und flexibler geworden
Danke
Janko
Meine Projekte findest Du hier...
Wer ist online?
Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast