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

Perwakilan Grafik Pemandangan JawaFX.

by
Difficulty:IntermediateLength:LongLanguages:

Malay (Melayu) translation by Seurion (you can also view the original English article)

Bagi ramai, generasi prosedur adalah konsep ajaib yang tidak dapat dicapai. Hanya pemaju permainan veteran tahu bagaimana untuk membina permainan yang boleh mencipta tahap sendiri ... betul? Ia mungkin kelihatan seperti sihir, tetapi PCG (penjanaan kandungan prosedur) boleh dipelajari oleh pemaju permainan pemula. Dalam tutorial ini, saya akan menunjukkan kepada anda cara untuk menghasilkan sistem gua bawah tanah.


Apa yang Akan Kami Tutup

Berikut adalah demo SWF yang menunjukkan jenis susun atur tahap yang teknik ini dapat menghasilkan:


Klik SWF untuk menghasilkan tahap baru.

Belajar asasnya biasanya bermaksud banyak mencari dan eksperimen Google. Masalahnya, terdapat beberapa panduan ringkas mengenai bagaimana untuk memulakan. Untuk rujukan, berikut adalah beberapa sumber maklumat yang sangat baik mengenai subjek yang telah saya pelajari:

Sebelum masuk ke butiran, ada baiknya untuk mempertimbangkan bagaimana kami akan menyelesaikan masalah ini. Berikut adalah beberapa potongan mudah untuk dicerna yang akan kami gunakan untuk memastikan perkara ini mudah:

  1. Secara rawak letakkan kandungan yang anda buat ke dalam dunia permainan.
  2. Semak bahawa kandungan diletakkan di tempat yang masuk akal.
  3. Semak bahawa kandungan anda dapat dicapai oleh pemain.
  4. Ulangi langkah ini sehingga tahap anda bersama-sama dengan baik.

Setelah kami bekerja melalui contoh-contoh berikut, anda harus memiliki kemahiran yang diperlukan untuk bereksperimen dengan PCG dalam permainan anda sendiri. Hebat, eh?


Di manakah Kita Meletakkan Kandungan Permainan Kami?

Perkara pertama yang akan kita lakukan adalah secara rawak menempatkan bilik-bilik dari paras bawah tanah yang dihasilkan secara prosedur.

Untuk mengikutinya, adalah idea yang baik untuk mempunyai pemahaman asas bagaimana peta jubin berfungsi. Sekiranya anda memerlukan gambaran ringkas atau penyegaran, lihat tutorial peta jubin ini. (Ia ditujukan kepada Flash tetapi, walaupun anda tidak biasa dengan Flash, ia masih bagus untuk mendapatkan inti jubin peta.)

Membuat Bilik Diletakkan di Tahap Penjara Anda

Sebelum kita memulakan, kita perlu mengisi peta jubin kami dengan ubin dinding. Apa yang anda perlu lakukan adalah berulang melalui setiap tempat di peta anda (pelbagai 2D, idealnya) dan letakkan jubin itu.

Kami juga perlu menukar koordinat piksel setiap segi empat ke koordinat grid kami. Jika anda mahu pergi dari piksel ke lokasi grid, bahagikan piksel koordinat dengan lebar jubin. Untuk pergi dari grid ke piksel, pelbagai grid menyelaraskan dengan lebar jubin.

Sebagai contoh, jika kami ingin meletakkan sudut kiri atas bilik pada (5, 8) pada grid kami dan kami mempunyai lebar jubin sebanyak 8 piksel, kami perlu meletakkan sudut itu pada (5 * 8, 8 * 8) atau (40, 64) dalam koordinat piksel.

Mari buat kelas Bilik; ia mungkin kelihatan seperti ini dalam kod Haxe:

Kami mempunyai nilai untuk setiap lebar ruangan, ketinggian, kedudukan titik tengah, dan kedudukan empat penjuru, dan fungsi yang memberitahu kami sama ada bilik ini memotong satu sama lain. Juga ambil perhatian bahawa semua kecuali untuk nilai x dan y berada dalam sistem koordinat grid kami. Ini kerana ia menjadikan kehidupan lebih mudah untuk menggunakan nombor kecil setiap kali kita mengakses nilai bilik.

