Frage

Wie Spiele mit der Schwerkraft, die die Beziehung zwischen Griff Dinge wie Spieler, Monster oder Gegenstände und dem Boden zu bewegen? Ist der Spieler ständig „fallen in“ den Boden und wird wieder nach oben zurückgeschickt?

Zwei Möglichkeiten, um Kollisionen zu reagieren, die ich gefunden habe, sind die Spieler zurück zu seiner vorherigen Position vor der Kollision zu bewegen, und die Prüfung die neue Position, bevor er zu sehen, ob es zu einer Kollision führen würde, aber ich sehe nicht, wie entweder von ihnen könnte mit einer Plattform beschäftigen, die nach oben und muss in der Lage zu heben sie den Spieler steigen. Ich betrachte dies aus einer Design-Perspektive 2D-Spiels, aber ich glaube, dass das gleiche Problem in 3D-Game-Design auftritt. Irgendwelche Hinweise? Alle Verweise, die ich sollte überprüfen? Danke.

War es hilfreich?

Lösung

Sie möchten vielleicht GameDev.net Gravity FAQs für einige grundlegende Informationen.

Da Sie ein Spiel machen und nicht eine sehr genaue Physik Modellierer, als wir mit dem Tun Euler Integrationen . Wenn Ihr Bedürfnis nach Genauigkeit der beliebtesten Integrationsmethode erhöht, die ich verwendet sehen, ist ein Runge-Kutta (RK4 ) Integration . Sie höchstwahrscheinlich nicht diese für ein einfaches Spiel brauchen, aber sie sind auf jeden Fall in fortgeschrittenen Physik-Simulation und 3D-Spielen verwendet. Der Nachteil bei RK4 mit leicht Komplexität erhöht und etwas langsamer. Es ist zwar sehr genau, aber jetzt fängt sich mit guten alten Euler bleiben.

Ich fragte eine ähnliche Frage: „ Wie ich beantrage die Schwerkraft zu meinen Flummi Spiel “, und bekam einige gute Antworten. Das erste, was Sie tun, ist eine beliebige Gravitationskonstante für Ihr Spiel wählen. In meiner hüpfenden Ball Anwendung verwende ich eine Standard-Dichte-Konstante von 2000px / s. Sie werden mit diesem Gravitationskonstante spielen wollen den gewünschten Effekt für die jeweilige Spiel zu bekommen.

Als nächstes wollen Sie sicherstellen, dass Sie Ihr Spiel sind Rendering und Ihre Spielobjekte unabhängig zu aktualisieren. Dies ist Ihr im Spiel Gegenstände zu verhindern, dass wirklich schnell bewegenden auf schnellen Rechnern und langsam auf langsamen Computern. Sie wollen die Physik und die Geschwindigkeit, mit der Sie Ihre Objekte in der Umgebung unabhängig von der Geschwindigkeit des Computers bewegen. Ein guter Artikel zu diesem Thema ist Spiel Physik: Fix Ihren Zeitschritt ! .

So wie wir das tun? Sie verfolgen, wie viel Zeit seit dem letzten Aufruf von Ihrem Update-Methode übergeben. Ich habe 2 Fäden, obwohl es nicht direkt notwendig ist. Ich habe einen Spiel-Update-Thread und einen Rendering-Thread. Die Update-Thread steuert das in Spiel Aktualisierung Objekte Positionen. Der Update-Thread weiß, wann es wurde vorherige die aktuelle Zeit genannt wird, und berechnet daraus die verstrichene Zeit seit der Update-Methode aufgerufen wurde.

Schwerkraft anwenden zu können wir einfach auf die Y-Geschwindigkeit unserer Aufgabe durch unsere Gravitationskonstante durch die verstrichene Zeit multipliziert hinzuzufügen.

private long previousTime = System.currentTimeMillis();
private long currentTime = previousTime;

public void updateGame()
{
    currentTime = System.currentTimeMillis();
    float elapsedSeconds = (currentTime - previousTime) / 1000f; 

    foreach(GameObject gameObject in gameObjects)
    {
        // Apply gravity to velocity vector
        gameObject.velocity.y += (gravityConstant * elapsedSeconds); 

        // Move objects x/y position based off it's velocity vector
        gameObject.position.x += (gameObject.velocity.x * elapsedSeconds); 
        gameObject.position.y += (gameObject.velocity.y * elapsedSeconds);

    }

    checkCollisions();

    previousTime = currentTime;
}

Das wird alle Objekte auf der Grundlage ihres Geschwindigkeitsvektor der Bewegung und Schwerkraft, um sie konstant auf der Grundlage Ihrer Schwerkraft anwenden. Best of all es tut es unabhängig von der Computer-Geschwindigkeit!

