Как заставить объекты двигаться по дорожке?

7

Я пытаюсь получить что-то вроде изображения ниже. Как видите, есть шоссе, а внутри него будут двигаться некоторые объекты (миллисекунды). Я думаю, что уличное поведение похоже на трубопровод. Когда шоссе загружает объект, оно появляется в начале и будет двигаться по шоссе до тех пор, пока не достигнет другой крайности шоссе.

Моя главная проблема, как я могу перемещать несколько объектов только внутри шоссе?

снимок экрана с bloons td4 level 1

oscar.fimbres
источник

Ответы:

17

Это зависит от того, как вы хотите, чтобы они двигались?

Неестественный вариант

Определите заранее заданный путь с помощью серии вершин и следуйте, чтобы воздушные шары строго следовали пути.

Более естественный вариант

Сделайте воздушные шары Boids и реализовать путь толпы следующего поведения , которые должны им следовать по пути (и не слишком далеко от него), избегая столкновения друг с другом. Обе эти страницы содержат примеры Java-апплетов.

Автор этих страниц отмечает, что он не может распространять исходный код примеров, однако OpenSteer предлагает реализации этих алгоритмов на C ++.

(Я не знаю ни о каких библиотеках C # boids или о приличных уроках - лучшее, что я сделал, это просто следую примеру кода)

doppelgreener
источник
+1 за хороший ответ. Я думаю, что простое следование по пути - единственное, что необходимо для имитации изображенного поведения. Поведение рулевого управления пригодится, когда путь внезапно расширится или появятся препятствия на пути к очереди.
bummzack
Я думаю, что первый вариант будет проще. Можно ли показать мне пример?
oscar.fimbres
@ oscar.fimbres: Это должно быть довольно просто. Просто создайте список координат путевой точки (например, массив), возьмите первую координату в качестве цели и переместите вашего агента в этом направлении. Как только агент достигнет путевой точки, возьмите следующую в качестве цели. Если агент движется с постоянной скоростью, вы также можете легко сопоставить любое превышение с следующей целью.
bummzack
Да, я могу себе представить ... Я проверяю сайт: enchantedage.com/node/78 Хотя я могу заставить мой спрайт двигаться по этому пути
oscar.fimbres
ИМО, boids излишне для такой простой проблемы. Движение в любой момент времени по существу является одномерным и не подвержено даже обратному направлению. Любое поведение рулевого управления, скорее всего, будет чрезвычайно простым и не гарантирует такой системы. Кроме того, воздушные шары не будут действовать как стадо, они действуют автономно и не показывают никаких реальных попыток сохранить «стадо» - они просто застряли на дороге и все движутся в одном направлении. Это совпадение, а не явно запрограммированное поведение. Относиться к ним как к стаду не имеет никакого смысла даже в контексте вождения. Ты следишь за всеми?
PatrickB
4

Вам нужен список очков и список воздушных шаров

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
источник
3

Если у вас есть дорога, составленная из плиток с одним путем («конвейер», как вы ее назвали), то вам не нужны боиды, уклонение, искусственный интеллект или что-то супер особенное. Просто заставьте каждый воздушный шар двигаться в естественном направлении дорожной плитки. Например, учитывая исходную плитку, к которой нужно прикоснуться только одной не песчаной плитке, вы можете выяснить, в каком направлении двигаться - это направление, которое «здесь, не там, где я был, и не в песке». Поскольку ваша дорога имеет только два возможных направления потока, после определения начального направления и тайла алгоритм решит проблему.

Воздушные шары будут следовать друг за другом просто потому, что больше некуда идти. Если они все движутся с постоянной скоростью, то столкновения невозможны. Даже если они не двигаются с постоянной скоростью, можно добавить «не здесь, не там, где я был, и не песок» и убедиться, что для меня достаточно места ».

Вы можете немного обобщить и использовать изображение плитки как метод определения направления. Например, L-образная полоса дороги означает либо «если вы идете на юг, то поверните на восток», либо «если вы идете на запад, поверните на север».

Эта система выходит из строя, когда вы принимаете решение, то есть больше, чем один путь, который можно выбрать, но из вашего скриншота и описания проблемы это не кажется проблемой. Если это требование для вашего приложения, тогда определенно инвестируйте в более ориентированный на AI подход.

PatrickB
источник