Cocos2d碰撞检测模型 - 最适合我的情况?

时间:2011-10-14 10:48:58

标签: objective-c xcode cocos2d-iphone collision-detection box2d

我正在构建一个带有大量子弹和移动敌人的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

我的问题很简单:如果我的优先级是优化,哪种方法更快?

谢谢!

1 个答案:

答案 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);
}