我有一个使用实体组件系统(ECS)的现有工作C ++游戏库。
我的图书馆的用户想创建一些组件,例如Cat:-
class Cat{ public:
int hp;
float flyPower;
};
Run Code Online (Sandbox Code Playgroud)
他可以通过以下方式修改hp每个内容cat:
for(SmartComponentPtr<Cat> cat : getAll<Cat>()){
cat->hp-=5; //#1
}
Run Code Online (Sandbox Code Playgroud)
几天后,他想拆分Cat为HP和Flyable:-
class HP{ public:
int hp;
};
class Flyable{ public:
float flyPower;
};
Run Code Online (Sandbox Code Playgroud)
因此,每次cat访问hp都会编译错误(例如,#1在上面的代码中)。
为了解决这个问题,用户可以将他的代码重构为:
for(MyTuple<HP,Flyable> catTuple : getAllTuple<HP,Flyable>()){
SmartComponentPtr<HP> hpPtr=catTuple ; //<-- some magic casting
hpPtr->hp-=5;
}
Run Code Online (Sandbox Code Playgroud)
它可以工作,但是需要在用户代码中进行大量重构(调用的各个位置cat->hp)。
在ECS中拆分组件时如何编辑框架/引擎以解决可维护性问题?
我从未发现过任何不会受到此问题困扰的方法,例如:-
vel.dx = 0.;行)int currentHealth; …c++ maintainability game-engine c++14 entity-component-system