Wie bewege ich Objekte auf einem Pfad?

7

Ich versuche so etwas wie das folgende Bild zu bekommen. Wie Sie sehen können, gibt es eine Autobahn und im Inneren bewegen sich einige Objekte (Millisekunde). Ich denke, das Straßenverhalten ist wie eine Pipeline. Wenn die Autobahn ein Objekt lädt, erscheint es am Anfang und bewegt sich durch die Autobahn, bis es im anderen Extrem der Autobahn ankommt.

Mein Hauptproblem ist, wie kann ich mehrere Objekte nur innerhalb der Autobahn bewegen?

Bildschirmaufnahme von Bloons td4 Level 1

oscar.fimbres
quelle

Antworten:

17

Das hängt davon ab: Wie beurteilen Sie wollen , sie bewegen?

Die unnatürliche Option

Definieren Sie einen voreingestellten Pfad mit einer Reihe von Eckpunkten und lassen Sie die Sprechblasen genau dem Pfad folgen.

Eine natürlichere Option

Machen Sie die Ballons boids und implementieren Sie das Verhalten des Crowd Path nach , wodurch sie dem Pfad folgen (und nicht zu weit davon entfernt sind), während Kollisionen miteinander vermieden werden. Beide Seiten enthalten Java-Applet-Beispiele.

Der Autor dieser Seiten stellt fest, dass er den Quellcode der Beispiele nicht verteilen kann. OpenSteer bietet jedoch C ++ - Implementierungen dieser Algorithmen an.

(Mir sind keine C # -Boids-Bibliotheken oder anständige Tutorials bekannt. Das Beste, was ich getan habe, ist, einfach den Codebeispielen zu folgen.)

Doppelgrün
quelle
+1 für eine gute Antwort. Ich denke, dass eine einfache Pfadverfolgung das einzige ist, was benötigt wird, um das dargestellte Verhalten zu simulieren. Das Lenkverhalten ist praktisch, wenn der Weg plötzlich breiter wird oder Hindernisse auftauchen, an denen sich die "Boids" anstellen.
Bummzack
Ich denke, die erste Option wäre einfacher. Können Sie mir ein Beispiel zeigen?
oscar.fimbres
@ oscar.fimbres: Das sollte ganz einfach sein. Erstellen Sie einfach eine Liste von Wegpunktkoordinaten (z. B. ein Array), nehmen Sie die erste Koordinate als Ziel und bewegen Sie Ihren Agenten in diese Richtung. Sobald der Agent den Wegpunkt erreicht hat, nehmen Sie den nächsten als Ziel. Wenn sich der Agent mit konstanter Geschwindigkeit bewegt, können Sie auch jedes Überschwingen problemlos dem nächsten Ziel zuordnen.
Bummzack
Ja, das kann ich mir vorstellen. Ich überprüfe die Website: enchantedage.com/node/78 Obwohl ich mein Sprite auf diesem Weg bewegen kann
oscar.fimbres
IMO, Boids ist für ein so einfaches Problem übertrieben. Die Bewegung zu einem bestimmten Zeitpunkt ist im Wesentlichen 1D und unterliegt nicht einmal einer Richtungsumkehr. Jedes Lenkverhalten ist wahrscheinlich extrem einfach und rechtfertigt diese Art von System nicht wirklich. Außerdem würden die Ballons nicht als Herde fungieren, sie agieren autonom und zeigen keine wirklichen Versuche, die "Herde" aufrechtzuerhalten - sie stecken einfach auf einer Straße fest und gehen alle in die gleiche Richtung. Das ist Zufall, kein explizit programmiertes Verhalten. Sie wie eine Herde zu behandeln, macht auch im Zusammenhang mit dem Fahren keinen Sinn. Folgen Sie allen?
PatrickB
4

Sie benötigen eine Liste mit Punkten und eine Liste mit Luftballons

class Path 
{
   List<Vector2> Points;
   float[] Lengths;
   Vector2[] Directions;

   void Build()
   {
       Lengths = new float[Points.Count-1];
       Directions = new float[Points.Count-1];
       for (int i=0; i<Points.Count-1;i++)
       {
            Directions[i] = Points[i+1] - Points[i];
            Lengths[i] = Directions[i].Length();
            Directions[i].Normalize();
       }  
   }
}

class Balloon
{
     Vector2 Position;
     float StagePos;
     int StageIndex;
     Path Path;
     float Speed;

     void Update(float Seconds)
     {
         if (StageIndex!=Path.Points.Count-1)
         {
             StagePos += Speed * Seconds;
             while (StagePos>Path.Lengths[StageIndex])
             {
                 StagePos -= Path.Lengths[StageIndex]; 
                 StageIndex++;              
                 if (StageIndex == Path.Points.Count-1) 
                 {
                     Position = Path.Points[StageIndex];
                     return;
                 }
             }
             Position = Path.Points[StageIndex] + Directions[StageIndex] * StagePos;
         }
     }    
}
Blau
quelle
3

Wenn Sie eine Straße haben, die aus Kacheln mit einem einzigen Pfad besteht ("Pipeline", wie Sie es nannten), brauchen Sie keine Boids, Vermeidung, KI oder wirklich etwas ganz Besonderes. Lassen Sie einfach jeden Ballon in die natürliche Richtung der Straßenkachel bewegen. Wenn Sie beispielsweise ein Startplättchen mit nur einem Nicht-Sandplättchen zum Berühren haben, können Sie herausfinden, in welche Richtung Sie sich bewegen müssen - es ist die Richtung, die "nicht hier, nicht dort, wo ich war, und nicht Sand" ist. Da Ihre Straße nur zwei mögliche Strömungsrichtungen hat, löst der Algorithmus das Problem, sobald die Anfangsrichtung und die Kachel festgelegt sind.

Die Ballons scheinen einander zu folgen, einfach weil es nirgendwo anders gibt. Wenn sie sich alle mit konstanter Geschwindigkeit bewegen, sind keine Kollisionen möglich. Selbst wenn sie sich nicht mit konstanter Geschwindigkeit bewegen, kann das "nicht hier, nicht wo ich war und nicht Sand" angehängt werden "und sicherstellen, dass genügend Platz für mich vorhanden ist".

Sie können ein wenig verallgemeinern und das Bild der Kachel als Methode zum Extrahieren der Richtung verwenden. Zum Beispiel bedeutet ein L-förmiger Straßenstreifen entweder "Wenn Sie nach Süden fahren, dann biegen Sie nach Osten ab" oder "Wenn Sie nach Westen fahren, biegen Sie nach Norden ab".

Dieses System bricht zusammen, wenn Sie Entscheidungen treffen, dh es kann mehr als ein einzelner Pfad eingeschlagen werden, aber anhand Ihres Screenshots und der Beschreibung des Problems scheint dies kein Problem zu sein. Wenn dies für Ihre Anwendung erforderlich ist, sollten Sie auf jeden Fall in einen AI-zentrierten Ansatz investieren.

PatrickB
quelle