这里给出的代码仅作为示例,不是我代码库中的复制粘贴
我正在使用Boost和SDL编写一个基本的跨平台贪吃蛇游戏,我想知道实现碰撞处理(而不是碰撞检测)的最佳方法是什么。到目前为止,我一直在使用单调度思路,但代码非常混乱,像这样:
void Snake::CollisionHandler(const WorldObject& obj)
{
// collided with self
if(obj.GetObjectType() == snake)
Die();
...
...
}
此外,我有一个“全局”碰撞处理程序,用于处理与每个对象无关的碰撞相关事项,例如:
void GameWorld::CollisionHandler(WorldObject& obj1, WorldObject& obj2)
{
if(obj1.GetObjectType() == snake && obj2.GetObjectType() == snake)
PlayDeathSound();
...
...
}
为了避免碰撞时声音被重复播放。
I've also considered double-dispatch, like so:
void Snake::CollisionHandler(WorldObject& obj) const
{
// invoke obj's collision handler with a const Snake& parameter
obj.CollisionHandler(*this);
}
// collided with self
void Snake::CollisionHandler(const Snake& obj)
{
Die();
}
这也包括一个类似于上面的全局碰撞处理程序。然后还有一种方法,仅使用全局碰撞处理程序(它是所有游戏对象的友元函数),如下所示:
void GameWorld::CollisionHandler(WorldObject& obj1, WorldObject& obj2)
{
// snake collided with self
if(obj1.GetObjectType() == snake && obj2.GetObjectType() == snake)
{
obj1.Die();
obj2.Die();
PlayDeathSound();
}
...
...
}
有没有我错过的策略?哪一个最好?它们似乎都涉及到一些丑陋的代码,而单分派和双分派涉及到多态性,我个人尽量避免使用。
Die()
两次。我怀疑那会是一件坏事。另外,不需要“friend”任何东西,只需将所需的函数设置为公共函数即可。 - Mark Storer