Baiklah, kami mempunyai kerangka untuk satu ruangan di tempat. Sekarang bagaimana kita secara procedural menjana dan meletakkan bilik? Nah, terima kasih kepada generator nombor rawak terbina dalam, bahagian ini tidak terlalu sukar.

Apa yang perlu kita lakukan ialah memberikan nilai x dan y secara rawak untuk bilik kami di dalam batas peta, dan memberikan nilai lebar dan ketinggian rawak dalam julat yang telah ditetapkan.

procedural-content-room-placement

Adakah Penempatan Rawak Kami Membuat Sense?

Oleh kerana kami menggunakan lokasi rawak dan dimensi untuk bilik kami, kami pasti bertindih dengan bilik yang telah dicipta sebelum kami mengisi penjara kami. Nah, kami sudah mengodkan kaedah intersek () yang mudah untuk membantu kami menangani masalah tersebut.

Setiap kali kami cuba meletakkan bilik baru, kami hanya memanggil intersek () pada setiap pasangan bilik dalam keseluruhan senarai. Fungsi ini mengembalikan nilai Boolean: benar jika bilik bertindih, dan sebaliknya. Kita boleh menggunakan nilai itu untuk memutuskan apa yang perlu dilakukan dengan bilik yang kita cuba buat.

procedural-content-intersection-diagram
Semak semula pada fungsi intersek (). Anda boleh melihat bagaimana nilai x dan y bertindih dan kembali benar.

Kunci di sini ialah Boolean yang gagal; ia ditetapkan kepada nilai pulangan intersects (), dan sebagainya adalah benar jika (dan hanya jika) bilik anda bertindih. Sebaik sahaja kita keluar daripada gelung, kita periksa pembolehubah yang gagal ini dan, jika palsu, kita boleh mengukir bilik baru. Jika tidak, kami hanya buang bilik dan cuba lagi sehingga kami telah mencapai jumlah maksimum bilik kami.


Bagaimana Kami Boleh Mengendalikan Kandungan Yang Tidak Dicapai?

Sebilangan besar permainan yang menggunakan kandungan yang dihasilkan secara giat berusaha untuk menjadikan semua kandungan itu dapat dicapai oleh pemain, tetapi ada beberapa orang di luar sana yang percaya bahawa ini tidak semestinya keputusan reka bentuk terbaik. Bagaimana jika anda mempunyai beberapa bilik di penjara bawah tanah anda bahawa pemain hanya boleh jarang dapat tetapi dapat melihat? Ini mungkin menambah dinamik yang menarik ke penjara bawah tanah anda.

Sudah tentu, tidak kira sejauh mana hujah anda berada, mungkin masih bagus untuk memastikan pemain dapat terus maju melalui permainan. Ia akan menjadi sangat mengecewakan jika anda sampai ke tahap penjara bawah tanah permainan dan keluar sepenuhnya disekat.

Memandangkan kebanyakan permainan menembak untuk kandungan yang boleh dicapai 100%, kami akan tetap dengannya.

Mari kita Mengendalikan Reachability itu

Sekarang, anda perlu mempunyai peta jubin dan berjalan dan perlu ada kod yang sedia ada untuk membuat bilangan pembolehubah bilik yang berbeza-beza saiznya. Lihatlah itu; anda sudah mempunyai beberapa bilik penjara bawah tanah yang dihasilkan secara bijak!

Sekarang matlamatnya adalah untuk menyambung setiap bilik supaya kita dapat berjalan melalui penjara bawah tanah dan akhirnya mencapai pintu keluar yang menuju ke peringkat seterusnya. Kita boleh melakukannya dengan mengukir koridor di antara bilik-bilik.

Kita perlu menambah pemboleh ubah titik kepada kod untuk menjejaki pusat setiap bilik yang dibuat. Setiap kali kita membuat dan meletakkan sebuah bilik, kita menentukan pusatnya dan menghubungkannya ke pusat bilik terdahulu.

Pertama, kami akan melaksanakan koridor:

Fungsi-fungsi ini bertindak dengan hampir sama dengan cara yang sama, tetapi satu mengukir secara mendatar dan yang lain secara menegak.

procedural-content-corridor-diagram-1

