(สิ่งที่ฉันอธิบายจะขึ้นอยู่กับการออกแบบนี้: กรอบงานระบบเอนทิตี้คืออะไรเลื่อนลงมาแล้วคุณจะพบมัน)
ฉันมีปัญหาในการสร้างระบบเอนทิตีส่วนประกอบใน C ++ ฉันมีชั้นองค์ประกอบของฉัน:
class Component { /* ... */ };
ซึ่งจริงๆแล้วเป็นอินเทอร์เฟซสำหรับส่วนประกอบอื่น ๆ ที่จะสร้าง ดังนั้นเพื่อสร้างองค์ประกอบที่กำหนดเองฉันเพิ่งใช้อินเทอร์เฟซและเพิ่มข้อมูลที่จะใช้ในเกม:
class SampleComponent : public Component { int foo, float bar ... };
ส่วนประกอบเหล่านี้จะถูกเก็บไว้ในคลาส Entity ซึ่งให้ ID ที่เป็นเอกลักษณ์แต่ละ Entity:
class Entity {
int ID;
std::unordered_map<string, Component*> components;
string getName();
/* ... */
};
มีการเพิ่มส่วนประกอบลงในเอนทิตีโดยการใส่ชื่อส่วนประกอบ (ซึ่งอาจไม่ใช่ความคิดที่ยอดเยี่ยม) เมื่อฉันเพิ่มองค์ประกอบที่กำหนดเองมันจะถูกเก็บไว้เป็นประเภทคอมโพเนนต์ (คลาสพื้นฐาน)
ในขณะเดียวกันฉันมี System interface ซึ่งใช้ Node interface อยู่ภายใน คลาส Node ใช้เพื่อจัดเก็บส่วนประกอบของเอนทิตีเดียว (เนื่องจากระบบไม่สนใจใช้ส่วนประกอบทั้งหมดของเอนทิตี) เมื่อระบบมีการupdate()
มันจะต้องทำซ้ำผ่านโหนดที่เก็บไว้สร้างขึ้นจากหน่วยงานที่แตกต่างกัน ดังนั้น:
/* 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 */
};
ตอนนี้ปัญหา: สมมติว่าฉันสร้าง SampleNodes โดยส่งเอนทิตีไปยัง SampleSystem SampleNode จะ "ตรวจสอบ" ถ้าเอนทิตีมีส่วนประกอบที่จำเป็นที่จะใช้โดย SampleSystem ปัญหาปรากฏขึ้นเมื่อฉันต้องการเข้าถึงส่วนประกอบที่ต้องการภายใน Entity: ส่วนประกอบถูกเก็บไว้ในComponent
คอลเลกชัน (คลาสพื้นฐาน) ดังนั้นฉันจึงไม่สามารถเข้าถึงส่วนประกอบและคัดลอกไปยังโหนดใหม่ ฉันแก้ไขปัญหาชั่วคราวด้วยการชี้Component
ลงไปที่ประเภทที่ได้รับมา แต่ฉันต้องการทราบว่ามีวิธีที่ดีกว่าในการทำสิ่งนี้หรือไม่ ฉันเข้าใจว่านี่จะหมายถึงการออกแบบสิ่งที่ฉันมีอยู่แล้วอีกครั้ง ขอบคุณ