Was soll ich tun, um zu verhindern, dass meine Monster von Plattformen laufen?

8

Ich habe eine Frage, die mich verrückt macht, weil ich denke, dass es ziemlich einfach sein sollte, ein Tutorial dazu zu finden. Ich verwende derzeit XNA und Farseer, um ein einfaches Plattformspiel zu erstellen. Ich bin kurz davor, damit fertig zu werden, aber ich möchte, dass meine Monster schlauer sind. In diesem Fall bedeutet das, dass ich nicht möchte, dass meine Monster von Klippen fallen.

Um es einfach auszudrücken, ich möchte etwas, das den Bereich vor meinem "Monster" überprüft, um festzustellen, wann das Monster die Richtung ändern soll. Könntet ihr mich in die richtige Richtung weisen?

Was soll ich verwenden, es sollte eine einfache Lösung oder einen einfachen Algorithmus geben, um dies zu überprüfen, nein?

Daniel Figueroa
quelle

Antworten:

17

Ich habe noch nie mit XNA gearbeitet und ich denke, es werden bessere Lösungen als meine sein. Eine mögliche Problemumgehung besteht darin, dass Sie ein unsichtbares Objekt auf die Extreme der Klippen legen und das Monster auf Kollision mit diesem Objekt prüfen kann. Wenn es kollidiert, ändert sich die Richtung.

gmemario
quelle
2
Einfach und elegant, +1
Valmond
Das ist eine gute Lösung. Farseer unterstützt " Sensoren ", verwenden Sie diese also an den Klippen.
Bummzack
Ihre Antwort gefällt mir sehr gut, deshalb möchte ich sie nicht bestreiten. Er könnte auch die Kachel unten links / rechts verwenden (abhängig von der Bewegungsrichtung) - was eine "offensichtlichere" Lösung ist.
Jonathan Dickinson
1
Das Hauptproblem bei einer solchen Lösung ist, dass Sie für jede Klippe ein Hindernis platzieren müssen. Wenn es nur wenige im Spiel gibt, ist es vielleicht in Ordnung, aber ansonsten kann es lange dauern und Sie können einige Klippen übersehen.
AlbeyAmakiir
4
@AlbeyAmakiir Nun, Sie können dies auch vertauschen und einen Sensor unten vor dem Spieler platzieren (der sich mit dem Spieler bewegt). Sobald dieser Sensor keine Kollisionen mehr registriert, befinden Sie sich an einer Klippe.
Bummzack
7

Eine naive Art der Implementierung ist die Verwendung von Raycasting.

Berechnen Sie, wo sich Ihr Monster in einem kleinen Teil der Zeit befindet (wahrscheinlich in einem Frame). Von dieser Position aus (oder wenn Sie robuster sein möchten, diese Position +/- der Begrenzungsbereich Ihres Feindes) führen Sie einen Raycast nach unten durch. Wenn es nicht auf etwas in einem angemessenen Bereich trifft (abhängig davon, wo Sie Ihren Raycast vertikal starten, die Höhe des Charakters, Ihre gewünschte "Schrittgröße" usw.), können Sie sich vorstellen, dass es eine Klippe gibt, auf der der Charakter sein möchte. und beschließen, die Richtung entsprechend zu ändern.

Tetrad
quelle
1

Mit meiner KI überprüfe ich einfach, ob sich unten eine Plattform befindet und in Fahrtrichtung (ohne Verwendung eines Kachelsystems, nur eines groovigen Kollisionssystems). Wenn dies nicht der Fall ist oder wenn es auf einen festen Block trifft, sieht es verwirrt aus und dreht sich um.

Auf diese Weise können Sie dynamische Karten haben und trotzdem eine funktionierende (lose verwendete) KI haben.

Ultifinitus
quelle
0

Ich vermute, Sie verwenden eine Kachelkarte. In diesem Fall besteht die Lösung darin, sie auf der Grundlage von Kachelindizes durchzuführen. Du musst herausfinden, auf welchem ​​Plättchen sich dein Monster gerade befindet, mit den folgenden Formeln:

int tileX = (int)(monster.Position.X / TILE_WIDTH);
int tileY = (int(monster.Position.Y / TILE_HEIGHT);

Sobald Sie diese kennen, müssen Sie herausfinden, in welche X-Richtung Sie fahren (um nach Blöcken zu suchen):

int direction = 0;
if (monster.Velocity > 0f)
    direction = 1;
if (monster.Velocity < 0f)
    direction = -1;

Jetzt haben Sie eine normalisierte X-Richtung, mit der Sie arbeiten können.

Als Nächstes sollten Sie die Blöcke überprüfen, um festzustellen, ob Sie die Richtung ändern sollten:

if (GetTileCollision(tileX + direction, tileY) == TileCollision.Impassable || // going into a wall
    GetTileCollision(tileX + direction, tileY) == TIleCollision.Passable &&
    GetTileCollision(tileX + direction, tileY + 1) == TileCollision.Passable)) // we're going to fall down a block
    ChangeDirection(); // we change direction

Sie bekommen die allgemeine Idee. Stellen Sie sicher, dass Sie zurückkehren TileCollision.Impassable(oder was auch immer), wenn sich die Kachelindizes außerhalb der Karte befinden, um zu verhindern, dass Ihr Programm mit einem ungültigen Index abstürzt, und um zu verhindern, dass Monster die Karte verlassen.

Ich denke, es hängt wirklich davon ab, wie Sie mit Fliesen umgehen, aber dies ist die Lösung, die für mich funktioniert hat.

Basierend auf den Tutorials von http://www.sgtconker.com/ (obwohl die Website nicht verfügbar ist, während ich dies schreibe)

Jesse Emond
quelle
0

Stelle eine Kiste auf der Außenseite der Plattform auf, die sich auf einer separaten Ebene befindet, und lass die Monster dies überprüfen, damit sie nicht herunterfallen, aber der Spieler kann es trotzdem.

Darren
quelle
Ich denke, das ist die gleiche Antwort, die Gilson gegeben hat.
Richard Marskell - Drackir
Du siehst richtig aus
Darren