(Те, що я описую, ґрунтується на такому дизайні: що таке система системи?) , Прокрутіть униз і ви знайдете його)
У мене виникають проблеми зі створенням системи-компонентів сутності в C ++. У мене клас компонентів:
class Component { /* ... */ };
Що насправді є інтерфейсом для створення інших компонентів. Отже, щоб створити спеціальний компонент, я просто реалізую інтерфейс і додаю дані, які будуть використовуватися в грі:
class SampleComponent : public Component { int foo, float bar ... };
Ці компоненти зберігаються всередині класу Entity, який надає кожному екземпляру Entity унікальний ідентифікатор:
class Entity {
int ID;
std::unordered_map<string, Component*> components;
string getName();
/* ... */
};
Компоненти додаються до сутності шляхом хешування імені компонента (це, мабуть, не така чудова ідея). Коли я додаю нестандартний компонент, він зберігається як тип компонента (базовий клас).
Тепер, з іншого боку, у мене є системний інтерфейс, який використовує інтерфейс Node всередині. Клас 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
на похідний тип, але хотів дізнатися, чи є кращий спосіб зробити це. Я розумію, чи це означатиме перепроектування того, що я вже маю. Спасибі.