Я пытаюсь спроектировать игру, которую пишу на C ++, как систему Entity / Component (основная идея в том, что у меня будет набор классов «Entity», представляющих различные виды данных, и набор «Component»).классы, представляющие различные виды поведения, которые может иметь данный объект).Я хотел реализовать это, используя виртуальные базовые классы для компонентов.Например, у меня может быть сущность Character
:
class Character {
public:
int armor;
int health;
std::string name;
};
, а также компонент Fighter
, представляющий что-то, что может использовать оружие ближнего боя:
class Fighter {
public:
int damage;
virtual Direction attack() = 0;
}
и Mage
компонент, представляющий что-то, что может произносить заклинания
class Mage {
public:
std::vector<Spell> spellList;
virtual Spell cast() = 0;
}
Используя множественное наследование для их использования, я бы имел
class ElvenMage : Character, Mage {
public:
ElvenMage() {
this->armor = 0;
this->health = 10;
this->name = "elven mage";
this->spellList = ...;
}
virtual Spell cast() {
// some AI logic to figure out which spell to cast
}
};
и
class Player : Character, Fighter, Mage {
public:
Player() {
this->armor = 5;
this->health = 20;
this->name = "Player";
}
virtual Direction attack() {
// some logic to handle player melee input
}
virtual Spell cast() {
// some logic to handle player spell casting input
}
};
Для отслеживанияиз всех текущих символов на карте я могу сделать что-то вроде
class Engine {
public:
std::vector<std::unique_ptr<Character>> characters;
Я должен хранить их непосредственно как Characters
(не как Fighters
или Mages
), но мне нужно будет обрабатывать бойцови маги отдельно (например, перебирая все Characters
и, если они могут разыграть заклинание, они делают это, иначе они атакуют оружием ближнего боя).В реальной игровой логике, как бы я различил экземпляр Character
, который также реализует Mage
, и экземпляр Character
, который также реализует Fighter
?
Есть ли простой способделать то, что я пытаюсь, или я должен полностью переосмыслить свой дизайн?
(примечание: это не настоящий код; в реальном мире я бы фактически использовал фабрику или что-то для создания эльфов или чего-то еще вместо этогопопыток поместить всю информацию в конструктор, и я, вероятно, отделил бы логику по-другому, но это иллюстрирует мою проблему).