Bagaimana cara membuat objek bergerak di sepanjang jalan?

7

Saya mencoba untuk mendapatkan sesuatu seperti gambar di bawah ini. Seperti yang Anda lihat, ada jalan raya dan di dalamnya, akan ada beberapa objek bergerak (milidetik). Saya kira perilaku jalanan itu seperti pipa. Ketika jalan raya memuat objek, itu muncul di awal dan itu akan bergerak melalui jalan raya sampai tiba di ujung lain jalan raya.

Masalah utama saya adalah, bagaimana saya bisa memindahkan beberapa objek hanya di dalam jalan raya?

tangkapan layar dari bloon td4 level 1

oscar.fimbres
sumber

Jawaban:

17

Itu tergantung: bagaimana Anda ingin mereka pindah?

Pilihan yang tidak wajar

Tentukan jalur yang telah ditetapkan dengan serangkaian simpul dan minta balon mengikuti jalur dengan ketat.

Opsi yang lebih alami

Membuat balon boids dan menerapkan jalur kerumunan berikut perilaku , yang akan memiliki mereka mengikuti jalan (dan tidak terlalu jauh dari itu) sementara menghindari tabrakan dengan satu sama lain. Kedua halaman tersebut berisi contoh applet Java.

Penulis halaman-halaman tersebut mencatat bahwa ia tidak dapat mendistribusikan kode sumber dari contoh-contoh, namun OpenSteer menawarkan implementasi C ++ dari algoritma tersebut.

(Saya tidak mengetahui adanya perpustakaan C # boids, atau tutorial yang layak - yang terbaik yang saya lakukan adalah cukup ikuti contoh kode)

doppelgreener
sumber
+1 untuk jawaban yang bagus. Saya pikir bahwa mengikuti jalur sederhana adalah satu-satunya hal yang diperlukan untuk mensimulasikan perilaku yang digambarkan. Perilaku kemudi akan berguna, ketika jalan tiba-tiba menjadi lebih luas atau hambatan muncul di mana "boids" akan mengantri.
bummzack
Saya pikir opsi pertama akan lebih mudah. Mungkinkah Anda bisa memberi saya contoh?
oscar.fimbres
@ oscar.fimbres: Itu seharusnya cukup sederhana. Cukup buat daftar koordinat titik jalan (mis. Array), ambil koordinat pertama sebagai target dan pindahkan agen Anda ke arah itu. Setelah agen mencapai titik lewat, ambil yang berikutnya sebagai target. Jika agen bergerak dengan kecepatan konstan, Anda juga dapat dengan mudah memetakan setiap overshoot ke target berikutnya.
bummzack
Ya, saya bisa membayangkan .. Saya sedang memeriksa situs: enchantedage.com/node/78 Meskipun, saya bisa memindahkan sprite saya di jalur itu
oscar.fimbres
IMO, boid terlalu banyak untuk masalah sederhana. Gerakan pada waktu tertentu pada dasarnya adalah 1D dan tidak dikenakan arah balik. Setiap perilaku kemudi cenderung sangat sederhana dan tidak benar-benar menjamin sistem semacam itu. Selain itu, balon tidak akan bertindak sebagai kawanan, mereka bertindak secara mandiri tidak menunjukkan upaya nyata untuk mempertahankan "kawanan" - mereka hanya terjebak di jalan dan semuanya berjalan ke arah yang sama. Itu kebetulan, bukan perilaku yang diprogram secara eksplisit. Memperlakukan mereka seperti kawanan tidak benar-benar masuk akal bahkan dalam konteks mengemudi. Apakah Anda mengikuti semua orang?
PatrickB
4

Anda perlu daftar poin dan daftar balon

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

Jika Anda memiliki jalan yang terbuat dari ubin dengan jalur tunggal ("pipa" seperti yang Anda sebutkan), maka Anda tidak perlu boids, avoidance, AI, atau benar-benar sesuatu yang sangat istimewa. Hanya minta setiap balon bergerak ke arah alami ubin jalan. Misalnya, mengingat ubin awal dengan hanya satu ubin non-pasir untuk disentuh, Anda dapat menentukan arah mana yang akan dipindahkan - itu adalah arah yang "tidak ada di sini, bukan di mana saya berada, dan bukan pasir". Karena jalan Anda hanya memiliki dua kemungkinan arah aliran, setelah arah awal dan ubin ditetapkan, algoritme akan menyelesaikan masalah.

Balon akan muncul untuk mengikuti satu sama lain hanya karena tidak ada tempat lain untuk pergi. Jika mereka semua bergerak dengan kecepatan konstan, maka tidak mungkin terjadi tabrakan. Bahkan jika mereka tidak bergerak dengan kecepatan konstan, "tidak ada di sini, tidak di mana aku berada, dan tidak ada pasir" yang bisa didapat "dan memastikan ada cukup ruang untukku" ditambahkan.

Anda bisa menggeneralisasi sedikit dan menggunakan gambar ubin sebagai metode ekstraksi arah. Misalnya, garis jalan berbentuk huruf L berarti "jika Anda pergi ke selatan, lalu belok ke timur" atau "jika Anda pergi ke barat, belok ke utara".

Sistem ini rusak ketika Anda mengambil keputusan untuk melakukan, yaitu lebih dari satu jalur yang dapat diambil, tetapi dari tangkapan layar Anda dan deskripsi masalah, itu tampaknya tidak menjadi masalah. Jika itu merupakan persyaratan untuk aplikasi Anda, maka jelas berinvestasi dalam pendekatan yang lebih AI-sentris.

PatrickB
sumber