Generasi Prosedural Tingkat Tak Terbatas

16

Apa saja pendekatan yang baik untuk secara prosedural menghasilkan tingkat 2d yang tak terbatas? Tingkat bisa dibatasi dalam dimensi mana pun tetapi tidak harus.

Pendekatan yang paling masuk akal bagi saya sejauh ini adalah menggunakan radius berbasis grid. misal, membagi area bermain menjadi kotak dengan kotak dengan ukuran tertentu dan kemudian memuat kotak X dalam radius di sekitar pemain. Kemudian ketika pemain bergerak ke kotak lain, buat set berikutnya dan jatuhkan lebih jauh (area yang tetap dieksplorasi tidak diperlukan.) Ketika kotak dibangun, itu berisi susunan objek acak. Ketika benda meninggalkan lingkaran luar kotak, mereka dikeluarkan dari dunia. Apakah ada cara yang lebih baik atau berbeda? Atau jika ini adalah pendekatan yang baik, apa masalah potensial?

Demi diskusi, Anda dapat menganggap tingkat sebagai bidang asteroid top-down dengan power up, dll tersebar di seluruh.

Colin Gislason
sumber
2
Ini sepertinya terkait: gamedev.stackexchange.com/questions/2230/…
jacmoe
^ dan karena itu ada di kolom "Terkait" di sisi kanan. Tidak perlu tautan.
Ricket
7
Dan kemudian menjadi "terkait" serta "terkait" - rapi, ya? :)
jacmoe

Jawaban:

6

Masalah dengan dunia "tak terbatas" adalah bahwa koordinat Anda yang mendasari mungkin tidak terbatas. Kadang-kadang, jika permainan cukup memperlambat pemain, itu mungkin tidak menjadi perhatian, karena waktu untuk mencapai bilangan bulat, misalnya, akan terlalu lama untuk dicapai. Tetapi jika Anda mengizinkan perbedaan kecepatan yang tinggi, Anda mungkin harus sangat tepat dan sangat jauh jangkauannya, sehingga Anda perlu memikirkan koordinat Anda. Perbaikan yang wajar adalah memiliki dua level, seperti koordinat bilangan bulat dari kisi Anda, dan koordinat apung di setiap referensi kisi.

Sebagai tambahan, Anda bahkan mungkin dapat bertahan dengan baik tata letak dunia Anda, dengan menggunakan koordinat kotak sebagai benih untuk menciptakan dunia acak Anda di kotak yang diberikan. Jadi, ketika pemain meninggalkan area, Anda dapat menjatuhkannya, dan ketika pemain kembali, Anda dapat membuat kembali dari benih.

small_duck
sumber
4
Masalah ini dapat diatasi dengan memusatkan dunia sesekali.
Jonathan Fischoff
Juga waspada tidak hanya tentang pembungkus bilangan bulat tetapi ketidakakuratan perubahan titik apung kecil ketika angka titik apung tinggi. Coba ini: float pos = 1000000000.0f; float nextPos = pos + 0.001f; float diff = nextPos - pos; Di komputer saya, beda adalah 0.
tenpn
Ini semua adalah poin bagus. Saya pikir akan tepat untuk memasukkan kembali koordinat setiap kali set kuadrat baru dihasilkan, asalkan cukup efisien.
Colin Gislason
Kebetulan ini adalah solusi yang sama dengan Minecraft versi PC :) +1 untuk integer tetap + float yang menurut saya solusi terbaik
GameDeveloper