Saya telah melihat beberapa algoritma dan artikel tentang cara membuat dungeon secara prosedural. Masalahnya adalah, saya mencoba membuat rumah dengan kamar, dan sepertinya tidak sesuai dengan kebutuhan saya.
Pertama, ruang bawah tanah memiliki koridor, di mana rumah-rumah memiliki aula. Dan meskipun pada awalnya mereka mungkin tampak sama, sebuah aula tidak lebih dari area yang bukan ruangan, sedangkan koridor dirancang khusus untuk menghubungkan satu area ke area lainnya.
Perbedaan penting lainnya dengan sebuah rumah adalah bahwa Anda memiliki lebar dan tinggi yang spesifik, dan Anda harus mengisi semuanya dengan kamar dan aula, sedangkan dengan ruang bawah tanah, ada ruang kosong.
Saya pikir aula di sebuah rumah adalah sesuatu di antara koridor penjara bawah tanah (membawa Anda ke kamar lain) dan ruang kosong di penjara bawah tanah (itu tidak didefinisikan secara eksplisit dalam kode).
Lebih khusus lagi, persyaratannya adalah:
- Ada satu set kamar standar yang
tidak bisa saya buat dinding dan pintu dengan cepat. - Kamar dapat diputar tetapi tidak diubah ukurannya
lagi, karena saya memiliki seperangkat kamar yang telah ditentukan, saya hanya bisa memutarnya, bukan mengubah ukurannya. - Dimensi rumah diatur dan harus sepenuhnya diisi dengan kamar (atau aula)
Yaitu saya ingin mengisi rumah 14x20 dengan kamar yang tersedia memastikan tidak ada ruang kosong.
Berikut ini beberapa gambar untuk membuatnya lebih jelas:
Seperti yang Anda lihat, di dalam rumah, "ruang kosong" masih bisa dilalui dan membawa Anda dari satu ruangan ke ruangan lain.
Jadi, setelah mengatakan semua ini, mungkin sebuah rumah hanyalah penjara bawah tanah yang benar-benar sangat padat dengan koridor. Atau itu sesuatu yang lebih mudah daripada penjara bawah tanah. Mungkin ada sesuatu di luar sana dan saya belum menemukannya karena saya tidak benar-benar tahu apa yang harus dicari.
Di sinilah saya ingin bantuan Anda: dapatkah Anda memberi saya petunjuk tentang cara mendesain algoritma ini? Adakah pemikiran tentang langkah apa yang akan diambil? Jika Anda telah membuat generator penjara bawah tanah, bagaimana Anda memodifikasinya agar sesuai dengan kebutuhan saya? Anda dapat spesifik atau generik yang Anda inginkan. Saya mencari untuk memilih otak Anda, sungguh.
Jawaban:
Saya pikir ini adalah kasus yang baik untuk menggunakan partisi ruang biner atau terner.
Pada pass pertama, pisahkan ruang rumah menjadi aula dan {blok kamar}. Dapatkan potongan besar berikutnya, pisahkan menjadi {hall and chunk} atau {2 chunks dan hall di antara mereka}. Pada setiap langkah, putar arah pengirisan 90 derajat. Berhentilah ketika {tidak ada lagi potongan besar yang tersisa} atau {total luas aula mencapai batas}.
Pada pass kedua, pisahkan potongan yang tersisa menjadi kamar. Dapatkan potongan besar berikutnya dan membaginya. Lewati membelah beberapa potongan yang tidak terlalu besar secara acak, untuk memiliki beberapa kamar besar.
Jika ada aula yang menghadap aula yang jauh lebih tua, letakkan dinding (atau dinding dengan pintu) di sana.
Hubungkan kamar dengan aula secara langsung atau melalui kamar lain yang sudah terhubung.
Misalnya, Anda dapat melihat hasil buatan saya atau C ++ - mirip dengan pseudo-code yang sebagian sudah selesai . Tembakan terakhir:
sumber
L-system
.Anda dapat mengambil keuntungan dari kenyataan bahwa desain yang Anda inginkan menggumpalkan kamar-kamar di kamar persegi panjang yang dikelilingi oleh koridor. Dengan mengingat hal itu, saya akan melakukan ini:
Mengisi ruang besar dengan kamar dapat dilakukan dengan mudah jika Anda mulai dengan kamar di perbatasan - mereka memiliki kendala khusus, misalnya kamar yang menghadap koridor dapat memiliki pintu di dinding itu, tetapi kamar yang menghadap ke "dinding luar" tidak bisa (mereka bisa punya windows, mungkin). Kamar "di dalam" blok-blok besar kamar akan membutuhkan setidaknya satu pintu masuk.
sumber
Jadi, inilah cara saya memecahkan masalah ini. Tapi pertama-tama, saya ingin mengucapkan terima kasih kepada @Shadows In Rain dan @egarcia atas jawaban mereka. Mereka memberi saya arahan yang baik yang membantu saya mendapatkan beberapa hasil.
Saya menggunakan partisi ruang Shadows In Rain untuk menghasilkan rumah dasar dan kemudian mengikuti saran egarcia untuk mengisi area dengan kamar.
Partisi ruang cukup mudah karena 90% dari kode dilakukan oleh Shadows. Bagian "isi kamar" sedikit lebih menantang. Saya memutuskan untuk menggunakan sistem AI Perencanaan palsu yang menggunakan A * untuk memposisikan kamar dengan tepat. Hal yang baik tentang menggunakan perencanaan dan bukan hanya A * adalah bahwa prasyarat membantu mengurangi ruang pencarian secara signifikan.
Berikut adalah beberapa tangkapan layar dengan hasilnya:
Tahap pembuatan denah lantai
Fase penempatan kamar
Sekarang dengan pintu penghubung!
sumber
Dahl & Rinde memiliki makalah tesis tentang Generasi Prosedural Lingkungan Dalam Ruangan yang menggunakan pendekatan kerangka & daerah untuk mengisi interior bangunan dengan kamar dan lorong. Makalah ini menyertakan diagram kelas untuk prototipe mereka. Ada juga beberapa referensi bagus dalam bibliografi mereka, termasuk A Pattern Language .
Pekerjaan mereka dirancang berdasarkan asumsi penyederhanaan berikut:
Berikut ini ikhtisar singkat proses mereka:
Akhirnya, apartemen dibagi menjadi kamar-kamar menggunakan diagram seperti Voronoi tertimbang sebagai dasar sebagai berikut:
sumber