Varlıklar veya bileşenlerdeki durum değişiklikleri


9

Kurumlarımdaki devlet yönetimi ile nasıl başa çıkılacağımı anlamakta biraz sorun yaşıyorum.

Duraklatma ve menüler gibi Oyun durumu yönetimi ile ilgili sorunum yok çünkü bunlar bir varlık bileşeni sistemi olarak ele alınmıyor; sadece varlıklarda / bileşenlerde durum.

Örnek olarak Orklar'dan Ölmeli, MainCharacter ve Trap varlıklarım var ve bileşenleri sadece PositionComponent, RenderComponent, PhysicsComponent gibi.

Her güncellemede, Varlık bileşenlerinde güncelleme çağırır. Ayrıca farklı olay türleri için dinleyiciler ile genel bir EventManager var.

Şimdi tuzakları yerleştirebilmeliyim: önce tuzağı ve tuzak konumunu seçin, sonra tuzağı yerleştirin.

Bir tuzak yerleştirirken, farklı bir şekilde işlenen ve etrafından takip edilen MainCharacter'in önünde görünmelidir. Yerleştirildiğinde sadece çarpışmalara cevap vermeli ve normal şekilde oluşturulmalıdır.

Bu genellikle bileşen tabanlı sistemlerde nasıl ele alınır?

(Bu örnek spesifiktir, ancak taraf devletlerle başa çıkmanın genel yolunu bulmaya yardımcı olabilir.)


1
Girdi olaylarını temel alarak varlık bileşenleri ekleyebilir ve kaldırabilir misiniz? Devletler değiştiğinde belki de tuzağın bileşenlerini değiştirebilirsiniz. Örneğin, tuzağı yerleştirirken FollowComponent ve RenderEffectComponnent olacaktır. Yerleştirildiğinde, her iki Bileşeni de kaldırır ve CollisionComponent'i eklersiniz. (Düzenle: Martin Sojka tarafından daha açık bir şekilde ifade edilmiştir)
Asakeron

Evet, her girdi bir "HumanView" den oyun etkinliklerine çevrilir, bu da çoğu, ilk olarak GameLogic sınıfım tarafından işlenir, bu da örneğin MainCharacter'in bir tuzak yerleştirmek için yeterli paraya sahip olup olmadığını kontrol eder. anlamaya çalıştığım şey bundan sonra olur.
GriffinHeart

Yanıtlar:


6

Bileşen sisteminin ilginç bir uygulaması, bir varlığın bileşenlerini, bu tür işlemleri yapabilmek için tasarladıysanız , çalışma zamanında değiştirebilmenizdir . Dolayısıyla bir varlığın durumu, kendisine hangi bileşenlerin atandığı ve bu değerlerin sahip olduğu değerlerin toplamı olur.

Örneğin, önce tuzağı, BuildControllerComponent(reaksiyonu oluşturma aşamasında oyuncu kontrollerine yönlendiren), a PositionComponentve a ile oluşturabilirsiniz RenderComponent. Sonuncusunda kullanılan piksel gölgelendiricileri yöneten bir veri alanı vardır ve bunlardan biri, inşa edilecek tuzağa "hayalet" bir görünüm verir. Henüz atanmış bir fizik bileşeni olmadığını fark edeceksiniz .

Kapanı yerleştirdikten sonra bileşenler değiştirilir. BuildControllerComponentArtık gerekli değildir, bu nedenle kaldırılır. RenderComponentBireyin gölgelendiriciler tuzak normal standart görünümü ile yer değiştirirler. Son olarak, PhysicsComponenttuzağın çalışması için ihtiyaç duyulan her şey varlığa eklenir.

Kalıtım temelli bir yaklaşımda, bu, ActiveTrapEntitybir BuildTimeTrapEntitysınıfı argüman olarak alan bir sınıf için bir kurucuya eşdeğerdir ; ikincisi, tuzağı inşa sırasında oluşturmak için kullanılır, ilki tuzak için yerine yerleştirildikten sonra kullanılır .


Bu akıllıca.
Cypher

1
Bu, bir işletmenin durumunu uygulamak için iyi bir stratejidir . Her bir varlığın durumunun nasıl izleneceği konusuna değinmez. İşletmenin şu anda hangi eyalette olduğunu nasıl anlarsınız?
MichaelHouse

