Unlimited WordPress themes, graphics, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Game Development
  2. Procedural Content Generation

Membuat Sistem Gua Bawah Tanah yang Dibuat Secara Prosedural

by
Difficulty:IntermediateLength:LongLanguages:

Indonesian (Bahasa Indonesia) translation by Dwi Bagus Nurrohman (you can also view the original English article)

Bagi banyak orang, generasi prosedural adalah konsep magis yang tidak bisa diraih. Hanya pengembang game veteran yang tahu cara membuat permainan yang bisa menciptakan levelnya sendiri ... kan? Ini mungkin tampak seperti sihir, tetapi PCG (procedural content generation) dapat dipelajari oleh pengembang game pemula. Dalam tutorial ini, saya akan menunjukkan kepada Anda bagaimana cara menghasilkan sistem gua bawah tanah secara prosedural.


Apa yang Akan Kita Ulas

Berikut adalah demo SWF yang menunjukkan jenis tata letak level yang dapat dihasilkan oleh teknik ini:


Klik SWF untuk menghasilkan level baru.

Mempelajari dasar-dasar biasanya berarti banyak pencarian dan eksperimen Google. Masalahnya adalah, ada beberapa panduan sederhana tentang bagaimana memulainya. Untuk referensi, berikut adalah beberapa sumber informasi yang sangat baik tentang hal ini, yang telah saya pelajari:

Sebelum masuk ke detailnya, ada baiknya untuk mempertimbangkan bagaimana kami akan menyelesaikan masalah. Berikut adalah beberapa bagian yang mudah dicerna yang akan kita gunakan untuk menjaga hal ini sederhana:

  1. Tempatkan secara acak konten yang Anda buat ke dunia game.
  2. Periksa bahwa konten ditempatkan di tempat yang masuk akal.
  3. Periksa apakah konten Anda dapat dijangkau oleh pemain.
  4. Ulangi langkah-langkah ini sampai level Anda menyatu dengan baik.

Setelah kami mengerjakan contoh-contoh berikut, Anda harus memiliki keterampilan yang diperlukan untuk bereksperimen dengan PCG dalam game Anda sendiri. Menyenangkan?


Di Mana Kami Menempatkan Konten Game Kami?

Hal pertama yang akan kita lakukan adalah secara acak menempatkan ruangan dari tingkat penjara bawah tanah yang dihasilkan secara prosedural.

Untuk mengikuti, ada baiknya untuk memiliki pemahaman dasar tentang cara kerja peta ubin. Jika Anda memerlukan gambaran singkat atau penyegaran, lihat tutorial peta ubin ini. (Ini diarahkan ke Flash tetapi, meskipun Anda tidak terbiasa dengan Flash, itu masih baik untuk mendapatkan inti dari peta ubin.)

Membuat Ruang untuk Ditempatkan di Tingkat Ruang BAwah Tanah Anda

Sebelum kita mulai, kita harus mengisi peta petak kita dengan ubin dinding. Yang perlu Anda lakukan adalah melakukan iterasi melalui setiap titik di peta Anda (array 2D, idealnya) dan tempatkan ubin.

Kita juga perlu mengkonversi koordinat pixel dari setiap persegi panjang ke koordinat grid kita. Jika Anda ingin pergi dari piksel ke lokasi grid, bagilah koordinat piksel dengan lebar petak. Untuk berpindah dari grid ke piksel, banyak koordinat grid dengan lebar petak.

Sebagai contoh, jika kita ingin menempatkan sudut kiri atas kamar kita di (5, 8) pada grid kita dan kita memiliki lebar ubin 8 piksel, kita perlu menempatkan sudut itu pada (5 * 8, 8 * 8) atau (40, 64) dalam koordinat piksel.

Mari kita buat kelas Room; mungkin terlihat seperti ini dalam kode Haxe:

Kita memiliki nilai untuk lebar setiap kamar, tinggi, posisi titik tengah, dan posisi empat sudut, dan fungsi yang memberi tahu kita apakah ruangan ini memotong yang lain. Perhatikan juga bahwa semua kecuali nilai x dan y berada dalam sistem koordinat grid kami. Ini karena membuat hidup lebih mudah untuk menggunakan angka kecil setiap kali kita mengakses nilai-nilai ruangan.

