在我的游戏引擎中,我创建了一个非常时髦的基于组件的实体系统,它允许我将实体类型定义为组件的组合,指定为模板参数,例如:
typedef Entity<Locateable, Collidable, Renderable /* etc */ > SomeEntity;
这很好,直到我需要唯一地标识模板定义的实例化。
typedef Entity<Locateable, Collidable, Renderable> Missile;
typedef Entity<Locateable, Collidable, Renderable> Bullet;
typeid(Missile) == typeid(Bullet) // sad panda :(
显然他们是同一类型,但我希望他们不是,理想情况下我想给每个人一个字符串名称,如下所示:
// Invalid code...
typedef Entity<"Missile", Locateable, Collidable, Renderable> Missile;
typedef Entity<"Bullet", Locateable, Collidable, Renderable> Bullet;
这样我以后可以访问静态name()方法。但这不起作用,因为字符串需要静态实例化。我也尝试这样做,但也不允许lambdas ......
// More invalid code...
typedef Entity<[]()-> char* { return "Missile"; }, Locateable, Collidable, Renderable> Missile;
typedef Entity<[]()-> char* { return "Bullet"; }, Locateable, Collidable, Renderable> Bullet;
所以,我的问题是,是否有一些巧妙的技巧可以让我将模板定义命名为内联?
答案 0 :(得分:4)
您可以使用简单的继承,而不仅仅是使用typedef,可能是这样的:
class Missile : public Entity<Locateable, Collidable, Renderable>
{
public:
static std::string name() { return "Missile"; }
};
class Bullet: public Entity<Locateable, Collidable, Renderable>
{
public:
static std::string name() { return "Bullet"; }
};
答案 1 :(得分:2)
ECS的重点是毫无意义。如果它没有毫无意义的动态,那么为什么首先要使用ECS呢?只需使用常规课程和作文。