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