7

我是一个相当有经验的程序员,但我对 C++ 中的 OOP 架构和设计还是比较陌生。我的大部分经验是使用 C# 和 Java。我最近尝试用 C++ 编写一个简单的游戏引擎。我将 SDL 用于图形。在这篇文章中,我想讨论我的架构并获得一些反馈。特别是,我遇到了一个需要帮助的设计问题。所以,这里是:

  • 在我的主要功能中,我初始化了所有用于绘制到屏幕等的 SDL 内容。
  • 然后我实例化所有我打算使用的对象:地板、墙壁、播放器等。
  • 接下来我开始主循环。该循环执行每个对象的移动、碰撞检测和碰撞处理功能,并重新绘制它们。
  • 主循环一直运行直到应用程序退出,每次迭代绘制一帧。

我的问题是这样的:我尝试做一种界面风格的设计。它涉及一系列允许每个对象实现行为的抽象基类。例如,如果我希望一个对象是可移动的,它必须继承自可移动基类,该基类包含一个名为的虚函数move()和一些位置坐标。如果我希望它是可碰撞的,则该对象将从可碰撞抽象类继承,该抽象类包含虚函数checkCollision()handleCollision()hitbox 成员变量。像播放器这样的对象继承自这两个基类以及其他几个基类。

只要我在主循环中手动完成所有操作,这就足够了。我只能说:

player.move();
player.checkCollision();
player.handleCollision();
player.draw(). 

没关系。但我希望能够在主循环中有一个向量或通用对象数组并执行以下操作:

for each object in vector
    if object is of type movable
        object.move();
    if object is of type collidable
        object.checkCollision();

我以为我可以通过动态投射来完成这一点,但我真的什么都想不出来。我已经尝试将它们存储为 void 指针,但这并不像我想要的那样工作。我一直在阅读我可能会尝试的视频游戏的游戏对象组件架构,但我真的很想挽救我已经写过的东西。我认为这是一个很好的学习机会。如果有人有任何想法,我将不胜感激。我的架构与其他简单的游戏引擎设计相比如何?我的界面架构有意义还是完全靠不住?

4

2 回答 2

9

如果您使用 C++ 工作,请尝试SFML,它比SDL更快,如果您了解OpenGL,您也可以使用它。
对于您的问题:

class Entity {
     //constructor and other stuff
     void virtual exec() =0; ///<= pure virtual method
};

class Movable : Entity {
    void move(); //do somthing
    void exec() {move();};
};

class Collidable : Entity {
   void col(); //do your job
   void exec(){col();};
};

std::vector<Entity*> e_v;
///push some instance
for (Entity* e : e_v)
   e->exec();
于 2012-12-26T23:12:52.730 回答
0

在基类中使用模板方法模式和非抽象空虚函数怎么样?

class Entity
{
    void update()
    {
        move();
        checkCollision();
    }

    virtual void move() {}
    virtual void checkCollision() {}
};

class Movable : public virtual Entity
{
    virtual void move() {}   // Stuff
};

class Collidable : public virtual Entity
{
    virtual void checkCollision() {}   // Stuff
};
于 2012-12-27T14:39:22.360 回答