Menyambung bilik pertama ke bilik kedua memerlukan vCorridor dan hCorridor.

Kita memerlukan tiga nilai untuk melakukan ini. Untuk koridor mendatar kita memerlukan nilai x permulaan, nilai x yang berakhir, dan nilai y saat ini. Untuk koridor menegak kita perlu nilai y bermula dan berakhir dengan nilai x semasa.

Oleh kerana kita bergerak dari kiri ke kanan kita memerlukan dua nilai x bersamaan, tetapi hanya satu nilai y kerana kita tidak akan bergerak ke atas atau ke bawah. Apabila kita bergerak secara menegak, kita memerlukan nilai y. Dalam gelung untuk permulaan setiap fungsi, kita berulang dari nilai permulaan (x atau y) hingga nilai akhir sehingga kita telah mengukir keseluruhan koridor.

Sekarang kita mempunyai kod koridor di tempat, kita boleh menukar fungsi ourRooms () kami dan memanggil fungsi koridor baru kami:

procedural-content-corridor-diagram-2

Dalam imej di atas, anda boleh mengikuti penciptaan koridor dari bilik pertama ke keempat: merah, hijau, dan biru. Anda boleh mendapatkan beberapa hasil yang menarik bergantung pada penempatan bilik - contohnya, dua koridor bersebelahan antara satu sama lain membuat koridor dua hala.

Kami menambah beberapa pembolehubah untuk menjejaki pusat setiap bilik dan kami melampirkan bilik dengan koridor di antara pusat mereka. Kini terdapat beberapa bilik dan koridor yang tidak-bertindih yang mengekalkan tahap penjara seluruhnya. Tidak buruk.

procedural-content-room-connection

Kami Selesai Dengan Penjara Diri Kita, Benar?

Anda telah lama membina tahap penjara terdahulu yang pertama, dan saya berharap anda telah menyedari bahawa PCG bukanlah sejenis binatang ajaib yang anda tidak akan pernah mempunyai peluang untuk membunuh.

Kami menerangkan bagaimana untuk secara rawak meletakkan kandungan di sekeliling paras bawah penjara anda dengan penjana nombor mudah rawak, dan beberapa julat yang telah ditetapkan untuk menjaga kandungan anda dengan saiz yang betul dan kira-kira di tempat yang betul. Seterusnya, kami menemui cara yang sangat mudah untuk menentukan sama ada penempatan rawak anda masuk akal dengan memeriksa bilik yang bertindih. Akhir sekali, kami bercakap sedikit tentang merit untuk memastikan kandungan anda dapat dicapai dan kami dapati cara untuk memastikan pemain anda dapat menjangkau setiap bilik di penjara bawah tanah anda.

Tiga langkah pertama dari proses empat langkah kami selesai, yang bermakna anda mempunyai blok bangunan di penjara yang hebat untuk permainan seterusnya. Langkah terakhir adalah untuk anda: anda mesti melelaras dengan apa yang anda pelajari untuk menghasilkan lebih banyak kandungan yang dihasilkan oleh prosedur untuk kebolehulangan semula yang tidak berkesudahan.

Terdapat Selalu Lebih Baik untuk Belajar

Kaedah untuk mengukir paras bawah tanah mudah dalam tutorial ini hanya mencalarkan permukaan PCG dan terdapat beberapa algoritma mudah lain yang anda boleh dengan mudah mengambil.

Cabaran saya untuk anda adalah untuk memulakan eksperimen dengan permulaan permainan anda yang anda buat di sini dan melakukan penyelidikan ke lebih banyak kaedah untuk mengubah penjara bawah tanah anda.

Satu kaedah yang hebat untuk mewujudkan tahap gua menggunakan automata selular, yang mempunyai kemungkinan tak terbatas untuk menyesuaikan tahap penjara. Kaedah lain yang bagus untuk belajar adalah Pembahagian Ruang Binari (BSP), yang menimbulkan beberapa tahap penjara yang mirip seperti grid.

Saya harap ini memberikan anda lompatan yang baik untuk memulakan penjanaan kandungan prosedur. Pastikan untuk memberi ulasan di bawah dengan sebarang pertanyaan yang anda miliki, dan saya suka melihat beberapa contoh tentang 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.