 |
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Chewie Super JLI'ler
Anmeldedatum: 17.07.2003 Beiträge: 382
Medaillen: Keine
|
Verfasst am: 24.07.2003, 14:49 Titel: Sprungbewegung für nen Charakter |
|
|
Hi,
ich bin grad dabei als erstes Spiel einen Skate-Or-Die Klon zu schreiben, vielleicht kennt das noch wer, gabs damals auf dem alten Gameboy....
Jetzt bin ich auf mein erstes Problem gestossen, nämlich für den Skater einen ordentlichen Sprungalgorythmus zu schreiben. Die Theorie ist ja klar, ich hab einen JumpStep, den ich immer von der y-Position abziehe und in jedem Durchgang ein wenig reduziere. Was in der Praxis auch nicht schwer wäre, nur check ich nicht, wie ich in die Berechnung die Framerate miteinbeziehen soll, damit das überall gleich schell läuft.
ohne Anpassung an die Framerate, würde das z.B. so aussehen:
m_vPosition.y -= m_JumpStep;
m_JumpStep *= 0.8;
wie mache ich sowas jetzt mit der Framerate?? die erste Zeile is klar:
m_vPosition.y -= m_JumpStep / Framerate;
aber wie ich jetzt die Reduktion vom JumpStep machen soll, ist mir ein Rätsel...vielleicht kann mir da jemand ein paar Denkanstösse geben.
-chewie |
|
Nach oben |
|
 |
TheMillenium Dark JLI'ler
Anmeldedatum: 21.07.2002 Beiträge: 1427 Wohnort: World Medaillen: Keine
|
Verfasst am: 24.07.2003, 15:05 Titel: |
|
|
wie wär's damit?
Code: |
m_JumpStep /= Framerate; // diese Zeile aber nur einmal im gesamten Programmablauf ausführen
m_vPosition.y -= m_JumpStep;
m_JumpStep *= 0.8;
|
müsste eigentlich so funktionieren... _________________ The source of all power is in its destiny... |
|
Nach oben |
|
 |
Chewie Super JLI'ler
Anmeldedatum: 17.07.2003 Beiträge: 382
Medaillen: Keine
|
Verfasst am: 24.07.2003, 16:48 Titel: |
|
|
aber dann ist doch auch nicht gewährleistet, dass es auf alle systemen gleich schnell läuft, oder?
angenommen ich hab:
2 Systeme, auf einem 10 fps, am anderen 5 fps...
// init
JumpStep = 50;
JumpStep /= Framerate;
// bewegung
vPos.y -= JumpStep;
JumpStep *= 0.8;
bei 10fps (JumpStep initialisiert mit 5) wird dann der Skater um 22.3 pixel pro sekunde bewegt.
bei 5fps (JumpStep=10) aber um 33.6.
sollte man nicht auch die Framerate immer wieder neu abfragen? Die wird ja kaum über das ganze Spiel konstant bleiben wird... |
|
Nach oben |
|
 |
The Lord of Programming Living Legend

Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 24.07.2003, 18:10 Titel: |
|
|
Chewie hat Folgendes geschrieben: | sollte man nicht auch die Framerate immer wieder neu abfragen? Die wird ja kaum über das ganze Spiel konstant bleiben wird... |
Das kommt drauf an. Wenn die Systemvoraussetzungen für den PC zu groß sind oder er zu ausgelastet ist, wird sie kaum gleich bleiben; aber auf einem guten PC hat sie ja eigentlich den Sinn, die Frames unten zu halten. Deshalb heißt sie ja Frame"bremse". D.h. das die Framerate hier wohl konstant bleiben würde.
Ich würde die Berechnungen von der Framerate bzw. vom Zeichenvorgang unabhängig machen. D.h. man bestimmt mit der Framebremse die Anzahl der Berechnungen pro Sekunde. Der Rest der Zeit wird dann durch den Zeichenvorgang ausgefüllt. _________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
 |
Christian Rousselle Site Admin

Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 24.07.2003, 18:30 Titel: |
|
|
Berechne die Framerate wenigstens einmal pro Sekunde, am besten öfter. Du muss dann alle Werte und Faktoren pro Sekunde definieren und durch die Framerate teilen. Z.B.:
Er soll pro Sekunde 50 Einheiten springen, dann muss er sich pro Frame
50 Einheiten / Framerate bewegen.
y += 50 / Framerate.
Den Faktor für die Abnahme muss du dann auch pro Sekunde festlegen und dann auch durch die Framerate teilen.
Christian |
|
Nach oben |
|
 |
