Wie kann ich feststellen, ob ein Charakter in die Lücke eines unendlichen Läufers / Springers gefallen ist?


12

Ich baue einen unendlichen 2D-Läufer. Im Spiel werden Charaktersprünge von Säule zu Säule und Säulen nach dem Zufallsprinzip generiert. Ich habe diese Arbeit. Aber wie kann man feststellen, ob der Charakter nicht auf eine Säule gesprungen ist und in die Lücke zwischen den Säulen gefallen ist? Eine Säule hat eine gewöhnliche rechteckige Form.


OT: Ich dachte, diese Frage wurde auf rpg.SE gepostet und ich dachte: "Welche Art von Regel-Exploit wurde jetzt gefunden? Unendlich laufend wie?"
o0 '.

Antworten:


20

Fügen Sie am unteren Rand der Ebene einen rechteckigen Bereich hinzu, der niedriger ist als die minimal zulässige Höhe einer Plattform. Wenn der Spieler diese Region durchquert hat, ist er von einer Plattform gefallen.


1
Und dieses Rechteck zu einem Kind der Kamera machen, damit es sich mit der Kamera bewegt und immer präsent ist? Das ist so einfach Vielen Dank.
SanSolo

Auch wenn der Spieler nicht in der Lage sein sollte, durch das Level zu fallen, denke ich, dass dies ein guter Schutz ist, wenn er es irgendwie schafft.
Mucaho

5
Wenn Sie buchstäblich die Schnittmenge überprüfen, stellen Sie sicher, dass Ihr Charakter nicht so schnell abfällt, dass er durch die Oberfläche schneidet (dh einer von den Charakteren ganz oben und der nächste ganz unten).
wchargin

2
Ja, der Rect sollte so weit wie nötig nach unten reichen, um dies zu vermeiden. Es funktioniert auch, wenn Sie nur die Höhe überprüfen, aber dies gibt Ihnen die Flexibilität, die Größe der "Kill-Region" in Abhängigkeit von der Stufe zu ändern.
Mklingen

6
Warum nicht einfach, um ein "Abschneiden" durch das Rechteck zu vermeiden if (playerPos.x < minHeight)?
Cole Johnson

24

Wenn Ihr Spiel nur horizontal scrollt, können Sie überprüfen, ob sich die vertikale Position des Charakters unter dem unteren Rand der Bühne befindet.

Wenn Ihr Spiel auch vertikal rollt (wahrscheinlich nach oben), können Sie prüfen, ob der Spieler den unteren Rand der Ansicht (dh den Bereich der Bühne, der auf dem Bildschirm angezeigt wird, oder den Fokus der Kamera) unterschritten hat.

Im Allgemeinen liegt der Todeszustand vor, wenn der Charakter nicht "in der Kamera" bleibt. Indem Sie die Bewegung Ihrer Kamera steuern, können Sie Ihr Gameplay optimieren. Wenn Sie zum Beispiel in einer vertikalen Bildlaufphase Ihrer Kamera nur erlauben, ein wenig nach unten zu "gummieren", während Sie die volle Aufwärtsbewegung zulassen, werden Sie tiefe Stürze außerhalb des Bildschirms bestrafen.


Ja, das ist auch ein einfacher Weg. Ich müsste nur die niedrigste Position herausfinden, an der der Charakter sein kann.
SanSolo,

1
Richtig! Im Falle eines horizontalen Scrollers können Sie einfach die vertikale Größe der Bühne in Ihrem Karteneditor überprüfen. Bei einem vertikalen Scroller können Sie sicherstellen, dass sich die Kamera nur nach oben bewegt. Auf diese Weise gerät der Charakter, wenn er herunterfällt, unter die Kamera. Sie können dann einfach überprüfen, ob die vertikale Position des Zeichens unter die untere Grenze der Ansicht fällt.
Jelle van Campen

@JellevanCampen: Sie müssen die Kamera nicht unbedingt auf Aufwärtsbewegung begrenzen. Sie können Charaktere töten, die nicht "in der Kamera" bleiben, oder die Kamera ihnen folgen lassen.
Mooing Duck

Diese Antwort gefällt mir nicht so gut, weil sie die Kamera direkt an Ebenengrenzen bindet. Die Antwort von mklingen funktioniert auch dann, wenn die Grenzen des Levels mehr als eine Bildschirmhöhe betragen. Die Kamera kann sich auf und ab bewegen, um auf den Charakter zu fokussieren. Es besteht jedoch keine Gefahr, dass der Charakter schneller als die Kamera fällt, in der Ebene bleibt und dennoch mit dem direkt an der Kamera angebrachten Begrenzungsrahmen kollidiert.
Kevin

2
@ Kevin: Ich bin einverstanden mit allgemeinen Spielen, aber nicht mit prozedural generierten Infinite-Scrollern. In einem vertikalen Bildlauf müssten Sie beispielsweise entweder weiterhin neue Boxen erzeugen und Offscreen-Boxen entfernen, oder Sie müssten die Boxen weiterhin aktualisieren, während sich die Kamera bewegt. Da die Todesbedingung direkt mit "Nicht in der Kamera bleiben" zusammenhängt, ist es sinnvoll, die Bedingung an die Kamera zu binden. Es ist auch performanter, eine Kamerabegrenzungsprüfung durchzuführen, anstatt neue Objekte zu erzeugen und auf Kollisionsprüfung zurückzugreifen.
Jelle van Campen

2

Alternativ zur Überprüfung der vertikalen Koordinate können Sie auch die vertikale Geschwindigkeit überprüfen. Wenn das Zeichen nach unten schneller als eine bestimmte Schwelle fallen, schließen sie tot sind (auch wenn es ist noch erreichen einige Plattform niedrig genug, würde die Wirkung tödlich sein).

Dies funktioniert natürlich nur, wenn Ihr Spiel die grundlegende Freifallphysik ordnungsgemäß implementiert, dh die Abwärtsgeschwindigkeit steigt tatsächlich während des Falles an, wie dies in der Realität der Fall ist (bis zur Endgeschwindigkeit).


1

Wenn Sie eine Pfeilerhöhe haben, können Sie die niedrigste vorhandene finden und diese mit der vertikalen Position des Spielers vergleichen. Befindet er sich unter der untersten Säule, besteht keine Chance, dass er zurückkommt. Sie können diesen Check nur auf Säulen hinter und vor dem Player beschränken.

Beispiel: Wir haben 3 Säulen mit Höhen [10, 20, 40]. Der gesprungene Spieler steht auf der Säule mit der Größe 40, er springt nach vorne auf 20. Er spürte eine Lücke zwischen 40 und 20, er ist jetzt auf der Größe 15. Das heißt, er spürt. Warten Sie für eine weniger strenge Überprüfung, bis er unter 10 ist.


Alle Säulen sind gleich groß. Es ist die horizontale Lücke zwischen zwei Säulen, die variiert :)
SanSolo

0

Zählen Sie, wie lange ein Charakter gefallen ist. (dh wie lange sie sich "nach unten" bewegt haben). Sobald sie mehr als eine Zeit lang gefallen sind, sind sie per Definition von der Bühne gefallen, ja?

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.