shw*_*eph 7 c++ architecture oop interface game-engine
我是一个相当有经验的程序员,但我仍然相对较新的OOP架构和c ++设计.我的大部分经验都是使用C#和Java.我最近努力用c ++编写一个简单的游戏引擎.我使用SDL作为图形.在这篇文章中,我想讨论我的架构并获得一些反馈.特别是,我遇到了一个我想要帮助的设计问题.所以,这里是:
我的问题是:我尝试做一种界面风格的设计.它涉及一系列允许每个对象实现行为的抽象基类.例如,如果我想要一个对象是可移动的,那么它必须从包含被调用的虚函数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指针,但这并不像我想要的那样工作.我一直在阅读有关视频游戏的游戏对象组件架构,我可能会尝试,但我真的想要挽救我已经写过的内容.我认为这是一个很好的学习机会.如果有人有任何想法我会非常感激.我的架构与其他简单的游戏引擎设计相比如何?我的界面架构是否有意义还是完全不稳定?
如果您使用的是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)