@MartinSojka Bu, soruyu sorduktan sonra düşündüğüm şeye yaklaştı. Bir tuzak oluşturmak için gereken durum değişikliklerini elde etmek için bileşenlerin çalışma zamanı yönünü yönetecek bir BuildTrapProcess (GameLogic'de güncellenen bir şey) eklemeyi düşünüyordum. Bir tuzak inşa etmek için düğmeye basıldığında, oyun mantığı Süreci oluşturacak ve başlatacaktır. Bu yaklaşım hakkında herhangi bir düşünceniz var mı?
GriffinHeart

@ Byte56: Genel olarak, ilişkili bileşenleri ve değerlerini sorgulayabilirsiniz. Uygulamada, genellikle sadece tüm devletin ilgili alt kümesini bilmeniz gerekir, örneğin "Bu varlık var BuildControllerComponentmı?" veya " PositionComponentVarsa , bu işletmenin kayıtlı olduğu pozisyonu nedir ?" - ilgilendiğiniz bileşenler için bileşen listesini kontrol ederek ve isteğe bağlı olarak değerlerinden bazılarını sorgulayarak yaptığınız işlemler.
Martin Sojka

1
@GriffinHeart: Sadece sistem yönetimi ile ilişkili tuzak "kurmak" için ne gerekiyorsa uygulamak istiyorum BuildControllerComponent. Oyuncu karakterinin (veya kameranın) bakış açısı değişikliklerini ve tuş ve fare basma olaylarını zaten işlemesi gerekiyor.
Martin Sojka

5

Bileşenleri hakkında güncellemeler çağıran varlıklar fikrinden hoşlanmıyorum (sistemler işi yapmalıdır) ve bu, bileşenleri birbirinden habersiz tutmakla ilgili sorunlara yol açacaktır.

"Durum" adında ek bir bileşen ekleyebilirsiniz. Ona render ve çarpışma sistemlerinizden erişilir. Durum bileşeni, yalnızca birden çok durumu olan bir işarettir. Açıkladığınız durum için devletler Playve olacaktır Build. Oluşturma sistemi durumun olduğunu gördüğünde Buildnesneyi yarı saydam çizecektir. Çarpışma sistemi Builddurumu gördüğünde , oyuncu ile çarpışmaları işlemeyecektir.

Ama gerçekten, sistemleriniz yoksa ve tüm işleri yapmak için bileşenlere güveniyorsanız, birçok sorunla karşılaşırsınız. Bileşenler birbirlerini bilmemeli ve işlem yapmamalıdırlar.


Söyledikleriniz çelişkili, önce farkında değiller (ki ben katılıyorum) sonra başkaları tarafından erişilen bir bileşen alarak takip edin. Açıklayabilir misin? Olay sistemi tarafından bileşenleri ayrıştırıyorum.
GriffinHeart

Her ikisini de söylüyorum. Farkında olmamaları gerektiğini ve bileşenleri ele aldığımı düşündüğüm yanıtı vermeyi ayarlamaya çalıştıklarını söylüyorum. "Varlık, bileşenlerinde güncelleme çağırır" dediğinde, sistem işleme varlıkları olmadığına inanmamı sağlıyor. Kafa karıştırıcı dili kaldırdım ve sadece sistemleri söylettim. Bileşenler söylüyordum çünkü güncellemenin bu şekilde olduğunu anlıyordum.
MichaelHouse

StateComponentBirden fazla sistem tarafından tüketilebilecek bir fikri seviyorum .
Cypher

1
Downvotes için mantık sağlamak kibar. Teşekkürler.
MichaelHouse

2
Farklı bir notta, sorucunun yaklaşımına itirazınız, tüm bileşen tabanlı tasarımların bileşenleri ayrı sistemlerden (varlık sistemi tasarımı gibi) güncellemesi gerektiği varsayımına dayanmaktadır. Bunu yapmanın bir yolu, ama kesinlikle tek değil ve önbellek optimize bileşen güncelleme döngülerine ihtiyaç duymayan bir oyun için böyle bir yaklaşımı reddetmek için hiçbir neden yok.
Sean Middleditch
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.