c++ - 基于组件的游戏实体和类型检查

标签 c++ python components entity-system

我正在编写一个游戏,它将使用基于组件的实体系统。我要实现的前两个组件是 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/

相关文章:

python脚本来 pickle 整个环境

javascript - Vue.js 中的组件

database - 动态地在表单上放置复选框

c++ - 错误 C2228 : left of '.push_back' must have class/struct/union

c++ - 为什么 std::queue::pop 没有返回值?

python - 使用行为标签仅执行此类标签的子案例

python - 图像在本地工作,但部署到 Google App Engine 后就无法工作?

components - 在不使用任务的情况下从组件调用更新函数

c++ - 有人对 SSEPlus 有任何经验吗?

c++ - Boost.Regex 表达式构建