我正在用 C++ 实现一些游戏,但从技术上讲,只要我有严格的 OOP/设计模式问题,这并不重要。
我有一个抽象类型 MapObject 的容器。让我们称他为MO。
在 MO 内部,我有扩展 MapObject 的类:TankX、TankY、Bullet、LineBullet、Terrain 等。
只要我和它的成员做很多事情,我就需要 MO。
东西包括碰撞检测。
在游戏循环中,我通过以下方式寻找碰撞:
foreach(MO A)
foreach(MO B)
somehow check collision policy and if A may collide B in theory, check this out in practice
take coords of A, B and detect collision
问题是,碰撞策略非常复杂。
例如: LineBullet 可以与 TankX 和 Terrain 发生碰撞,但不能与 TankY 发生碰撞。子弹可以碰撞两个坦克,但不能碰撞地形。等等等等
实际上,我有更多的类,所以有更复杂的例子。
好吧,在嵌套的 foreach 循环中,我拥有的是 MO A 和 MO B。我不知道它们到底是什么;TankY、TankX、LineBullet 或其他。我唯一拥有的是访问它们的通用接口。没关系。
问题是:如何以正确的方式在这些嵌套循环中考虑冲突策略?
我的临时解决方案太丑陋了,我无法接受。
我所做的如下:
- 在 MO 我有返回 int 的多态函数 getID()
- 每个类如 TankX、TankY、Bullet 等都实现 getID() 并返回一些硬编码的唯一 ID
- 我也有类 PolicyManager 的对象 PM。此类包含碰撞性矩阵(所有情况)。所以它知道全局碰撞策略。
在嵌套循环中:
foreach(MO A)
foreach(MO B)
if(PM->checkCollisionPolicy(A->getID(),B->getID()))
start to detect collision