2B yana kaydırma oyununda “odaları” nasıl tespit edebilirim?


24

Terraria'nın "konutları" nasıl algıladığı gibi, oyunda oluşturabileceğiniz bazı bina türlerini ve odaları tanıyan bir sistem yaratmayı düşünüyorum. Bu oyunda, kiremit temelli bir dünyada, bir dizi koşulu karşılayan bir blok bölgesi inşa ederek bir ev inşa edilebilir:

  1. Bölge, oyuncunun yerleştirdiği bloklar tarafından "dışardan" tamamen izole edilmiştir.
  2. Bölge 5x7'lik bir dikdörtgene sığabilir.
  3. Kapalı alanda en az bir masa, bir ışık kaynağı ve sandalye bulunur.
  4. Bölgeden çıkan bir kapı var.
  5. Terraria hem ön hem de arka plan karo katmanına sahiptir. Bölgenin arka planının tamamı oyuncu yerleştirilmiş bloklarla doldurulmalıdır.

Bir oyuncunun uygun büyüklükte bir alan oluşturduğunu nasıl etkili bir şekilde saptayabilirim ve alanın gerekli tüm eşyaları / bileşenleri içerdiğini nasıl verimli bir şekilde kontrol edebilirim?

Tüm konut gereksinimlerini karşılayan bir iç bölge örneği:

görüntü tanımını buraya girin


5
Ayrıntılı misiniz? Ne demek "inşaat türleri" ve Terraria'da "konut"? Herkesin oyunu, yardım için insanları istemediğinizi de bir soru üzerine odaklanmak ve emin soru kesin bir cevap (fikirler değil) sahip olduğunu yapmak oynamıştır unutmayın
TomTsagk

1
Türleri ile kullanılan farklı bileşenleri / fayans demek. Benim sorum aşağıda çözüldü. Yardım için teşekkürler, daha fazla ayrıntıya girmeye ve gelecekteki sorulara daha spesifik davranmaya çalışacağım.
Bernardo Becker,

1
Bir kenara, bir oda ve bir rezidans arasında bir fark olduğundan emin olun . Madde imli listeniz, onları aynı tanım olarak görmenizi önerir. Terraria'yı örnek olarak kullanmakla, düşmanlar, konut olarak uygun olmasalar bile, odalarda ortaya çıkmazlar (örneğin, bir masayı kaçırmak veya sadece 5x5 boyutunda)
Flater

Yanıtlar:


37

Terraria ile aşina değilim, ancak bu bir sel doldurma algoritması kullanılarak kolayca yapılabilir .

Piksel yerine döşemeleri denetlersiniz ve kontrol edilen her döşemeler için, işlem sırasında hangi nesnelerin bulunduğu bir dizide veya listede saklanırken algoritmanın diğer döşemeleri kontrol etmeye devam edip etmediğini değerlendirirsiniz.

Algoritma, karakterin bulunduğu döşemede başlar. Her 1 saniyede bir başlayabilirsiniz, 2 ... en iyi aralığı bulmak için ince ayar meselesi.

Algoritmanın çok uzun süre çalışmasını engellemek iyi bir fikirdir, bu da algoritmanın çalıştırma başına çalışabileceği sayıyı sınırlamak suretiyle gerçekleştirilebilir, aksi halde algoritma karakter açık bir alanda olduğunda uzun gecikmelere neden olur.

Düzenle

Yorumlarda belirtildiği gibi, oynatıcının bir döşemeyi değiştirmesi veya algoritmayı başlatan bir am I modified?değişkene sahip döşemeler gibi algoritmanın ne zaman başlatılacağına ilişkin diğer yaklaşımları kullanabilirsiniz true. Ancak, bu yaklaşıma dikkat etmeniz gerekir:

  • Ya odanın bir parçası olan ancak karakterinizin bulunduğu bir taş döşemesi değiştirilmemişse? Belki de kiremit başka bir oyuncu veya çevre olayı tarafından değiştirildi veya kiremitlerin ömrü bitti. Karakteriniz değişiklikten habersiz olacak ve güncellenmiş odayı saptamak için bir hataya açık durum olan algoritmayı çalıştırmayacak.

Bu değişiklikleri tespit etmek için karakterinizin olmadığı döşemelerde bir çeşit yaklaşım uygulayabilirsiniz, ancak algoritmayı aralıklarla uygulamak en basit yaklaşımdır ve daha az hataya meyillidir. Her karede taşma dolgusu çalıştırmadığınızdan emin olun.

Düzenlemenin sonu


9
Neden sadece "oyuncu yerleştirilmiş blok" fayansları arasında sel doldurmuyorsunuz? Bu, açık alanlarda sonsuz taşkın dolgusunu önleyebilir veya azaltabilir (mağaralar / konaklar "oyuncu yerleştirilmiş bloklarla" dolu olmadığı sürece).
jimbo1qaz

20
Neden bunu sabit bir aralıkta çalıştırıyorsun? Elbette, bir blok yerleştirildiğinde (ya da varsa tahrip edildiğinde ve bu davaların her ikisi de muhtemelen blok başına itfa edilmiş sabit bir zamanda yapılabilir) ya da haritanın belirli bir bölümünü yüklerken kesinlikle çalıştırabilir ve ardından sonucu saklayabilirsiniz. Orada.
NotThatGuy

