Bir Varlık Bileşen Sistemindeki Varlık 'Türlerini' Belirleme


10

Bir Varlığın açık bir 'türü' (örn. Oynatıcısı) yoksa ve yalnızca bir bileşenler koleksiyonuysa, sistemlerimin üzerinde çalışması gereken ve olmaması gereken varlıkları nasıl belirleyebilirim? Örneğin, bir Pong oyununda raket ve top, pencere sınırları ile çarpışır. Ancak, her biri için çarpışma kontrol sistemleri farklı olacaktır, bu nedenle bir sistem yanlış tipteki varlıkları işlememelidir.

void PlayerCollisionSystem::update(std::vector<Entity *> entities) {
  typedef std::vector<Entity *>::iterator EIter;
  for (EIter i = entities.begin(); i != entities.end(); ++i) {
    Entity *player = *i; // How do I verify that the entity is a player?

    // Get relevant components.
    PositionComponent *position = player->getComponent<PositionComponent>();
    VelocityComponent *velocity = player->getComponent<VelocityComponent>();
    SpriteComponent *sprite = player->getComponent<SpriteComponent>();

    // Detect and handle player collisions using the components.
  }
}

Hem oyuncu hem de top, çarpışma kontrolü için aynı ilgili bileşen türlerini paylaşır, ancak sistem uygulamaları farklı olacaktır.

Tüm oyun varlıklarının kapsayıcısı varsa, devralmadan Entityveya üye değişkeni dahil etmeden belirli varlık türlerini nasıl belirleyebilirimstd::string type ;

Yanıtlar:


21

Nicol Bolas'ın cevabı düz, ancak bir kenara çekilip probleminize uzaktan bakmak: gerçekten varlığın türüne ihtiyacınız yok.

Yalnızca "nesnenin bileşeni olup olmadığına" dikkat etmeniz gerekir Xve sorununuz doğru bir şekilde tanımlamamış olmanızdır X. İki nesne farklı davranıyorsa, onlara farklı bileşenler verin veya farklı nesne yapılandırmaları için farklı davranması için bileşenin üzerine bir boole bayrağı koyun. Varlık "türü" yerine davranış hakkında karar vermek için bileşen sistemini kullanın. Bileşenleri kullanmanın bütün mesele bu.

Farklı davranırlarsa , bir PaddlePhysicsbileşene / sisteme ve ayrı bir bileşene / sisteme sahip olmanıza tamamen izin verilir BallPhysics. Yoksa daha ayrıntılı parçalar halinde bileşenleri yıkmak böyle bir olduğunu Bouncesadece Topu sahiptir bileşeni ve bir StopAtBoundaryde o bileşen Ballve Paddledavranış parçası kod paylaşımı karşılayacak kadar karmaşık ise var. Ya da ve için PongPhysicsboole bayrağı Bouncesayarlanmış bir bileşen oluşturabilirsiniz . Hatta bir temel bileşen bile oluşturabilir ve daha sonra bu bileşen için gerekli ekstra davranışı ekleyen bir bileşen elde edebilirsiniz .trueBallfalsePaddleWallCollisionBallWallCollision


4
Bence bu kabul edilen cevap olmalı çünkü "vanilya" ECS ile ilgili hiçbir kısıtlama veya sorun yok. Etiketleme varlıkları, işaretleyici işlevi gören özel bileşenler oluşturarak kolayca gerçekleştirilebilir. Ayrıca sadece yararlı bir şey yapmayan, sadece etiket olarak hizmet veren bir kukla PlayerTypeComponent olabilir.
tiguchi

19

Bir sistem ancak faydalıysa yararlıdır. Bir varlığın "sadece bir bileşen koleksiyonu" olduğu bir sistem, bir varlığın çoğunlukla "bileşen koleksiyonu" olduğu bir sistemden daha az yararlıysa , bunu yapın .

"Saf" sistemler yapmaya çalışmayı bırakın ve ihtiyacınız olanı yapan iyi sistemleri yapmaya odaklanın . Bileşenler artık sizin için yararlı olmayana kadar bileşenleri kullanın. Sonra başka bir şey kullanın.

Bunu zaten hak ettiğinden daha fazla düşünmek için çok zaman harcadınız.


very nice +1 "Bunu zaten hak ettiğinden daha fazla düşünmeye
çalıştın

8
Bunun bir cevap olduğunu düşünmüyorum, Bir ECS'yi arıtma konusu önemli ilgiyi hak eden bir konudur ve Garee (bunu 2013'te yayınladığında) muhtemelen düşünmek için yeterince zaman harcamamıştı. Konunun daha fazla zamanı hak etmediği düşüncesi, sistemlerin basit veya önemsiz olması ve genellikle zamanımızın hak edilmemesi gerektiğini ima eder. Sean Middleditch'in cevabını, aslında soruyu reddetmek yerine cevaplamaya çalıştığından tercih ederim.
Gavin Williams

Mükemmel cevap. Kendimi bunu zaman zaman kendime söylemek zorunda buluyorum. İlerlemeye odaklanın.
Dominic Bou-Samra

5

Varlıklara açık bir tür vermek istiyorsanız, en kolay yol varlık sınıfında bir tür değişkeni tanımlamaktır. EC modelini yalnızca faydalı olduğu sürece saklayın.

Aksi takdirde tür, bileşen öznitelikleri aracılığıyla ima edilir. Örneğin, fizik bileşeninin mobil ve sabit için bir niteliği vardır. Sistem daha sonra iki cep telefonunun ne zaman çarpıştığını (top ve kürek) bilir. Benzer şekilde, çarpışma sisteminin nasıl tepki vermesi gerektiği konusunda da nitelikleriniz olabilir. Sadece nesneyi durdurun veya yansıtın mı? Özelliklere bakmak size varlığın ne olduğu hakkında bir fikir vermelidir, ancak önemsiz olmalıdır. Sistemlerin çalıştıkları varlık türünün ne olduğunu bilmeleri gerekmemeli, kendilerine sağlanan bileşenleri kullanarak yeterli bilgi verilmelidir.

Son olarak, bir tür içeren ek bir bileşen ekleyebilir, ancak varlığa bir tür eklerken olduğu gibi, EC sisteminin amacını yenerek, türe özgü bir kod yazmanız gerekir.


0

Bir varlık bir bileşenler kümesidir. Rastgele bir kümeye düzgün etiketler atayamazsınız. Tip kısıtlamaları vermek, büyük esnekliğin bedeli.

Tabii ki, bileşenlere kısıtlamalar getiren özel (yazılı) varlık sınıflarına sahip olabilirsiniz.

İdeal olarak bileşenler bağımsızdır. Bu yüzden probleminizin çözümü, sırayla her bir alt bileşen üzerinde çarpışma işlemeyi çağırmak olacaktır. Gerçek uygulamalarda bağımlılıklar ve sipariş sorunları vardır. Bu durumda, Entity sınıfının her yönteminde bazı 'dispatcher' mantığına ihtiyacınız vardır.

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.