Saya ingin membuat generator kota untuk sebuah game, tetapi saya menghadapi masalah di awal generasi: sistem jalan.
Karena ini adalah dunia abad pertengahan, saya tidak ingin rencana grid seperti banyak kota modern. Idealnya saya lebih suka generasi pseudo-acak jalan besar dan jalan-jalan yang lebih kecil, di mana mungkin untuk tersesat, tetapi dengan masih beberapa logika - bukan labirin lengkap.
Sesuatu yang akan terlihat seperti kota yang tumbuh secara alami.
Untuk membuatnya tetap sederhana, katakanlah kota saya akan berada di dataran yang datar dan stabil, tanpa masalah penyeberangan sungai atau bantuan. Saya bisa mencoba mengintegrasikannya ke solusi setelah.
Saya tidak memutuskan ukuran atau disposisi yang tepat untuk kota saya, jadi jika Anda memiliki solusi yang hanya akan bekerja dengan kota-kota dengan bentuk yang tepat (persegi, lingkaran, persegi panjang dll), saya akan mengambilnya.
sumber
Jawaban:
Tempat yang baik untuk memulai dengan pembuatan kota prosedural adalah Pemodelan Kota menurut Paroki dan Muller . Makalah mereka menyajikan Sistem-L di mana aturan mengenai kepadatan populasi & pola jalan (kotak persegi panjang, radial & perubahan ketinggian minimum) digabungkan dan kemudian diperbaiki untuk mengakomodasi kendala lokal seperti front air & estetika jalan. Sementara hasil dari sistem ini mengesankan, telah dikritik sebagai hal yang tidak perlu rumit . Solusi alternatif Barrett disajikan kembali di blog dev Suku Cadang Rudzicz sebagai berikut:
Pendekatan ini menghilangkan sebagian besar simbol penulisan ulang housekeeping yang diwariskan di Parish dan Müller's L-System. Anda dapat melihat demo dari pendekatan ini di sini .
Manfaat dari pendekatan ini adalah bahwa itu adalah bentuk kota agnostik - Anda dapat menambahkan batasan garis besar sesuai kebutuhan, sehingga bentuk kota Anda dapat ditentukan oleh kebutuhan desain game Anda alih-alih algoritma. Tergantung pada ukuran kota Anda, ini mungkin cukup bagus. Berikut adalah hasil dari demo di atas dengan batas segmen 100: Tetapi jika Anda membutuhkan sesuatu yang besar, Anda mungkin mengalami masalah; inilah hasil dengan batas segmen 500:
Sebagian, Anda dapat menyesuaikan ini dengan mengubah aturan percabangan jalan, menghindari sudut 90 derajat, dll. Jika tata letak Anda masih terlalu teratur, inilah koreksi saya:
Ubah grid kota Anda menjadi grafik di mana setiap jalan adalah tepi & setiap persimpangan adalah sebuah simpul. Selanjutnya, gunakan algoritma apa pun yang Anda inginkan untuk mengubah grafik menjadi labirin . Inilah contoh terakhir yang diubah menjadi labirin:
Sekarang output memiliki masalah yang berlawanan, itu terlalu membingungkan. Tapi sekarang kita dapat menerapkan beberapa teknik dari Cara Rahasia Generator Penjara Bawah Tanah Jamis Buck . Pertama, tingkatkan sparseness dengan menghilangkan beberapa koridor jalan buntu. Selanjutnya, tingkatkan konektivitas dengan menambahkan jalan yang membuat loop (mis. Memperkenalkan siklus ke grafik). Inilah contoh hasil:
Catatan: dimungkinkan untuk mencapai hasil akhir yang sama langsung dari tahap tata letak berorientasi grid sebelumnya (sebelum menghasilkan labirin), dengan hanya menerapkan pemindahan tepi ke grid kota. Masalah dengan pendekatan itu adalah Anda harus memastikan menghapus tepi tidak mempartisi kota sehingga membuat bagian tidak terjangkau.
sumber
Jika Anda mencari rencana kota abad pertengahan / lama di Google, Anda akan menemukan banyak variasi yang berbeda, sebagian besar berdasarkan asal kota (mis. Penyelesaian acak vs. posisi militer terorganisir).
Saya berasumsi Anda sedang mencari pemukiman yang lebih alami / kacau.
Untuk ini saya akan mencoba pendekatan seperti ini:
sumber
Pertama-tama, ada banyak cara untuk melakukan generasi prosedural dan tidak ada yang mudah sama sekali, saya akan membuat semacam pendekatan bagaimana Anda bisa membuatnya bekerja, terserah Anda mengambilnya, memodifikasi atau membuangnya.
Akan pseudo-code di JS karena lebih mudah dimengerti.
1º menentukan titik masuk, karena Anda ingin membangun kota abad pertengahan, kita akan mulai dengan sebuah persegi, jadi katakanlah kota Anda akan memiliki 300 unit kuadrat dan alun-alun akan berada di tengahnya (diwakili dengan tanda X).
2º sekarang kita akan jalan, akan ada jumlah acak dari mereka, mereka akan lurus dan akan mulai dari alun-alun tengah atau dari jalan lain
Ini akan memberi Anda jalan utama persegi dan pasangan
Sekarang kita harus mengatur jalan yang tidak dimulai di alun-alun, mereka akan memotong jalan lain
Untuk mendapatkan vektor tegak lurus Anda harus menukar x, y cords dan meniadakan y baru:
Saat ini Anda harus memiliki sesuatu yang mirip dengan ini, bukankah itu terlihat seperti kota? : P
3º sekarang Anda hanya perlu menghubungkan jalan dengan jalan-jalan pendek, juga, Anda dapat menelurkan kotak acak di sepanjang kota dan membuat yang sama seperti di atas untuk semuanya, atau hanya menelurkan jalan-jalan kecil dari beberapa kotak sekunder, terserah Anda.
Ingat, jalan terpendek Anda adalah, kekacauan kota terlihat seperti.
sumber