JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=759358bf2a10f06d51d77860c64eecd6Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Sprungbewegung für nen Charakter

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Chewie
Super JLI'ler



Anmeldedatum: 17.07.2003
Beiträge: 382

Medaillen: Keine

BeitragVerfasst am: 24.07.2003, 14:49    Titel: Sprungbewegung für nen Charakter Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
TheMillenium
Dark JLI'ler



Anmeldedatum: 21.07.2002
Beiträge: 1427
Wohnort: World
Medaillen: Keine

BeitragVerfasst am: 24.07.2003, 15:05    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Chewie
Super JLI'ler



Anmeldedatum: 17.07.2003
Beiträge: 382

Medaillen: Keine

BeitragVerfasst am: 24.07.2003, 16:48    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 24.07.2003, 18:10    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Christian Rousselle
Site Admin


Alter: 48
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 24.07.2003, 18:30    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Michael
JLI'ler



Anmeldedatum: 20.07.2002
Beiträge: 173
Wohnort: Münster / NRW
Medaillen: Keine

BeitragVerfasst am: 24.07.2003, 18:44    Titel: Antworten mit Zitat

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 Smile
_________________
Es geht auch ohne Wink
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
Hazel
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 24.07.2003, 18:49    Titel: Antworten mit Zitat

Hey,

ich hatte mal ein Beispiel für Jump and Runs geschrieben. Ist zwar nicht Framerateunabhängig, das ist aber sehr einfach hinzuzufügen.

www.jliforum.de/hazel/programs/jumptest.zip
_________________
*click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Chewie
Super JLI'ler



Anmeldedatum: 17.07.2003
Beiträge: 382

Medaillen: Keine

BeitragVerfasst am: 24.07.2003, 23:11    Titel: Antworten mit Zitat

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 Shocked 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 Cool
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
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

Impressum