Mengikuti jalan dengan mulus

9

Saat ini saya sedang membuat permainan pertahanan menara 2d dengan jalur statis yang telah ditentukan sebelumnya yang diikuti oleh musuh (menara tidak dapat memblokir jalan dan pencarian jalan bukanlah masalah yang saya coba pecahkan).

Saya mencoba mencari cara bagaimana membuat unit mengikuti jalur ini dengan mulus . Saya memiliki dua ide kasar tentang bagaimana melakukan ini, tetapi saya akan sangat menyukai beberapa masukan yang kemungkinan akan lebih mudah diterapkan / teknik yang lebih standar. Atau tentu saja jika saya ada beberapa cara yang sama sekali berbeda yang belum saya pertimbangkan, saya juga ingin belajar tentang itu.

Waypoint: Ide pertama saya adalah mendefinisikan path sebagai serangkaian waypoint yang dikodekan. Unit kemudian akan menggunakan algoritma kemudi "mencari" dasar (seperti yang ini ) untuk pindah ke setiap titik jalan di sepanjang jalan berturut-turut. Namun, saya bertanya-tanya apakah mungkin sulit untuk menjaga unit tidak menyimpang banyak dari jalur yang saya ingin mereka ikuti. Saya bertanya-tanya apakah ketidakmampuan untuk berubah cukup tajam dapat menyebabkan mereka "meluncur" keluar dari jalur yang diinginkan. Saya kira saya mungkin bisa mencegahnya dengan membiarkan kekuatan kemudi yang relatif kuat diterapkan?

Kurva Bezier: Solusi kedua yang saya pertimbangkan adalah mendefinisikan jalur dengan kurva bezier dan pada setiap langkah waktu hitung titik di sepanjang kurva dengan (dt * kecepatan) dari lokasi unit saat ini. Saya menduga bahwa teknik ini akan membuatnya jauh lebih mudah untuk secara tepat menentukan jalur yang akan diikuti oleh unit, tetapi saya tidak tahu persis bagaimana cara mengimplementasikannya. Ada saran?

Juga, saya tidak melakukan ini akan mengubah jawaban siapa pun, tetapi unit juga harus dapat melakukan perjalanan dengan kecepatan konstan di sepanjang jalan. Selain itu, saya pemrograman game ini di python menggunakan kerangka pyglet.

Jika ada sesuatu tentang pertanyaan yang tidak jelas, beri tahu saya.

Sunting: Juga untuk apa pun nilainya, saya semacam mencoba meniru perilaku pergerakan musuh di Kingdom Rush .

Pwnosaurus
sumber
Relevan: gamasutra.com/view/feature/131505/… Jenis kepadatan / ukuran apa yang relatif terhadap ubin yang Anda gunakan?
Monyet
Saya akan lihat artikel itu! Saya sebenarnya tidak menggunakan ubin, hanya koordinat terus menerus untuk menentukan posisi. Hanya akan ada gambar latar belakang statis yang menunjukkan pemain di mana unit akan bergerak.
Pwnosaurus
Saya juga menemukan. gamedev.stackexchange.com/questions/26543/... A * bekerja pada peta non-grid. Itu bisa menjadi jalur simpul di kerajaan yang akan melengkung dengan cara yang sama.
Monyet
Adakah yang bisa menyebabkan musuh meninggalkan jalan dan harus kembali ke sana? Saya bertanya karena proposal Bezier-curve Anda menunjukkan tidak ada, dalam hal ini tidak ada alasan Anda tidak dapat melakukan precompute data arbitrer tentang seluruh jalur dan tidak ada logika "AI" yang diperlukan.
Kevin Reid

Jawaban:

8

Izinkan saya untuk memperkenalkan Anda pada makalah terkenal Craig Reynolds tentang Steering Behaviors For Autonomous Characters . Jika Anda belum membacanya, Anda harus, itu akan membantu Anda memikirkan masalah-masalah semacam ini, khususnya lihat bagian tentang pencarian jalan .

masukkan deskripsi gambar di sini

Gagasan dari makalah Reynolds adalah bahwa Anda dapat menggunakan kekuatan sederhana yang bergabung untuk menghasilkan navigasi improvisasi yang hidup di sekitar lingkungan. Gerakan-gerakan ini tidak didasarkan pada perencanaan jalur atau perhitungan global, melainkan menggunakan informasi lokal, seperti kekuatan tetangga, yang membuatnya mudah dipahami dan diimplementasikan, tetapi masih menghasilkan pola pergerakan yang sangat kompleks.

Keindahan dari pendekatan ini adalah Anda dapat menggabungkan beberapa perilaku menjadi satu. Jadi, misalnya, karakter Anda mungkin memiliki perilaku pencarian jalur serta perilaku pemisahan (agar tidak terlalu menggumpal), yang dapat digabungkan sebagai jumlah terbobot.

Manfaat lain menggunakan perilaku kemudi adalah bahwa ada sejumlah implementasi open source yang ada dalam berbagai bahasa (misalnya, opensteer ).


UPDATE: Saya melihat Kingdom Rush, dan saya pikir saya mungkin telah salah mengerti apa yang Anda maksud dengan "lancar." Saya menganggapnya lebih seperti hidup, tapi saya pikir apa yang Anda cari lebih seperti karakter yang ada di jalur kereta. Juga, membaca lebih hati-hati, saya melihat bahwa salah satu persyaratan Anda adalah bahwa "unit harus dapat melakukan perjalanan dengan kecepatan konstan di sepanjang jalan." Perilaku kemudi tidak akan memberi Anda kecepatan gerakan yang konstan, tetapi penelusuran jalan sederhana dikombinasikan dengan titik arah akan. (Yaitu, jangan gunakan perilaku "mencari" untuk sampai ke titik arah, sebaliknya cukup tentukan vektor arah dan minta unit bergerak dengan kecepatan penuh ke titik arah itu.) Gunakan lebih banyak titik arah untuk memuluskan rute.

Cameron Fredman
sumber
2

Solusi dalam artikel Gamasutra ini mungkin yang Anda cari. Ide dasarnya adalah untuk melemparkan sinar ke titik lewat yang dua langkah di depan titik arah Anda saat ini "melangkah" sinar sedikit dari panjang sel dan pada setiap "melangkah" sinar memeriksa untuk melihat apakah volume tabrakan pemain Anda bertabrakan dengan apa pun pada posisi melangkah dari sinar. Jika sinar sampai ke titik lewat yang dua langkah di depan, maka Anda dapat menyingkirkan titik arah perantara. Anda kemudian dapat melanjutkan proses yang sama ini sampai ke waypoint "tujuan" ... jadi jika jalur Anda dapat dicapai dengan garis lurus ke tujuan, garis lurus ke tujuan adalah rute yang akan diambil oleh karakter Anda. inilah artikelnya: http://www.gamasutra.com/view/feature/131505/toward_more_realistic_pathfinding.

Ini juga berisi hal-hal hebat tentang radius belokan dan perilaku belok yang lebih alami dan ...

Austin
sumber