Bitişik döşemelere göre döşeme seçin


10

Döşenmiş bir harita editörü üzerinde çalışıyorum ve bitişik döşemelere göre döşemeleri otomatik olarak seçmem gerekiyor. Örneğin, bir yol döşemesi yerleştirilirken, başka bir yol döşemesinin yanına, ikisinin sürekli bir yol oluşturacak şekilde yönlendirilmesi gerekir. Çevresinde başka yollar varsa, köşe veya kavşak karoları kullanmamız gerekebilir.

Bunu yapmak için bazı algoritmalar önerebilir misiniz? Oyun 8 yönlü kare kiremitli bir harita kullanır.


Kullanıcı yeni bir kutucuğu her indirdiğinde ve yeni kutucuğu buna göre yönlendirdiğinde çevreleyen 8 kutucuğu inceleyemez misiniz? Tabii ki, her döşemede yönlendirme ve tür gibi bazı ek bilgiler depolamanız gerekir.
XiaoChuan Yu

Çevredeki tüm karoları inceliyorum ama tüm karo kombinasyonlarını nasıl kullanacağımı bilmiyordum. Örneğin, seçim yapabileceğiniz yedi fayansınız var (yatay, dikey, dört köşe ve bir çarpı). Karmaşık anahtar ifadeleri kullanmayı düşündüm, ama bu yanlış geldi.
alekop

Yanıtlar:


18

Belki de tipik olarak böyle yapılır. Yol döşemelerini olası tüm yönleriyle temsil eden farklı döşemeler listeniz var. Soldan sağa, dört köşenin tümü, yukarıdan aşağıya, her neyse. Şimdi tüm bu döşemeleri bir baytla dizine ekleyeceksiniz. 8 bit, her yön için bir tane. Bu bir hashmap veya dosya adına göre olabilir ... ancak bunu yapmak istersiniz.

Yani şuna sahipsiniz:

resim açıklamasını buraya girin

Yukarıdaki karo için bayt kodu 00000000'dir . Sonra soldan sağa (veya sağdan sola) giden döşemeniz şöyle:

resim açıklamasını buraya girin

Bu döşemenin bayt kodu 10001000 veya 136'dır. Başka bir örnek olarak, üç yollu bir kavşağa bakalım:

resim açıklamasını buraya girin

Bu döşemenin bayt kodu 10101000'dir .

Muhtemelen nereye gittiğimi görüyorsun. Baytlarda bağlantıları temsil eden bit konumlarını ayarlarsınız. Bu, daha önce gördüğüm büyük if / else zincirlerini yapmaya çalışmaktan çok daha iyi. Bir fayans yerleştirmek istediğinizde, etrafındaki fayansları inceleyin ve yol boyunca bir bayt oluşturun. Yolları olan fayanslar (veya bağlamak istediğiniz her şey) için 1'leri ve olmayan fayanslar için 0'ları ayarlayın. İşiniz bittiğinde, tam olarak ihtiyacınız olan döşemenin bayt koduna sahip olacaksınız.

Varlıkları oluştururken, doğru bayt kodunu döndürerek ve atayarak birçoğunu yeniden kullanabileceğinizi unutmayın.

EDIT : Görüntüleri daha az berbat olacak şekilde güncellendi. Evet bunlar eskisinden daha iyi.


Çok hoş! Basit ve verimli. Anlamadığım tek şey, o bit maskelerini nasıl elde ettiğinizdir. Örneğin, 3 ve 7 rakamlarından 17'lik bir bit maskesi nasıl elde edersiniz?
alekop

Boş ver, ne yaptığını görüyorum. 3. ve 7. bitleri ayarlıyorsunuz, ancak sağdan ziyade soldan sayıyorsunuz.
alekop

Oh vay, ne kadar utanç verici. Benim Got endianness'ın tüm karma kadar. Bunu düzeltebileceğim bir kazaydı!
MichaelHouse

Harika, şimdi benim yorumum bir anlam ifade etmiyor! : p Şaka yapıyorum, cevabınız için teşekkürler. Tam da aradığım şey buydu.
alekop

1
İyi açıklama. Gerçek kod ve döşeme çözünürlüğü ile aynı tekniği kapsayan bir blog yazısı var: kitsu.github.io/2016/07/18/roguelike-project-05
kitsu.eb

3

Yaptığınız işin hemen hemen her yönü ve birkaç potansiyel optimizasyon hakkında büyük ayrıntılara girdiği için daha fazla bilgi için bu kullanışlı sayfaya göz atmanızı tavsiye ederim: http://www.angryfishstudios.com / 2011/04 / maceraları-in bitmasking /

Tldr, her bir bitişik hücreyi sorgulamanız ve kombinasyonu bir bitfield / baytta depolamanız ve daha sonra 0 ~ 255 arasındaki bir sayıyı 0 ~ 47 arasındaki bir değere dönüştüren ve benzersiz bir görüntüye karşılık gelen bir haritadan geçirmenizdir.

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.