Oke, kita memiliki kerangka kerja untuk ruang di tempat. Sekarang bagaimana kita secara prosedural menghasilkan dan menempatkan sebuah ruangan? Yah, berkat generator bilangan acak built-in, bagian ini tidak terlalu sulit.

Yang harus kita lakukan adalah memberikan nilai acak x dan y untuk ruangan kita dalam batas-batas peta, dan memberikan nilai lebar dan tinggi acak dalam rentang yang telah ditentukan.

procedural-content-room-placement

Apakah Penempatan Acak Kita Menghasilkan Rasa?

Karena kami menggunakan lokasi dan dimensi acak untuk kamar kami, kami pasti akan tumpang tindih dengan kamar yang sebelumnya dibuat saat kami mengisi ruang bawah tanah kami. Yah, kita sudah mengkodekan sebuah metode intersects() sederhana untuk membantu kita mengatasi masalah.

Setiap kali kami mencoba untuk menempatkan ruangan baru, kami hanya memanggil intersects() pada setiap pasangan ruangan dalam seluruh daftar. Fungsi ini mengembalikan nilai Boolean: true jika ruang tumpang tindih, dan false sebaliknya. Kita dapat menggunakan nilai itu untuk memutuskan apa yang harus dilakukan dengan ruangan yang baru saja kita coba tempatkan.

procedural-content-intersection-diagram
Periksa kembali pada fungsi interseksi(). Anda dapat melihat bagaimana nilai x dan y tumpang tindih dan mengembalikan nilai true.

Kuncinya di sini adalah Boolean failed; itu diatur ke nilai balik dari intersects(), dan memang true jika (dan hanya jika) kamar Anda tumpang tindih. Setelah kami keluar dari loop, kami memeriksa variabel failed ini dan, jika itu salah, kami dapat mengukir ruangan baru. Jika tidak, kami hanya membuang kamar dan mencoba lagi sampai kami mencapai jumlah kamar maksimum kami.


Bagaimana seharusnya kita menangani konten yang tidak dapat dijangkau?

Sebagian besar game yang menggunakan konten yang dibuat secara prosedural berusaha untuk membuat semua konten tersebut dapat dijangkau oleh pemain, tetapi ada beberapa orang di luar sana yang percaya bahwa ini bukanlah keputusan desain terbaik. Bagaimana jika Anda memiliki beberapa kamar di ruang bawah tanah Anda yang jarang bisa didapatkan oleh pemain, tetapi selalu bisa melihat? Ini mungkin menambah dinamika yang menarik ke ruang bawah tanah Anda.

Tentu saja, tidak peduli sisi mana dari argumen yang Anda gunakan, mungkin masih merupakan ide yang baik untuk memastikan bahwa pemain dapat selalu maju melalui permainan. Akan sangat frustasi jika Anda sampai ke tingkat ruang bawah tanah permainan dan pintu keluar benar-benar diblokir.

Menimbang bahwa sebagian besar game mengambil 100% konten yang dapat dijangkau, kami akan tetap menggunakannya.

Mari Kita Tangani Kemampuan Sampainya

Sekarang, Anda harus memiliki peta ubin dan berjalan dan harus ada kode di tempat untuk membuat sejumlah variabel kamar dengan berbagai ukuran. Lihat itu; Anda sudah memiliki beberapa ruang penjara bawah tanah yang dihasilkan secara prosedural!

Sekarang tujuannya adalah untuk menghubungkan setiap ruangan sehingga kita dapat berjalan melalui ruang bawah tanah kita dan akhirnya mencapai jalan keluar yang mengarah ke tingkat berikutnya. Kita bisa mencapai ini dengan mengukir koridor di antara kamar-kamar.

Kita perlu menambahkan variabel point ke kode untuk melacak pusat dari setiap kamar yang dibuat. Setiap kali kita membuat dan menempatkan sebuah ruangan, kita menentukan pusatnya dan menghubungkannya dengan pusat kamar sebelumnya.

Pertama, kami akan menerapkan koridor:

Fungsi-fungsi ini bertindak dengan cara yang hampir sama, tetapi satu mengukir secara horizontal dan yang lainnya secara vertikal.

procedural-content-corridor-diagram-1

