Persyaratan
- Anda ingin beberapa jalur dari A ke B.
- Anda ingin bekerja di ruang grid, mungkin ini adalah ruang ubin untuk scroller samping Anda.
- Anda tidak ingin jalur untuk dilintasi, atau itu akan merusak perkembangan game.
- Anda ingin jalan terlihat cukup organik.
Diagram Voronoi
Diagram Voronoi adalah ruang-mengisi, grafik planar:
Satu hal yang menyenangkan tentang mereka adalah bagaimana Anda dapat menggunakannya untuk membuat jalur organik. Jika Anda menggambar garis lurus dari pusat ke pusat, Anda akan mendapatkan jalur (baca: non-ortholinear) yang tidak terduga.
Cara membuat Diagram Voronoi untuk digunakan dengan sistem berbasis ubin
Buat peta dengan ukuran yang masuk akal, misalnya 128x128. Hasilkan n
koordinat kotak acak (x, y) di peta dan isi masing-masing dengan id / warna unik. Buat daftar untuk warna itu, dan tambahkan sel awal itu ke dalamnya; lakukan ini untuk setiap warna.
Sekarang Anda memiliki titik-titik warna unik mengambang di kekosongan, tetapi Anda perlu membuat seluruh pulau warna di sekitar mereka, dengan hasil akhirnya terlihat seperti ini:
Untuk melakukan itu kita perlu melihat warna mana yang memiliki setiap sel di peta (sel = piksel pada gambar di atas). Kami menjalankan melalui setiap sel di peta, memeriksa n
titik warna awal mana yang paling dekat dengannya (melalui pythagoras). Sel itu masuk ke dalam daftar yang terkait dengan id / warna unik itu ... selanjutnya disebut sebagai pulau sel AKA Voronoi (dalam diagram di atas, kelompok piksel dengan warna yang sama).
Anda sekarang harus memiliki diagram Voronoi yang di-quantis. Langkah selanjutnya adalah menganalisis kedekatan masing-masing pulau dengan pulau-pulau lain. Siapkan simpul dan tepi sederhana struct sehingga Anda dapat menyimpan grafik (simpul hanya id, daftar untuk id itu, dan daftar tepi kosong; tepi hanya simpul awal dan akhir). Untuk setiap pulau id'ed unik, buat simpul, dan tambahkan tepi untuk menautkannya ke setiap pulau yang berdekatan.
Setelah Anda memiliki diagram (grafik) lengkap, Anda mendapatkan bagian yang menyenangkan - gunakan grafik untuk menemukan rantai pulau, dan dengan membuat semua sel di setiap pulau dalam rantai memiliki ID yang sama, Anda membuat salah satu dari jalanmu. Katakanlah sebuah pulau dengan semua sel yang memiliki ID 503 berada di sebelah sebuah pulau dengan id 657. Anda dapat mengganti semua 503 sel dengan ID 657, sehingga menciptakan satu pulau yang lebih besar dengan 657 yang berdekatan.
Misalnya - merah adalah jalur 1, biru adalah jalur 2, magenta keduanya:
Anda dapat menggunakan algoritme grafik yang ada (termasuk A *) untuk menghasilkan jalur dari awal hingga selesai. Mendapatkan jalur berkelok-kelok adalah kasus tidak selalu menggunakan langkah optimal menuju pulau tujuan.
Terakhir, sepele untuk mengecilkan pulau jika Anda ingin jalur yang lebih sempit, atau menggunakan peta yang lebih besar dengan lebih banyak pulau untuk mendapatkan resolusi yang lebih baik.
Langkah opsional, akhir, untuk merintis jalan
Entah Anda dapat menggunakan grafik tingkat tinggi yang Anda bangun bersama dengan sel / ubin yang mendasari untuk melakukan runtime A *, ATAU Anda dapat melakukan Hill climbing pada sel / ubin yang mendasarinya untuk gerakan yang lebih baik:
Di pusat (atau apa pun) koordinat pulau tujuan Anda, Anda dapat menempatkan sel pengaruh. Pengaruh ini dapat memompa "aroma" seperti pada Difusi Kolaboratif . Aroma ini akan menyebar sepanjang jalan kembali ke apa yang merupakan pulau awal, semakin lemah dan semakin lemah seiring berjalannya waktu. Sekarang untuk entitas di awal, kami hanya naik dari sel beraroma lebih rendah ke yang beraroma lebih tinggi, setiap kali membawa Anda lebih dekat ke tujuan - cara yang sama seperti anjing beroperasi. Setiap jalur secara linier, ini memungkinkan Anda untuk menghindari penggunaan A * saat runtime. Atau Anda dapat melakukan hal yang sama dengan grafik pulau, tetapi cara itu sedikit lebih rumit karena Anda mungkin ingin menavigasi entitas Anda di tingkat ubin. Jadi cara pertama mungkin lebih baik. Cara mana pun akan memungkinkan Anda menavigasi ke tujuan dengan biaya pemrosesan yang rendah.