¿Cómo hago que los objetos se muevan a lo largo de un camino?

7

Estoy tratando de obtener algo como la imagen de abajo. Como puede ver, hay una carretera y dentro de ella, habrá algunos objetos en movimiento (milisegundos). Supongo que el comportamiento de la calle es como una tubería. Cuando la carretera carga un objeto, aparece al principio y se moverá a través de la carretera hasta que llegue al otro extremo de la carretera.

Mi principal problema es, ¿cómo puedo mover varios objetos solo dentro de la carretera?

captura de pantalla de bloons td4 nivel 1

oscar.fimbres
fuente

Respuestas:

17

Eso depende: ¿cómo quieres que se muevan?

La opción antinatural

Defina una ruta preestablecida con una serie de vértices y haga que los globos sigan la ruta estrictamente.

Una opción más natural

Haga que los globos se hinchen e implemente el comportamiento de seguimiento de la multitud , lo que hará que sigan el camino (y no se alejen demasiado) mientras evitan la colisión entre ellos. Ambas páginas contienen ejemplos de applet de Java.

El autor de esas páginas señala que no puede distribuir el código fuente de los ejemplos, sin embargo, OpenSteer ofrece implementaciones en C ++ de esos algoritmos.

(No conozco ninguna biblioteca de boids de C # ni ningún tutorial decente; lo mejor que he hecho es seguir los ejemplos de código)

doppelgreener
fuente
+1 para una buena respuesta. Creo que un simple seguimiento de ruta es lo único que se necesita para simular el comportamiento representado. Los comportamientos de dirección serán útiles, cuando el camino se ensanche repentinamente o aparezcan obstáculos donde se formen las "barreras".
bummzack
Creo que la primera opción sería más fácil. ¿Es posible que me puedas mostrar un ejemplo?
oscar.fimbres
@ oscar.fimbres: Eso debería ser bastante simple. Simplemente cree una lista de coordenadas de puntos de referencia (por ejemplo, una matriz), tome la primera coordenada como objetivo y mueva su agente en esa dirección. Una vez que el agente llegue al punto de referencia, tome el siguiente como objetivo. Si el agente se mueve con velocidad constante, también puede asignar fácilmente cualquier sobreimpulso al siguiente objetivo.
bummzack
Sí, me puedo imaginar ... Estoy revisando el sitio: enchantedage.com/node/78 Aunque, puedo mover mi sprite en ese camino
oscar.fimbres
En mi opinión, boids es excesivo para un problema tan simple. El movimiento en cualquier momento dado es esencialmente 1D y no está sujeto a una dirección inversa. Es probable que cualquier comportamiento de dirección sea extremadamente simple y realmente no garantice ese tipo de sistema. Además, los globos no actuarían como una bandada, actúan de manera autónoma y no muestran intentos reales de mantener la "bandada", simplemente están atrapados en una carretera y todos van en la misma dirección. Esa es una coincidencia, no un comportamiento programado explícitamente. Tratarlos como una bandada realmente no tiene ningún sentido, incluso en el contexto de la conducción. ¿Sigues a todos?
PatrickB
4

Necesitas una lista de puntos y una lista de globos

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
fuente
3

Si tiene un camino formado por mosaicos con un solo camino ("tubería" como lo llamó), entonces no necesita boids, evitación, IA, o realmente algo súper especial. Solo haga que cada globo se mueva en la dirección natural de la loseta del camino. Por ejemplo, dado un mosaico inicial con solo un mosaico que no sea de arena para tocar, puede determinar qué dirección mover: es la dirección que "no está aquí, no donde estaba, y no arena". Dado que su camino tiene solo dos posibles direcciones de flujo, una vez que se establecen la dirección inicial y el mosaico, el algoritmo resolverá el problema.

Los globos parecerán seguirse entre sí simplemente porque no hay otro lugar a donde ir. Si todos se mueven a una velocidad constante, entonces no hay colisiones posibles. Incluso si no se mueven a una velocidad constante, el "no aquí, no donde estaba, y no arena" se puede tener "y asegúrese de que haya suficiente espacio para mí".

Podría generalizar un poco y utilizar la imagen del mosaico como método de extracción de dirección. Por ejemplo, una franja de carretera en forma de L significa "si va hacia el sur, luego gire hacia el este" o "si va hacia el oeste, gire hacia el norte".

Este sistema se descompone cuando toma una decisión, es decir, más de un camino que se puede tomar, pero de su captura de pantalla y descripción del problema, eso no parece ser un problema. Si es un requisito para su aplicación, definitivamente invierta en un enfoque más centrado en la inteligencia artificial.

PatrickB
fuente