我的c ++游戏架构

时间:2012-12-26 22:41:30

标签: c++ oop architecture interface game-engine

我是一位经验丰富的程序员,但我仍然比较熟悉OOP架构和c ++设计。 我的大部分经验都是使用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指针,但这并不像我想要的那样工作。我一直在读这个 我可能尝试的视频游戏的游戏对象组件架构,但我真的想要挽救我已经拥有的东西 书面。我认为这是一个很好的学习机会。如果有人有任何想法我会非常感激。我的架构与其他简单的游戏引擎设计相比如何?我的界面架构是否有意义还是完全不受欢迎?

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分: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
};