我是一名经验丰富的程序员,但在C++的面向对象架构和设计方面仍然比较新手。我大部分的经验都来自C#和Java。最近,我尝试用C++编写一个简单的游戏引擎。我使用SDL进行图形处理。在这篇文章中,我想讨论我的架构,并获得一些反馈意见。特别是,我遇到了一个设计问题,希望能得到一些帮助。以下是我的疑问:
- 在我的主函数中,我初始化了所有用于绘制屏幕等的SDL内容。
- 然后我实例化了所有我打算使用的对象:地板、墙壁、玩家等。
- 接下来我开始主循环。这个循环执行每个对象的移动、碰撞检测和碰撞处理函数,并重新绘制它们。
- 主循环一直运行,直到应用程序退出,每次迭代绘制一帧。
move()
的虚函数和一些位置坐标。如果我希望它可以发生碰撞,那么该对象将从可碰撞抽象类继承,该类包含名为checkCollision()
和handleCollision()
的虚函数以及一个碰撞框成员变量。像玩家这样的对象从这两个基类以及其他几个基类继承。
只要是在主循环中手动进行的操作都可以很好地工作。我可以只说:
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指针,但这并不像我想要的那样工作。我一直在阅读有关游戏对象-组件架构的内容,可能会尝试一下,但我真的很想挽救我已经写过的内容。我认为这是一个很好的学习机会。如果有人有什么想法,我会非常感激。我的架构与其他简单的游戏引擎设计相比如何?我的接口架构是否合理或完全错误?
enroll
方法(或任何您喜欢的名称)并向其中传递包含这些单独列表的对象注册表来使其“更好”。例如,如果您有一个FlyingSaucer
类,则其.enroll(Registry r)
方法将调用r.add((Movable) this)
和r.add((Collidable) this)
,将FlyingSaucer
添加到可移动对象列表和可碰撞对象列表中。确保对象永远不会被部分删除的业务逻辑可以隐藏在Registry::add
中。 - user824425typeid
运算符,http://en.wikipedia.org/wiki/Typeid - Dims