3
@ immibis: Terraria'nın zemini değiştirmenizi gerektirmediğinden eminim. Ayrıca bir oyunun, döşemeyi yerleştiren kişiye göre davranışını tanıma davranışını değiştirmesini beklemiyorum. Ya uçurumun bitişiğindeki bir oda inşa edersem?
Flater

3
Terraria arka plan duvarları koymak için bir tane gerektirir ve doğal arka plan kir / kaya ile bir ev oluşturmaz. Gerçekten sadece oyuncu yerleştirilmiş blokları kontrol ediyor.
loa_in_

3
CPU'yu korumak için algoritmayı sadece blok değişikliğinde çalıştırır ve sonra her blok için durumu depolardım. Bununla, bu basitisRoom()
Herr Derb

3

@ Ferreira da Selva'nın dediği gibi, sel doldurma algoritmasını deneyin. Bununla birlikte, algoritmanın çalıştırılmakta olup olmadığını belirlemek için algoritmayı çalıştırırken birkaç farklı ölçüt kullanabilirsiniz.

Örneğin, her bir döşeme için bir arka plan döşemesi olup olmadığını kontrol edin ve eğer yoksa, kapalı olmadığını bileceksiniz. Ya da bir dizi çerçeveden ayırarak ertelenmiş bir yürütme gerçekleştirmesini sağlayabilir, böylece işlemci üzerindeki yükü hafifletebilir ve gecikmeyi azaltabilirsiniz. Veya oyuncunun uyması gereken bir oda büyüklüğü sınırı oluşturabilirsiniz.

Bunların bir kombinasyonunu kullanmak, onu daha verimli ve etkili bir şekilde yapmanızı sağlar.


3

Bilgisayar biliminde 2 zor problem var. Şeyleri adlandırma, önbellek geçersiz kılma ve birer birer hataları.

Bu bir önbellek geçersiz kılma sorunudur.

"İçindekiler" kaydınız varsa, bir blok yerleştirildiğinde veya çıkarıldığında, bir sel dolgusu ile onu ve bölgesini güncellemek oldukça kolaydır.

Bunu optimize etmek için bir dizi "içsizlik" kademesine sahip olmak isteyebilirsiniz.

Bir "hücre" oyuncu yerleştirilmiş bloklarla çevrili bir bölgedir (belirli bir boyuta kadar).

Bir "oda", arka plan döşemeleri bulunan bir hücredir.

"İçeride", kapısı, ışığı ve sandalyesi olan bir odadır.

Bir oyuncu yerleştirilmiş ön blok yerleştirdiğinizde, yeni bir hücre oluşup oluşmadığını görmek için saat yönünde / saat yönünün tersine bir yürüyüş yapın. Oynatıcıya yerleştirilmiş bir ön plan bloğunu kaldırdığınızda, herhangi bir hücreyi kırayıp ayırmadığını kontrol edin - öyleyse, ikisini birleştirerek yeni bir hücre oluşup oluşmadığına bakın.

Yeni bir hücre oluştuğunda veya biçimlendirilmediğinde, bir oda veya içeride olup olmadığını kontrol edin.

Hücreler, bir oda olması için kaç arka plan döşemesi gerektiğini izleyebilir. Daha sonra bir hücre oluşturulduğunda basit bir sayım, arka plan karosu eklenir veya hücreden kaldırılır, bir oda olup olmadığını belirleyebilir.

Benzer şekilde, Hücreler kaç sandalye ve ışık kaynağının (ve aslında her çeşit nesnenin) içinde olduklarını izleyebilir. Sonra iç kontrol önemsizdir.

Çok sayıda giriş yapılabilir.


Böylece haritayı "hücreler" ile genişletiyoruz. Döşemeler eklendiğinde veya kaldırıldığında, konum hücresini kontrol ederiz ve hücredeki sayımı artırır / azaltır.

Bir ön blok eklendiğinde veya çıkarıldığında hücrenin içini ve dışını tanımlamak için saat yönünde / saat yönünün tersine yönde yürümek kullanın. Hücrelerin büyüklüğü sınırlı olduğundan, bu yürüyüş sınırlı sayıda adım atar.

Bonus olarak, artık odalardaki her nesne türünün bir sayımına sahip olduklarından, "oda" odaları veya "oda kutsal bir çeşme ile kutsanmıştır" veya bir oda hakkında başka bir şey hakkında konuşmanın ucuz bir yoluna sahipsiniz. (Odaların boyutları sınırlandırılmış olduğundan, sadece bir yineleme yapın; bu bir önbelleği kaldırır).

Her konum en fazla bir hücrede olduğundan, her bir konumun hücre kimliğini ana harita üzerinde saklayabilirsiniz.


0

Sel doldurma algoritmasını kullanırken, kontrol edilen her döşemeyle birlikte artış sağlayacak bir değişken de yapın, bu nedenle 35'ten (7 * 5, odanın maksimum büyüklüğü) daha yüksekse, kontrol etmeyi durdurur!


7 * 5, odanın içine sığması gereken asgari boyuttaki dikdörtgendir
Rick,
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.