Döşeme haritası ve birimler arasındaki bağımlılıklar nasıl yönetilir


11

Çalışmalarda 2B kiremit tabanlı bir stratejim var. Harita ile haritadaki birimler arasındaki ilişkiyi nasıl ele alacağım.

Bir döşeme koordinatı verildiğinde, birimi varsa üzerine getirebilmem gerekir. Aynı zamanda, bir birim verilirse, birimin koordinatını alabilmek isterim.

Bunun için iki çözüm gördüm. İlk çözüm, birimlerin bir koordinat depolaması ve harita deposu birim referanslarının döşemelerinde bulunmasıdır. Bu harita ve birimler arasında döngüsel bir bağımlılık yaratır. Birim hareket ederse haritanın herhangi bir birimin senkronize olduğundan emin olmalıyım.

İkinci çözüm, sadece birimlerin koordinatlarını takip etmelerini sağlamaktır. Bir döşemenin bir birim içerip içermediğini söylemek ve bu birimi elde etmek için, eşleşen koordinatlara sahip bir birim bulduğum tüm birim biriminde döngü yapardım. Bu döngüsel bağımlılık sürmek, ama ilk çözüm haritadan birimleri aramak için O (1) özelliğini kaybeder. Bu, haritayı yol bulma, hareket aralığını belirleme ve belirli bir birim için geçerli hedefler bulma gibi şeyleri düzenli olarak tarayabilmek istediğim için toplanabilir.

Ayrıca birimleri haritada saklayamıyorum (ya da alabilir miyim?). Birimler oyuncu veya yapay zeka ile "ordular" ile ilişkilendirilir. Bir ordu tüm birimlerine kolayca erişebilmeli ve yinelemelidir.

Bu strateji oyunlarında yaygın bir sorun gibi göründüğünden, birim / harita ilişkilerini yönetmek için tarif ettiğim iki şeyin dışında başka kalıplar var mı?

Yanıtlar:


3

Bu popüler bir model değil, ancak ilişkisel veritabanı dünyası üçüncü bir yol sunuyor: birden fazla anahtar içeren bir veri yapısı kullanın. Tablo şeklinde, şöyle görünebilir:

Unit id    Location
-------------------
  1309     13,15
  2357      7,93
  8552      7,93

“Ünite 2357 nerede?” Diye sormak istersiniz. ve 7,93 geri dön. Ayrıca, “7,93 konumunda ne var?” Diye sormak isteyebilirsiniz. ve 2357 ve 8552'ye geri dönün. İşleri aramak için birden fazla tuşa izin veren veri yapıları var. Bağımlılıkları kaldırmak istiyorsanız bunu birimlerin dışında ve haritanın dışında saklayabilirsiniz.

Bununla birlikte, pratikte her bir birimde konum depolamak daha yaygındır ve daha sonra yanda, belirli bir bölgede hangi birimlerin bulunduğunu söyleyen bir uzamsal bölümleme veri yapısı kullanın. Ayrı bir yapı olduğu için, bölgelerin ızgara alanları olması gerekmez; daha geniş alanlar olabilir.

En kolay olanı (ikinci çözümünüz) yapmanızı öneririm ve daha sonra bir performans sorunu varsa, aramaları daha hızlı hale getirmek için uzamsal bir bölüm ekleyebilirsiniz.


Yani, bahsettiğiniz uzamsal bölümleme veri yapısı sadece harita olabilir (benim durumumda görünüşte 2B karo ızgarası). Bir birim hareket ettiğinde (veya eklendiğinde veya kaldırıldığında) hala senkronize tutmak için hem birimi hem de uzamsal bölümleme yapısını güncellemem gerekiyor. Belki birlikte yaşamak zorunda olduğum şeylerden biri?
AJM

1
Evet, harita, kullanacağınız en ince taneli uzamsal bölümdür. Tüm birimlerin küresel listesi en kaba taneli bölümdür. ;) Bölümü kullanmadan önce güncellemeniz yeterlidir. Sürekli kullanıyorsanız, ünite her hareket ettirildiğinde güncellemek isteyebilirsiniz. Ancak bunu yalnızca güncelleme mantığının bazı aşamaları için kullanıyorsanız, bir geçişte birim listesinden geçebilir ve bölüm veri yapısını hesaplayabilir, ardından işiniz bittiğinde atabilirsiniz. Bu şekilde onları her zaman senkronize tutmak zorunda kalmazsınız.
amitp

5

Oyuncu başına birkaç bin birim olmadıkça, bellek kullanımı hakkında endişelenmezdim ve ilk çözümü kullanmazdım. Bellek, göründüğü kadar CPU'dan daha ucuzdur.

Aslında, oyuncu başına 4000 üniteniz olsa bile, orada konumu saklamak için iki tamsayı ve 8 oyuncu kullanmış olsanız bile, bu sadece 2MB alır, ancak ilk çözümle, bir O (1) koordinat alıcısı kullanırsınız. O (n) (sıralanmamış olduğu varsayılarak), bir çok birim yavaş olabilir.

Çoğu oyun, döşemeden ziyade piksel tabanlı gibi görünüyor, bu yüzden sadece ko-ords'ları saklamak için üniteyi almaları gerekiyor.


Bellek kullanımı konusunda endişelenmiyorum, (Nesne Odaklı Tasarım anlamında) bağımlılıkları yönetmekle daha çok ilgileniyorum. İlk çözüm beni endişelendirecek ekstra bellek değil, O (1) koordinatörünü sevdiğim kadar, temkinli olduğum döngüsel bağımlılık. Ayrıca, şimdi birçok oyunun piksel tabanlı olduğunu biliyorum, ancak fayansları seviyorum, bu yüzden kullanıyorum. : P
AJM

@AJM, aynı, ben android yayınlayacak ücretli uygulamalar fayans kullanıyor olacak.
Ray Britton
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.