(Açıkladığım şey bu tasarıma dayanıyor: Varlık sistemi çerçevesi nedir ?, Aşağı kaydırın ve bulacaksınız)
C ++ bir varlık bileşen sistemi oluşturmakta bazı sorunlar yaşıyorum. Bileşen sınıfım var:
class Component { /* ... */ };
Bu aslında diğer bileşenler için yaratılacak bir arayüz. Böylece, özel bir bileşen oluşturmak için, sadece arayüzü uyguluyorum ve oyun içinde kullanılacak verileri ekliyorum:
class SampleComponent : public Component { int foo, float bar ... };
Bu bileşenler, her Entity örneğine benzersiz bir kimlik veren bir Entity sınıfının içinde saklanır:
class Entity {
int ID;
std::unordered_map<string, Component*> components;
string getName();
/* ... */
};
Bileşenler, bileşenin adını karmak suretiyle varlığa eklenir (bu muhtemelen harika bir fikir değildir). Özel bir bileşen eklediğimde, Bileşen türü (temel sınıf) olarak depolanır.
Öte yandan, içinde bir Düğüm arabirimi kullanan bir Sistem arabirimim var. Düğüm sınıfı, tek bir varlığın bileşenlerinden bazılarını depolamak için kullanılır (Sistem, varlığın tüm bileşenlerini kullanmak istemiyorsa). Sistem gerektiğinde update()
, yalnızca farklı varlıklardan oluşturulan depoladığı Düğümler üzerinden yineleme yapılması gerekir. Yani:
/* System and Node implementations: (not the interfaces!) */
class SampleSystem : public System {
std::list<SampleNode> nodes; //uses SampleNode, not Node
void update();
/* ... */
};
class SampleNode : public Node {
/* Here I define which components SampleNode (and SampleSystem) "needs" */
SampleComponent* sc;
PhysicsComponent* pc;
/* ... more components could go here */
};
Şimdi sorun: diyelim ki bir varlığı SampleSystem'a geçirerek SampleNodes'u oluşturdum. Ardından SampleNode, varlığın SampleSystem tarafından kullanılacak gerekli bileşenlere sahip olup olmadığını "kontrol eder". Varlık içinde istenen bileşene erişmem gerektiğinde sorun ortaya çıkıyor: bileşen bir Component
(temel sınıf) koleksiyonunda saklanıyor , bu yüzden bileşene erişemiyorum ve yeni düğüme kopyalayamıyorum. Sorunu geçici olarak Component
türetilmiş bir türe dökerek çözdüm , ancak bunu yapmanın daha iyi bir yolu olup olmadığını bilmek istedim. Bunun zaten sahip olduğum şeyi yeniden tasarlamak anlamına gelip gelmediğini anlıyorum. Teşekkürler.