我的c ++游戏架构

shw*_*eph 7 c++ architecture oop interface game-engine

我是一个相当有经验的程序员,但我仍然相对较新的OOP架构和c ++设计.我的大部分经验都是使用C#和Java.我最近努力用c ++编写一个简单的游戏引擎.我使用SDL作为图形.在这篇文章中,我想讨论我的架构并获得一些反馈.特别是,我遇到了一个我想要帮助的设计问题.所以,这里是:

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

我的问题是:我尝试做一种界面风格的设计.它涉及一系列允许每个对象实现行为的抽象基类.例如,如果我想要一个对象是可移动的,那么它必须从包含被调用的虚函数move()和一些位置坐标的可移动基类继承.如果我要它是可碰撞,对象会从可碰撞抽象类,其中包含虚拟函数继承checkCollision()handleCollision()以及一个击中格成员变量.像播放器这样的对象继承了这两个基类以及其他几个基类.

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

player.move();
player.checkCollision();
player.handleCollision();
player.draw(). 
Run Code Online (Sandbox Code Playgroud)

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

for each object in vector
    if object is of type movable
        object.move();
    if object is of type collidable
        object.checkCollision();
Run Code Online (Sandbox Code Playgroud)

我认为我可以通过动态铸造实现这一目标,但我真的无法想出任何东西.我已经尝试将它们存储为void指针,但这并不像我想要的那样工作.我一直在阅读有关视频游戏的游戏对象组件架构,我可能会尝试,但我真的想要挽救我已经写过的内容.我认为这是一个很好的学习机会.如果有人有任何想法我会非常感激.我的架构与其他简单的游戏引擎设计相比如何?我的界面架构是否有意义还是完全不稳定?

Kro*_*ark 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();
Run Code Online (Sandbox Code Playgroud)