Bagaimana saya bisa menghasilkan jalur penjara bawah tanah (relatif)?


8

Kami mengembangkan konsep untuk scroller samping aksi. Yang kita butuhkan adalah cara untuk menghasilkan peta lurus (relatif). Maksud saya sesuatu seperti ...

masukkan deskripsi gambar di sini

Jelas terlihat bahwa peta ini mengikuti satu rute sederhana, meskipun sedikit menyimpang. Dengan itu, kita juga akan menerapkan jalur yang menyimpang - pintasan, atau bagian rahasia. Agar, mungkin, untuk mendapatkan dari wilayah yang dilingkari ketiga ke yang keempat, Anda akan memiliki jalur utama, dan lorong rahasia yang dipenuhi dengan musuh yang lebih kuat, tetapi lebih cepat dan memiliki hadiah yang lebih tinggi.

Di sini kita telah mencapai jalan buntu. Kami sedang mengeksplorasi beberapa opsi tetapi belum benar-benar membuat kemajuan. Pendekatan apa yang bisa kami gunakan untuk menghasilkan jalur semacam ini. Kami tidak terikat oleh bahasa pemrograman, karena sejauh ini kami telah bereksperimen dengan Java, C # dan C ++. Demikian pula, kami tidak memiliki ketergantungan saat ini pada mesin game tertentu.


11
Saya akan menambahkan bahwa tidak jelas apa hasil akhir yang Anda cari. 'Peta' yang Anda tampilkan adalah tampilan top-down suatu wilayah. Anda sedang mengembangkan pengontrol sisi 2d . Bagaimana hubungannya 2?
Vaillancourt

Saya menghapus frasa "terbaik" dari pertanyaan Anda, karena itu tidak terlalu membantu. Saya juga menghapus tiga pendekatan yang Anda sarankan, yang semuanya berpotensi jawaban valid. Secara umum lebih baik jika Anda tidak menyertakan solusi potensial dalam pertanyaan Anda karena membandingkan solusi yang disediakan umumnya bukan pertanyaan yang kami pertimbangkan pada topik di sini (tetapi menanyakan cara mengatasi masalah jika tidak ada bias solusi yang ada biasanya). Saya juga membersihkan beberapa obrolan komentar yang saya rasa dihindarkan oleh suntingan.

1
Garis itu hampir persis seperti apa yang saya dapatkan ketika saya mulai dengan garis lurus dan menambahkan suara perlin (atau simpleks) ke dalamnya (beberapa oktaf). Mungkin menjadi area yang perlu dijelajahi (saya menciptakan waktu dinamis dengan beragam cahaya)
Richard Tingle

Jawaban:


15

Persyaratan

  1. Anda ingin beberapa jalur dari A ke B.
  2. Anda ingin bekerja di ruang grid, mungkin ini adalah ruang ubin untuk scroller samping Anda.
  3. Anda tidak ingin jalur untuk dilintasi, atau itu akan merusak perkembangan game.
  4. Anda ingin jalan terlihat cukup organik.

Diagram Voronoi

Diagram Voronoi adalah ruang-mengisi, grafik planar:

masukkan deskripsi gambar di sini

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 nkoordinat 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:

masukkan deskripsi gambar di sini

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 ntitik 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:

masukkan deskripsi gambar di sini

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.


Saya membuat generator peta menggunakan Voronoi dan Perlin Noise di Jawa, mungkin ini bisa bermanfaat bagi Anda sebagai titik awal: github.com/dragondgold/Map-Generator
Andres
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.