【发布时间】:2011-09-16 08:09:12
【问题描述】:
我正在编写一个游戏,它将使用基于组件的实体系统。我正在实现的前两个组件是 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 的类型,同时仍然保留封装。
【问题讨论】:
-
“取决于实体的状态”——这是否与 EntityState 相关,或者例如到更广泛意义上的状态?
-
@Luc 在 EntityState 类上。 EntityState 是所有状态的基类。 EntityState 有一个 EntityState::Id 类型的字段(它只是一个字符串),它(应该)对每种类型的 EntityState 都是唯一的。
标签: c++ python components entity-system