Sonsuz Seviyenin Prosedürel Üretimi


16

Prosedürel olarak sonsuz bir 2d seviyesi oluşturmak için bazı iyi yaklaşımlar nelerdir? Seviye her iki boyutta da kısıtlanabilir, ancak zorunlu değildir.

Şimdiye kadar benim için en anlamlı olan yaklaşım ızgara tabanlı bir yarıçap kullanmaktır. örneğin, oyun alanını belirli bir büyüklükteki karelere sahip bir ızgaraya bölün ve ardından oynatıcıya bir yarıçapta X kareleri yükleyin. Sonra oyuncu başka bir kareye ilerlediğinde bir sonraki seti inşa edin ve daha uzağa bırakın (Keşfedilen alanı ısrar etmek gerekli değildir.) Bir kare inşa edildiğinde, nesnelerin rastgele bir düzenlemesini içerir. Nesneler karelerin dış halkasını terk ettiğinde dünyadan çıkarılırlar. Daha iyi veya farklı yollar var mı? Veya bu iyi bir yaklaşımsa potansiyel konular nelerdir?

Tartışma aşkına, seviyeyi yukarıdan aşağıya asteroit alanı gibi güç artışları, vb. Boyunca dağılmış olarak düşünebilirsiniz.


2
Bu, ilgili gibi görünüyor: gamedev.stackexchange.com/questions/2230/…
jacmoe

^ ve bu nedenle sağ taraftaki "İlgili" sütunundadır. Bağlanmaya gerek yok.
Ricket

7
Ve sonra "bağlantılı" ve "ilgili" oldu - temiz, ha? :)
jacmoe

Yanıtlar:


6

"Sonsuz" dünyalarla ilgili bir problem, temel koordinatlarınızın sonsuz olmayabilir. Bazen, oyun oyuncuyu yeterince yavaşlatırsa, endişe verici olmayabilir, çünkü örneğin tamsayı sarısına ulaşma süresi, ulaşılamayacak kadar uzun olacaktır. Ancak, hızdaki yüksek farklılıklara izin verirseniz, hem çok hassas hem de çok geniş kapsamlı olmanız gerekebilir, koordinatlarınızı düşünmeniz gerekir. Makul bir düzeltme, ızgaranızın tamsayı koordinatları ve her bir ızgara başvurusunda kayan koordinatlar gibi iki seviyeye sahip olmak olacaktır.

Bir yana, ızgara koordinatlarını belirli bir karede rastgele dünyanızı oluşturmak için bir tohum olarak kullanarak dünyanızın düzenini düzgün bir şekilde devam ettirebilirsiniz. Böylece, oyuncu alanı terk ettiğinde, düşebilir ve oyuncu geri geldiğinde, onu tohumdan geri oluşturabilirsiniz.


4
Bu sorun, dünyayı zaman zaman ortalayarak ortadan kaldırılabilir.
Jonathan Fischoff

Ayrıca, sadece tamsayı sarmasının değil, kayan nokta sayısı yüksek olduğunda küçük kayan nokta değişikliklerinin yanlışlıklarının da farkında olun. Bunu deneyin: float pos = 1000000000.0f; float nextPos = pos + 0.001f; float diff = nextPos - pos;
Makinemde

Bunların hepsi iyi noktalardır. Yeterince verimli olduğu sürece yeni bir kare kümesi oluşturulduğunda koordinatları yeniden girmenin uygun olacağını düşünüyorum.
Colin Gislason

Bu arada bu Minecraft PC sürümü ile aynı çözüm :) +1 sabit tamsayı + float için hangi bence en iyi çözüm
GameDeveloper
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.