Um Ihre andere Frage zu beantworten, ja die Objekte müssen ständig die „Kraft“ der Schwerkraft auf ihrem y-Vektor. So wird es ständig mit dem Boden kollidiert sein. Allerdings ist eine Sache, die Sie tun möchten, ist eine Epsilon Wert schließlich auf Null Ihre Gameobject der Geschwindigkeit zu bringen. Dann werden während Kollisionserkennung als Teil Ihres Bereinigungsprozesses Sie kann in der Regel der Überprüfung überspringt, wenn ein nicht bewegendes Objekt mit etwas kollidiert (wenn auch nicht umgekehrt!).

Was Ich mag mit Kollisionen zu tun ist, wenn ich Objekte kollidieren (eindringende einander) zu finden, ich werde sie durch ihre minimale Übersetzung Entfernung (MTD), die sie auseinander drücken trennt. Dieser Schritt ist der Schlüssel sonst werden Sie die häufig gesehen Fehler in den Spielen der Objekte „stecken“ zusammen jitterly sich zu bewegen über. Sobald sie getrennt sind, berechne ich meine Kollisionsantwort.

Mit dieser Methode wird es in Ihrem beschriebenen Szenario einer steigenden Plattform funktionieren. Die Plattform wird weiter steigen, die Gameobject trennt sich die MTD zwischen sich selbst mit und der Plattform, und es wird damit natürlich steigen.

Wenn you braucht Hilfe bei der Kollisions Antwort würde ich bei der Suche empfehlen:

Andere Tipps

Ein Ansatz in einigen Spielen verwendet wird, zu betrügen: hat einen eigenen Staat für vs in der Luft geht. Beim Gehen kann der Spiel-Engine die Neigung der Oberfläche bestimmen zu sein ging, und wenn nicht zu steil, als auch das Zeichen in Richtung der Oberfläche bewegen Sie den Charakter richtig, den vertikale Anordnung in Bezug auf die Oberfläche als geben.

Wie für Physik, ich bin ein Fan von Verlet-Integration werden wie in Gamasutra : Erweiterte Charakter Physik . Es vereinfacht die Gleichungen der Physik-Update (müssen nicht den Überblick über Geschwindigkeit halten!) Und es vereinfacht Kollisionen (nicht Geschwindigkeit anpassen müssen!). Das heißt, es hat ein paar Nuancen , wenn Sie Genauigkeit benötigen.

Eines der umfassendsten Lehrbücher zu diesem Thema ist Echtzeit Kollisionserkennung von Christer Ericson . Er hat ein Begleiter Blog zu . Eric Lengyel Mathematik für 3D-Game Programming und Computergrafik ist auch nützlich.

Ich bin nicht speziell ein Spiel Programmierer, aber das ist mein Verständnis:

  • in einer idealen Welt mit einer „unendlichen Bildrate“, dann würden Sie die Kollision genau in dem Moment erkennen sie aufgetreten ist, und ein wenig Standard Physik verwenden, um die neuen Geschwindigkeiten und Beschleunigungen des Körpers die Kollision folgenden zu modellieren (siehe ein Standard-High-School-Mechanik Lehrbuch oder verschiedene Bücher Dinge wie „Physik für Spiele-Programmierer“ berechtigt)
  • in Wirklichkeit, weil Sie eine feste Framerate haben und daher nur Körper mit einer bestimmten Körnung bewegen, müssen Sie in der Regel einen zusätzlichen Trick, wie die Berechnung im Voraus den relativen Pfad hinzuzufügen, die Körper auf den nächsten Rahmen reisen und zu sehen, wenn eine der Pfade kreuzen
  • , wenn sie sich schneiden tun, dann der Schnittpunkt tatsächlich sein ein Schätzung , aber etwas ungenau, der Punkt, an dem die Körper wirklich kollidierte hätte; Sie haben dann die Wahl nicht darum kümmern, und diese Schätzung als Schnittpunkt zu nehmen und interpoliert linear die Geschwindigkeiten an der Stelle der Kollision zu bekommen, oder eine genauere Berechnung jetzt tun Sie herausgefunden haben, dass sie sich überschneiden wird, erhalten die Ist Punkt / Zeit / Geschwindigkeit der Kollision

Neben Modellierung Kollisionen, ist ein guter Ansatz, um auch weiterhin die Übertragung von Energie-Modell (oder Impulse, oder einfach nur Geschwindigkeit, abhängig von der Komplexität der Simulation). Wenn Sie den Player auf einer Plattform steht, speichert diese Informationen in dem Objekt die Plattform darstellen, und jedes Mal, wenn die Geschwindigkeit des Objekts eingestellt wird, können Sie direkt, dass die Änderung des thusly verknüpften Player oder andere Objekte anwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top