我正在编写一个游戏,它将使用基于组件的实体系统。我要实现的前两个组件是 EntityRepresentation 和 EntityState。表示包含动画,状态决定实体应如何对游戏事件做出反应(EntityStates 的示例:站立、跳跃、攻击、死亡、坠落)。
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)。
有人可以给我一些建议,告诉我如何缓解我在 ID 上遇到的这个问题。我在同样使用 ID 的游戏中看到了很多基于组件的系统的实现,但我仍然不喜欢它们。它只是以错误的方式摩擦我。
也许您可以建议进行设计更改,这样 EntityRepresentation 就不必知道 EntityState 的类型,同时仍然保留封装。