Wie man sich einer 360-Grad-Schlange nähert


8

Ich bin kürzlich zu XNA gekommen und muss sagen, dass ich es liebe. Als eine Art Hallo-Welt-Spiel habe ich beschlossen, das klassische Spiel "Snake" zu erstellen. Die 90-Grad-Version war sehr einfach und leicht zu implementieren. Aber als ich versuche, eine Version davon zu erstellen, die eine 360-Grad-Drehung mit den Pfeilen nach links und rechts ermöglicht, bin ich auf ein Problem gestoßen.

Was ich jetzt mache, stammt aus der 90-Grad-Version: Durch jedes Schlangenkörperteil iterieren, beginnend am Schwanz und endend direkt vor dem Kopf. Dies funktioniert hervorragend, wenn alle 100 Millisekunden verschoben wird. Das Problem dabei ist, dass es zu einem abgehackten Spielstil führt, da das Spiel technisch gesehen nur mit 6 fps fortschreitet und nicht mit 60 fps.

Ich möchte die Schlange in jeder Spielschleife bewegen . Aber leider geht die Schlange viel zu schnell, weil sie sich mit der Geschwindigkeit ihrer Kopfgröße bewegt. Dies würde bedeuten, dass sich der Kopf in einem viel kleineren Schritt wie (2, 2) in seine Richtung bewegen müsste als in dem, was ich jetzt habe (32, 32). Da ich während der Schulleitung ein paar Wochen lang immer wieder an diesem Spiel gearbeitet habe, denke ich, dass ich mir zu viele Gedanken darüber gemacht habe, wie ich das erreichen kann. Es ist wahrscheinlich eine einfache Lösung, ich verstehe sie einfach nicht.

Hier ist ein Pseudocode für das, was ich ausprobiert habe, basierend auf dem, was für mich sinnvoll ist. Ich kann mir keinen anderen Weg vorstellen.

for(int i = SnakeLength - 1; i > 0; i--){
    current = SnakePart[i], next = SnakePart[i - 1];

    current.x = next.x - (current.width * cos(next.angle));
    current.y = next.y - (current.height * sin(next.angle));

    current.angle = next.angle;
} 

SnakeHead.x += cos(SnakeAngle) * SnakeSpeed;
SnakeHead.y += sin(SnakeAngle) * SnakeSpeed;

Dies erzeugt ungefähr so ​​etwas: Code in Action . Wie Sie sehen können, bleibt jeder Teil immer hinter dem Kopf und macht keinen "Trail" -Effekt.

Ein perfektes Beispiel dafür, was ich vorhabe, finden Sie hier: Datenwurm . Nicht die Drehung des Ansichtsfensters, sondern der Nachlaufeffekt der Dreiecke.

Vielen Dank für jede Hilfe!

Antworten:


5

Mit diesem Algorithmus stellen Sie sicher, dass jedes Segment den gleichen Winkel aufweist wie das vorhergehende. Das ist der Grund, warum sie alle direkt hinter den Kopf geraten und letztendlich alle den gleichen Winkel haben. Wie Sie in dem von Ihnen verknüpften Data Worm-Spiel sehen können, zeigt jedes Segment nur auf das Segment davor . Bestimmen Sie den Winkel vom aktuellen Segment zu seinem nextund lassen Sie den Segmentpunkt auf diese Weise zeigen, anstatt ihn festzulegen next.angle.

Für diese Implementierung möchten Sie möglicherweise stattdessen von vorne nach hinten iterieren. Das Verhalten hängt von der Richtung ab, in die Sie die Liste durchlaufen. Probieren Sie beide aus und finden Sie heraus, welche besser funktioniert.

Ich habe in der Vergangenheit eine ähnliche Idee für einen Projektprototyp verwendet ( Unity WebPlayer-Link ). Ich habe ähnlichen (wenn auch 3D-) Code verwendet, um jedes Segment dazu zu bringen, sich dem Segment davor zuzuwenden und einen festgelegten Abstand zurück zu halten. Lief wie am Schnürchen.


Das ist großartig! Ich habe einen Blog gelesen, der ein ähnliches Konzept verwendet, aber nicht daran gedacht, von vorne nach hinten zu iterieren. Ich werde es versuchen und dies als Antwort markieren, wenn es erfolgreich ist.
Austin Brunkhorst

Update: Habe es geschafft! Es dauerte einige Zeit, um das Konzept zu verstehen und zu verstehen, was tatsächlich vor sich geht. Nochmals vielen Dank, dass Sie mich in die richtige Richtung geführt haben! Hier ist ein Video des Arbeitscodes :) screenr.com/Fhn8 . Kümmere dich nicht um die Kollision mit dem Essen, habe nicht viel Zeit damit verbracht.
Austin Brunkhorst

1
Froh, dass ich helfen konnte!
ChaosTechnician

Dein Link ist tot.
Jeff

1
@ Jeff Anscheinend hat Dropbox entschieden, dass ich irgendwie zu viel Verkehr
zeichne
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.