Wie gehe ich mit sich bewegenden Plattformen in einem Plattformspiel um?

15

Ich möchte keine Box2D oder ähnliches verwenden, sondern nur einfache bewegliche Plattformen (aufwärts, abwärts, links, rechts, diagonal und kreisförmig). Meine Frage ist, die Update-Reihenfolge / Steuerungshierarchie so zu handhaben, dass der Player fest auf der Plattform bleibt, ohne zu hüpfen oder zu wackeln?

Iain
quelle

Antworten:

16

Meine Lösung wäre, jede physische Entität in der Spielkarte als Baumknoten und die Karte selbst als Wurzelknoten zu behandeln . Knoten können andere Knoten enthalten. Jeder Knoten ist (direkt oder indirekt) innerhalb des Kartenknotens enthalten.

Angenommen, Ihr Charakter steht auf einer Plattform. Der Knoten der Plattform enthält den Knoten des Charakters. Wenn sich die Plattform also bewegt, bewegen sich auch die darin enthaltenen Knoten (in diesem Fall der Charakter).

Zu diesem Zweck sollte jeder Knoten eine (x, y) -Position relativ zum übergeordneten Knoten haben . Zum Beispiel könnte sich Ihr Charakter bei (1,0) relativ zur Plattform befinden, was sich selbst bei (10,10) relativ zur Spielkarte befinden könnte. Auf diese Weise bewegt sich Ihr Charakter implizit, wenn sich die Plattform bewegt.

In diesem hierarchischen Baum ist die Position jedes Knotens gleich der Summe seiner Position plus der Positionen aller übergeordneten Knoten. Angenommen, wir möchten die Position des Charakters auf der Karte ermitteln. Wir berechnen:

(Position des Charakters) + (Position des Elternknotens) + (Position des Wurzelknotens) = (1,0) + (10,10) + (0,0) = (11,0)

OK, die ganze Zeit stand dein Charakter auf der Plattform. Was ist mit Springen? Nun, in dem Moment, in dem er springt, lösen Sie ihn von der Plattform und befestigen ihn an dem Knoten, der die Plattform enthält . in diesem Fall die Karte (Wurzelknoten).

Wenn er wieder landet, befestigen Sie ihn an dem Knoten, auf dem er gelandet ist.

jSepia
quelle
1
Ich würde auch die x- und y-Geschwindigkeit des Knotens verwenden, um den Player zu beeinflussen. Beispiel 1: Plattform bewegt sich sehr schnell und stoppt, Spieler hat Aufwärtsdynamik und wird gestartet. Beispiel 2: Die Plattform bewegt sich etwas langsamer als der Spieler, der mit tödlicher Geschwindigkeit fällt. Die Plattform sollte sicherer zu landen sein als SPLUT
AttackingHobo
Das ist ein interessanter Ansatz, scheint aber eine umfassende Änderung an meinem Motor zu sein, nur um das Bewegen von Platormen zu ermöglichen. Vielleicht, wenn ich objectOnPlatform als Komponente erstelle, die ich für jedes Objekt verwenden kann, das diesen Effekt nur vorübergehend erzeugt?
Iain
10

Ich würde vorschlagen, dies als ein Problem der Pseudophysik zu behandeln und es mit Hilfe von Bodenreibung zu lösen.

Sie nutzen bereits die Schwerkraft, um den Charakter auf dem Boden zu halten. Dadurch werden Situationen bewältigt, in denen sich Plattformen auf und ab bewegen. Um mit der linken und rechten Bewegung fertig zu werden, sollte der Boden eine große Reibung auf den Charakter ausüben. Typischerweise würde dieses Reibungsniveau 1,0 oder 100% betragen.

Wenn der Charakter stillsteht, ist seine Geschwindigkeit 0 und erbt stattdessen aufgrund der Reibung 100% der Geschwindigkeit der Plattform. So etwas wie das folgende:

character_velocity = friction * platform_velocity

Der Vorteil dieses Ansatzes besteht darin, dass er sich leicht für zusätzliche Plattformmechanismen eignet, z. B. um die Reibung an steilen Hängen zu überwinden und Ihrem Charakter das Gleiten zu ermöglichen. Außerdem können Sie auf einfache Weise die Reibung verringern, um Eis zu erzeugen, auf dem der Charakter rutscht.

Es ist auch einfacher, Probleme wie niedrige hängende Wände zu lösen, die Ihren Player von einer sich bewegenden Plattform stoßen können. Wenn Sie den Charakter einfach als Kind einer übergeordneten Plattform behandeln, ist die Wahrscheinlichkeit groß, dass er ohne viel Arbeit nicht so einfach mit dem Rest Ihrer Kollisionserkennung interagiert.

Soviut
quelle
0

Sie können die Position des Spielers nicht "absolut im Level", sondern "relativ zur Plattform" festlegen und dann eine Funktion haben, die seine tatsächliche Position angibt. Das mag ich aber nicht.

Es wäre wahrscheinlich besser (und einfacher), den Spieler an die Plattform zu binden, damit sich der Spieler, wenn sich die Plattform + x / + y bewegt, so weit wie möglich bewegt.

o0 '.
quelle