我有一个奇怪的问题。我已经开始在c ++ / SFML中实现简单的游戏引擎。 我实现了一个消息和消息队列系统,以便模块解耦并避免任何混淆的依赖。我还实现了一个类Entity,它代表游戏中的一个对象(包含它的位置,精灵,等等)。
每个实体都有一个名为" on_message",当指定的实体应该收到消息时,由消息队列调用。 (例如:如果实体P1是来自P2的消息的目的地,则msg_queue将调用p1.on_message传递msg_type"说损坏"它要做某事。
我的问题是,所有实体(来自类实体的对象)现在都具有on_message函数的相同实现。但是,这个功能应该从一个实体到另一个实体不同(所以当#34;说"空间被按下时,玩家的行为与敌人不同)
我得到的一个想法是使用继承,但我认为这不是正确的,好像游戏有100个实体我应该做100级!?
是否有任何有效的想法可以解决这个问题? 提前致谢
答案 0 :(得分:0)
我得到的一个想法是使用继承,但我认为这不是正确的,好像游戏有100个实体我应该做100级!?
这实际上是完全可能的,对于定义得足以拥有自己的类的实体来说,它甚至可能是“正确的”。如果除了接收消息的行为之外,你开始需要数据成员或其他自定义函数将所有内容打包在一个类中是一个好主意。
另一方面,如果你有很多非常相似的实体,在接收某些消息时行为上只有一些差异,你可能有一个共同的超类,它提供一个自定义点,例如使用例如可分配的std::function
。像这样:
struct Entity {
...
virtual ret on_message(msg_type msg) = 0;
};
...
struct LightweightCustomEntity : public Entity {
std::function<ret(msg_type)> custom_on_message;
virtual ret on_message(msg_type msg) override {
if(!custom_on_message) return ret();
return custom_on_message(msg);
}
};
// ...
// in reality this would be a smart pointer or whatever
Entity *e = new LightweightCustomEntity;
e->custom_on_message = [](msg_type msg) {
if(msg.type == SAY_DAMAGE) {
return ret(42);
}
return ret();
};
这允许更多的运行时灵活性,但请注意,在紧凑性方面你并没有真正获得太多 - 特别是在C ++ 11中我们可以继承构造函数,定义一个继承自Entity
并覆盖{{{ 1}}或多或少采用相同的代码。