Michael JLI'ler
Anmeldedatum: 20.07.2002 Beiträge: 173 Wohnort: Münster / NRW Medaillen: Keine
|
Verfasst am: 24.07.2003, 18:44 Titel: |
|
|
Also du hast schonmal ein grundsätzliches Problem. Wenn ich deinen Post richtig verstanden habe, reduzierst du die JumpSpeed, damit der Sprung sozusagen abgebremst wird und der Skater irgendwann seinen Höhepunkt erreicht und danach wieder runterfällt richtig?
Wenn du dazu JumpSpeed *= 0.8 rechnest hast du ein prinzipielles Problem: Damit der Springer seinen höchsten Punkt erreicht, müsste ja JumpSpeed = 0 sein, was aber bei oben stehender Rechnung nur durch Rundungsfehler der Fall ist.
Ich denke man sollte die ganze Sache etwas anders angehen und die Physik ein wenig mehr einbeziehen.
Im Grunde ist so ein Sprung nichts anderes als ein schiefer Wurf, also wenn du einen Ball schräg in die Luft wirfst. Der Ball bzw. der Skater hat dann zwei Geschwindungkeitskomponenten: einen in X- und eine in Y-Richtung. Die in X-Richtung ist hierbei konstant, zb. 10m/s.
Mit der Y-Richtung verhält es sich ein wenig anders. Der Ball erhält am Anfang eine bestimmt Geschwindigkeit mitgegeben. Wenn keine Erdanziehung und keine Luftreibung da wäre, würde sich der Ball ewig mit dieser Geschwindigkeit nach oben bewegen.
Jetzt ist da aber die Gravitation (Erdanziehung). Diese zieht den Skater mit einer Beschleunigung von 9,81m/s² nach unten. Das bedeutet: Wenn man einen Ball fallen lässt wird er auch mit dieser Beschleunigung nach unten gezogen. Seine Geschwindigkeit zum Zeitpunkt t ergibt sich mit folgender Formel: v = 9,81m/s² * t.
Mit dieser Geschwindigkeit wird auch der Skater nach unten beschleunigt. Das heißt, dass sich seine aktuelle - tatsächliche - geschwindigkeit so ergibt: v(skater) = v(anfang) - v(von der gravitation).
Oder als Formel: v = v0 - 9,81m/s² * t
Zugegeben war das jetzt ne ganze Menge Mechanik ich hoffe es war zu verstehen sonst bitte nachfragen
Stellt sich nur die Frage wie man das jetzt für das Spiel nutzen kann. Ich würde folgendes empfehlen:
Nach der oben genannten Formel (und ein wenig zusätzlicher Mathematik) kann man für jeden Zeitpunkt t nach dem Absprung die aktuelle Sprunghöhe errechnen.
Es gilt: h = v0 * t - 0.5g*t² (hierbei ist g die Erdbeschleunigung = 9,81m/s²)
Das könntest du jetzt in Pixel umrechnen. Wenn du am Anfang des Sprungs noch die Zeit gespeichert hast, kannst du t leicht errechnen und die Framerate ist dann egal! Musst du nur noch die horizontale Geschwindigkeit einrichten und entsprechend mit der Zeit multiplizieren dann hast du auch die anzahl der pixel die sich der skater nach links oder rechts bewegt hast. Nochmal als Code:
Code: |
float g = 9.81; // Erdbeschleunigung
float v0_h = 10, v0_v = 5; // Startgeschwindigkeit horizontal und vertikal
float StartZeit = timeGetTime(); // oder wie die Funktion heißt
while(true) // nur als beispiel, soll bedeuten dass folgender Teil bei
// jedem Frame durchlaufen werden muss
{
float t = timeGetTime() - StartZeit;
float hoehe = v0_v * t - 0.5 * g * t * t; // Sprunghöhe zum zeitpunkt t
float weite = v0_h * t; // Sprungweite zum zeitpunkt t
}
|
Jetzt müsstest du in der while-Schleife nur noch Höhe und Weite in Pixel umrechnen und dann entsprechend zeichnen.
Ich hoffe der ganze Mist hier war zu verstehen und funktionert auch. Wenn nicht bitte nachfragen bzw. mich zusammenscheißen  _________________ Es geht auch ohne  |
|
Nach oben |
|
 |
Hazel JLI MVP


Alter: 40 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
|
Nach oben |
|
 |
Chewie Super JLI'ler
Anmeldedatum: 17.07.2003 Beiträge: 382
Medaillen: Keine
|
Verfasst am: 24.07.2003, 23:11 Titel: |
|
|
Hey, danke für eure Antworten...
@Christian: so wollte ich das zuerst auch machen, nämlich:
Code: | vPos.y -= JumpStep / Framerate;
JumpStep *= 67 / Framerate; |
dann würde ich auf meinem system auf einen Faktor von 0.8 kommen, aber bei z.B 30 fps komm ich auf 2.irgendwas, und ich will den JumpStep ja gegen 0 gehen lassen...
@Michael: WOW danke für die ausführliche Erklärung, das ist sicher die genaueste Art es zu machen. Ich habs mir gespeichert und werd mich später mal dran versuchen, wie gesagt, das ist mein erstes DirectX Spiel überhaupt und ich bin schon zufrieden, wenn ichs mal so halbwegs hinkriege.
Du hast natürlich recht, dass die Multiplikation nicht grad schön ist und ich nie auf 0 kommen würde. Ich hätte dann mit einer if-Abfrage bei fast 0 den Faktor auf was anderes gesetzt, oder so...
Vorerst hab ichs mal so gemacht:
Code: | if (m_vPosition.y <= m_MaxJumpPos)
m_JumpStep -= 800.0f / Framerate;
m_vPosition.y -= m_JumpStep / Framerate; |
m_MaxJumpPos definiere ich beim Absprung. Dadurch hab ich zwar eine unregelmäßige Bewegung, was aber eh nicht schlecht aussieht. Außerdem wird der Skater nicht zu schnell, wenn er weit runter fällt. Wenn das Spiel was wird, werde ich das mal schöner machen....bis dahin muss es reichen  |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB.de
|