У меня есть работающая библиотека игр C ++, которая использует Entity-Component-System (ECS).
Пользователь моей библиотеки хотел бы создать некоторые компоненты, например Cat
: -
class Cat{ public:
int hp;
float flyPower;
};
Он может изменить hp
каждого cat
, например: -
for(SmartComponentPtr<Cat> cat : getAll<Cat>()){
cat->hp-=5; //#1
}
Через несколько дней он хочет разделить Cat
на HP
и Flyable
: -
class HP{ public:
int hp;
};
class Flyable{ public:
float flyPower;
};
Таким образом, каждый cat
, имеющий доступ hp
, будет компилировать ошибку (например, на #1
в приведенном выше коде.)
Чтобы решить, пользователь может изменить свой код на: -
for(MyTuple<HP,Flyable> catTuple : getAllTuple<HP,Flyable>()){
SmartComponentPtr<HP> hpPtr=catTuple ; //<-- some magic casting
hpPtr->hp-=5;
}
Это работает, но требует много рефакторинга в коде пользователя (различные места, которые вызывают cat->hp
).
Как отредактировать каркас / механизм для решения проблемы удобства сопровождения при разбиении компонента в ECS?
Я никогда не находил подходов, которые не страдают от этогонапример: -