我是一个相当有经验的程序员,但我对c++的OOP体系结构和设计还比较陌生。我的大部分经验是使用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();我原以为我可以通过动态铸造来完成这个任务,但我真的没有任何办法。我尝试过将它们存储为空指针,但这并不是我所希望的那样。我一直在阅读这个游戏对象组件架构,我可能会尝试,但我真的很想挽救我已经写好的东西。我觉得这是一个很好的学习机会。如果有人有任何想法,我会很感激的。与其他简单的游戏引擎设计相比,我的架构如何?我的界面架构有意义吗?还是完全不稳定?
发布于 2012-12-26 23:12:52
如果您在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-27 14:39:22
如何在基类中使用模板方法模式和非抽象的空虚拟函数?
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
};https://stackoverflow.com/questions/14047165
复制相似问题