我正在构建一个带有大量子弹和移动敌人的cocos2d iPhone游戏,我正在检测它们之间的碰撞。出于碰撞目的,每个精灵都可以用圆圈表示。我正在考虑以下选项:
1)简单球体检测
我会定期检测到这种情况:
-(BOOL) isCollidingSphere:(CCSpriteExt*) obj1 WithSphere:(CCSprite *) obj2
{
float minDistance = obj1.radius + obj2.radius;
float dx = obj2.position.x - obj1.position.x;
float dy = obj2.position.y - obj1.position.y;
if (! (dx > minDistance || dy > minDistance) )
{
float actualDistance = sqrt( dx * dx + dy * dy );
return (actualDistance <= minDistance);
}
return NO;
}
2)Box2d仅用于碰撞检测
我为所有精灵创建了一个Box2d正文,如本教程所示:http://www.raywenderlich.com/606/how-to-use-box2d-for-just-collision-detection-with-cocos2d-iphone
我的问题很简单:如果我的优先级是优化,哪种方法更快?
谢谢!
答案 0 :(得分:1)
如果您只需要基于距离/半径的碰撞检查,则不需要物理引擎。
你应该摆脱 sqrt 。首先,您正在使用适用于双精度的平方根函数。对于float版本,请使用 sqrtf 。
要完全摆脱平方根,请确保对象存储其半径平方(radiusSquared = radius * radius)。这样你就不必再占用平方根了:
-(BOOL) isCollidingSphere:(CCSpriteExt*) obj1 WithSphere:(CCSprite *) obj2
{
float r1 = obj1.radius;
float r2 = obj2.radius;
float minDistanceSquared = r1 * r1 + r2 * r2 + 2 * r1 * r2;
float dx = obj2.position.x - obj1.position.x;
float dy = obj2.position.y - obj1.position.y;
float actualDistanceSquared = dx * dx + dy * dy;
return (actualDistanceSquared <= minDistanceSquared);
}