我正在编写一个游戏,它将使用基于组件的实体系统。我要实现的前两个组件是 EntityRepresentation 和 EntityState。表示保存动画,状态决定实体应如何对游戏事件使用react(实体状态的示例:站立、跳跃、攻击、死亡、坠落)。
EntityRepresnetation 根据实体的 EntityState 决定在屏幕上绘制什么动画。如果实体处于“跳跃”状态,则会播放相应的动画。 (请参阅 EntityRepresentation::changeAnimation() 函数。)
这就是我编写类(class)的大致方式...
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 的类型,同时仍保留封装。
最佳答案
使用 typeid(),这就是它的用途。您可以使用 const type_info*
作为键类型。
或者,您知道,您可以只使用实际继承,例如调用虚拟函数来获取当前动画,这会更智能。
关于c++ - 基于组件的游戏实体和类型检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6371793/