Die Mathematik eines Sprungs in einem 2D-Spiel

8

Ich arbeite in J2ME, ich habe meine Gameloops:

%Vor%

Es ist also nur ein einfacher Gameloop, die doLogic() Funktion ruft alle Logikfunktionen der Charaktere in der Szene auf und render(g, diff) ruft die animateChar Funktion jedes Charakters in der Szene auf, gefolgt von animChar Funktion in der Klasse Klasse richtet alles auf dem Bildschirm so ein:

%Vor%

Dies stellt sicher, dass sich alles entsprechend der Zeit bewegen muss, die die Maschine benötigt, um von einem Zyklus zum nächsten zu wechseln (denken Sie daran, dass es sich um ein Telefon handelt, nicht um ein Gaming-Rig). Ich bin sicher, es ist nicht der effizienteste Weg, um dieses Verhalten zu erreichen, also bin ich total offen für Kritik an meinen Programmierfähigkeiten in den Kommentaren, aber hier mein Problem: Wenn ich Charaktersprünge mache, was ich tue ist, dass ich seins anlege dy auf einen negativen Wert, sagen wir -200 und ich setze den booleschen Sprung auf true, wodurch das Zeichen nach oben geht, und dann habe ich diese Funktion namens checkGravity() that sorge dafür, dass alles, was nach oben geht, nach unten gehen muss, checkGravity prüft auch, ob der Charakter über Plattformen ist, also werde ich es der Zeit wegen ein bisschen abziehen:

%Vor%

Das Problem ist also, dass diese Funktion das dy unabhängig vom diff aktualisiert, so dass die Charaktere in langsamen Maschinen wie Superman fliegen und ich keine Ahnung habe, wie um den Faktor diff zu implementieren, so dass, wenn ein Charakter springt, seine Geschwindigkeit proportional zur Spielgeschwindigkeit abnimmt. Kann mir jemand helfen, dieses Problem zu beheben? Oder gib mir Hinweise, wie man einen 2D-Sprung in J2ME richtig macht .

    
fixmycode 29.05.2009, 00:06
quelle

4 Antworten

5

Sollten Sie die jumpSpeed ​​nicht basierend auf der verstrichenen Zeit anpassen? Das heißt, vielleicht ändert sich die Geschwindigkeit um -75 / Sek., Also sollte Ihr Unterschied ein Gewicht für die Menge der Änderung sein, die auf die Sprunggeschwindigkeit angewendet wird.

Also gib diff an checkGrav weiter und mache etwas wie ... jumpSpeed ​​+ = (diff * (rate_per_second)) / 1000;

(vorausgesetzt, Diff in Millisekunden)

(Im Idealfall würde dies wie echte Schwerkraft aussehen: D)

    
gregd 29.05.2009, 00:20
quelle
3

Warum skalieren Sie nicht einfach alle Konstanten nach Diff?

Übrigens ist es mir peinlich, das zu sagen, aber ich habe an einem kommerziellen Spiel gearbeitet, bei dem die Schwerkraft doppelt so stark war wie bei den Charakteren. Aus irgendeinem Grund bevorzugten die Leute das.

    
Nosredna 29.05.2009 00:14
quelle
0

Dies scheint eher eine Frage des Spieldesigns zu sein als die Mathematik eines Sprungs. Es ist ein häufiges Problem, dass in Spielen, die auf verschiedenen Prozessoren laufen, ein Spiel schneller ausgeführt wird und bei anderen Spielen es langsamer ausgeführt wird (wodurch die gesamte Geschwindigkeit des Spiels verändert wird). Ich bin mir nicht sicher, welche übliche Praxis in Spielen ist, aber wann immer ich selbstgebraute 2D-Spiele machte (es machte Spaß, sie zu machen) hätte ich das Konzept eines Spiel-Ticks. Auf schnelleren Maschinen

%Vor%

Wäre niedriger. Eine Wartezeit würde vom Diff abgeleitet werden, so dass das Spiel auf den meisten Maschinen mit der gleichen Geschwindigkeit laufen würde. Ich hätte auch die Rendermethode in einem separaten Thread, so dass die Spielgeschwindigkeit nicht von der Grafik abhängig ist.

    
Patrick Gryciuk 29.05.2009 00:25
quelle
0

Ich kann eine Formel wie diese geben (ich benutze sie überall). Das X ist der Parameter von Null beginnend bis zur Länge des Sprungs. Wenn Sie möchten, dass jemand auf eine Höhe (H) und auf eine Länge (L) springt, dann wird die Funktion des Sprungs so aussehen (und es wird nicht in der Lage sein, jemals anders auszusehen):

  

y = minus (Potenz (x - Länge des Sprunges geteilt durch zwei) multipliziert mit 4 und   multiplizieren mit Höhe des Sprungs) dividiere durch die Kraft der Länge und füge hinzu   Höhe des Sprunges am Ende.

     

y = - (x-1/2) (x-1/2) · 4 · h / (l * 1) + h

Und wenn Sie möchten, dass das Sprungobjekt auf etwas landet, dann können Sie jedes neue X überprüfen, wenn es ungefähr auf einer Plattform steht und wenn es auf etwas steht, dann lassen Sie es nicht einfach anhalten, machen Sie es zur Y-Position genau gleich dem Y der Plattform.

Wenn Sie etwas wie Flash oder eine andere Basis mit invertierter Y-Achse verwenden, multiplizieren Sie die Funktionsausgabe mit -1;

    
Konstantin 22.04.2010 13:19
quelle

Tags und Links