在基于组件的游戏中排序类

时间:2014-02-01 21:48:52

标签: c++ components

我正在使用SDL在C ++中编写一个简单的Pacman克隆。我想尝试用基于组件的设计编写它,因为我相信当我开始编写更复杂的游戏时,这些知识将使事情变得更容易。我已经了解到基于组件的游戏设计有很多不同的方法,但我能找到的最简单,最完整的例子来自Bob Nystrom的书籍 Game Programming Patterns 。从我在网上看到的,与实体系统相比,本书中的方式可能会被认为有些笨重,但我认为这可能是一个很好的起点。

Nystrom在他的示例中所做的是创建一个通用的GameObject类,该类包含指向每个组件类的对象的指针。以下是我的一些测试代码,遵循他的例子:

class GameObject
{
protected:
    InputComponent* input_;

public:
    float xvel, yvel;
    float xpos, ypos;

    GameObject(InputComponent* input) : input_(input)
    {   };

    void update()
    {
        input_->update(*this);
    }
};

class InputComponent
{
protected:
    //Input variables

public:

    void update(GameObject& character)
    {
        //Takes user input and updates character accordingly
    }
};

这是本书中使用的基本设计模式。使用它,您应该能够实例化GameObject类的对象并为其提供一个InputComponent。根据Nystrom的说法,这可能是这样的:

GameObject* character = new GameObject(new InputComponent())

然后可以通过简单地调用角色对象上的更新函数来更新游戏对象,然后更新所有组件(在这种情况下,我只设置了输入组件)。

这一切都有道理,除了我遇到了问题。因为GameObject类包含来自InputComponent的对象,并且InputComponent有一个以GameObject作为参数的函数,所以我的代码将无法编译。如果我将GameObject类放在我的代码中,那么它说GameObject类中的InputComponent是一个未知类型。如果我首先放置InputComponent类,那么它表示InputComponent类中的GameObject是未知类型。我相信我已经非常密切地关注了Nystrom的例子(授予,我简化了许多代码,因为我刚刚开始),所以我相信我误解了Nystrom的例子,或者他的代码中存在错误。

所以,这是我的问题:是否有可能以这种方式构建组件系统?是否有一些我想念的简单,或者这种类型的“一个类调用另一个类的对象,反之亦然”在C ++中是非法的?

0 个答案:

没有答案