我在写一个游戏,它将使用基于组件的实体系统。我要实现的前两个组件是EntityRepresentation和EntityState。表示包含动画,状态决定实体对游戏事件的反应(实体状态的示例:站立、跳跃、攻击、死亡、坠落)。在
EntityRepresnetation根据实体的EntityState决定在屏幕上绘制什么动画。如果实体处于“跳跃”状态,将播放相应的动画。(请参见EntityRepresentation::changeAnimation()函数。)
我大概是这样写这节课的。。。在
class EntityRepresentation
{
public:
void draw(float x, float y, long currentTime, DrawingContext& dc) {
// ...
}
void changeAnimation(const EntityState::Id& stateId) {
currentAnimation = animationMap_[stateId];
}
private:
map<EntityState::Id, const Animation*> animationMap_;
const Animation* currentAnimation_;
};
我真的不喜欢我现在的方法。。。>;:(EntityState::Id部分。当前,EntityRepresentation将其持有的每个动画映射到特定的EntityState::Id。该Id对于从EntityState派生的每个类都是唯一的(对于类,而不是实例)。这些ID基本上都是字符串,必须在类的构造函数中手工编写,这意味着它们很容易发生名称冲突—更重要的是,我计划让游戏可编写脚本(Python)。在
有人能不能给我一些建议,告诉我如何才能缓解这个问题,我的身份证。我在游戏中看到了很多基于组件的系统的实现,但是我还是不喜欢它们。只是让我很不舒服。在
也许您可以建议进行设计更改,这样EntityRepresentation不必知道EntityState的类型,同时仍然保留封装。在
使用typeid(),这就是它的用途。您可以使用
const type_info*
作为密钥类型。在或者,您知道,您可以使用实际继承,比如调用一个虚拟函数来获取当前动画,这将更加智能。在
我建议使用State pattern实现设计
假设在编译时不需要与每个EntityState关联的ID,我使用的一个技巧是使用指针作为ID,在这种情况下,您可以简单地使用单例实例的地址作为ID,否则静态地为每个ID分配一小块内存就可以了。在
编辑:为避免静态初始化顺序问题而进行的微小更改。在
相关问题 更多 >
编程相关推荐