Menghubungkan ruang pertama ke ruang kedua membutuhkan vCorridor dan hCorridor.

Kami membutuhkan tiga nilai untuk melakukan ini. Untuk koridor horisontal, kita memerlukan nilai x awal, nilai akhir x, dan nilai y saat ini. Untuk koridor vertikal, kita memerlukan nilai awal dan akhir y dengan nilai x saat ini.

Karena kita bergerak dari kiri ke kanan, kita membutuhkan dua nilai x yang sesuai, tetapi hanya satu nilai y karena kita tidak akan bergerak naik atau turun. Ketika kita bergerak secara vertikal kita akan membutuhkan nilai y. Dalam for loop di awal setiap fungsi, kita mengulang dari nilai awal (x atau y) ke nilai akhir sampai kita mengukir seluruh koridor.

Sekarang setelah kita memiliki kode koridor di tempat, kita dapat mengubah fungsi placeRooms() dan memanggil fungsi koridor baru kami:

procedural-content-corridor-diagram-2

Pada gambar di atas, Anda dapat mengikuti pembuatan koridor dari ruang pertama hingga keempat: merah, hijau, lalu biru. Anda bisa mendapatkan hasil yang menarik tergantung pada penempatan ruangan - misalnya, dua koridor di samping satu sama lain membuat koridor dua kali lipat.

Kami menambahkan beberapa variabel untuk melacak pusat setiap kamar dan kami melampirkan kamar dengan koridor di antara pusat-pusat mereka. Sekarang ada beberapa ruang dan koridor yang tidak tumpang tindih yang membuat seluruh tingkat dungeon terhubung. Tidak buruk.

procedural-content-room-connection

Kita Selesai Dengan Bawah Tanah KIta, Kan?

Anda telah berhasil membangun ruang bawah tanah pertama yang dihasilkan secara prosedural, dan saya harap Anda telah menyadari bahwa PCG bukanlah makhluk ajaib yang tidak akan pernah Anda miliki untuk dibantai.

Kami membahas cara menempatkan konten secara acak di sekitar tingkat dungeon Anda dengan pembuat nomor acak sederhana, dan beberapa rentang yang telah ditentukan untuk menjaga konten Anda ukuran yang tepat dan kira-kira di tempat yang tepat. Selanjutnya, kami menemukan cara yang sangat sederhana untuk menentukan apakah penempatan acak Anda masuk akal dengan memeriksa ruang yang tumpang tindih. Terakhir, kami berbicara sedikit tentang manfaat menjaga konten Anda dapat dijangkau dan kami menemukan cara untuk memastikan bahwa pemain Anda dapat mencapai setiap ruangan di ruang bawah tanah Anda.

Tiga langkah pertama dari proses empat langkah kami selesai, yang berarti Anda memiliki blok bangunan dari ruang bawah tanah yang bagus untuk gim berikutnya. Langkah terakhir adalah untuk Anda: Anda harus mengulanginya dari apa yang Anda pelajari untuk membuat konten yang dihasilkan secara prosedural untuk replayability tak berujung.

Selalu Ada Lebih Banyak untuk Dipelajari

Metode untuk memahat tingkat dungeon sederhana dalam tutorial ini hanya menggores permukaan PCG dan ada beberapa algoritme sederhana lainnya yang dapat Anda ambil dengan mudah.

Tantangan saya untuk Anda adalah mulai bereksperimen dengan permulaan permainan Anda yang Anda buat di sini dan melakukan riset ke lebih banyak metode untuk mengubah ruang bawah tanah Anda.

Salah satu metode hebat untuk membuat level gua adalah menggunakan automata seluler, yang memiliki kemungkinan tak terbatas untuk menyesuaikan tingkat dungeon. Metode lain yang bagus untuk dipelajari adalah Binary Space Partitioning (BSP), yang menciptakan beberapa tingkat penjara bawah tanah yang tampak seperti kotak-kotak.

Saya harap ini memberi Anda lompatan awal yang baik dalam pembuatan konten prosedural. Pastikan untuk memberi komentar di bawah ini dengan pertanyaan apa pun yang Anda miliki, dan saya ingin melihat beberapa contoh dari apa yang Anda buat dengan PCG.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.