bfo*_*ops 9 c++ collision-detection
The code given is for example purposes, not copypasta from my codebase
我正在使用Boost和SDL用C++编写一个原始的,跨平台的Snake游戏,我想知道实现冲突处理的最佳方法是什么(不是碰撞检测).到目前为止,我一直在使用单一调度的想法,带有难看的意大利面条代码,如下所示:
void Snake::CollisionHandler(const WorldObject& obj)
{
// collided with self
if(obj.GetObjectType() == snake)
Die();
...
...
}Run Code Online (Sandbox Code Playgroud)
另外,我有一个"全局"碰撞处理程序,它处理碰撞中涉及的事情,它们独立于每个对象,例如:
void GameWorld::CollisionHandler(WorldObject& obj1, WorldObject& obj2)
{
if(obj1.GetObjectType() == snake && obj2.GetObjectType() == snake)
PlayDeathSound();
...
...
}
Run Code Online (Sandbox Code Playgroud)
避免像碰撞一样播放两次的声音.
我也考虑过双重调度,如下:
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();
}
...
...
}
Run Code Online (Sandbox Code Playgroud)
有没有我缺少的策略?哪一个最好是最好的?他们似乎都涉及一些丑陋的代码,而单一和双重调度涉及多态性,我个人试图回避.
| 归档时间: |
|
| 查看次数: |
3367 次 |
| 最近记录: |