0

我遵循使用边界框方法的简单碰撞检测方法,并检查它们是否相交。

代码如下:

CCRect projectileRect = projectileSprite->boundingBox();      
CCRect enemyRect = enemySprite->boundingBox();

if (projectileRect.intersectsRect(enemyRect)) {
    // do stuff
}

编辑:我也尝试通过获取 x、y 位置并添加精灵的宽度和高度来创建自己的边界框。

现在,发生了一件有趣的事情,即碰撞检测有效,但它的工作有点不正确。在实际交叉点发生之前检测到碰撞检测。

我通过打开 CC_SPRITE_DEBUG_DRAW 验证了这一点,它确实发生在碰撞发生前的几分钟,即射弹的边界框在敌人的边界框之外。

这似乎是大多数人推荐的基本功能,我似乎遗漏了一些东西。谁能推断出,我可能做错了什么?

PS:我用 cocos2d-x-2.2 和 cocos2d-2.1rc0-x-2.1.3 验证了这一点。

PPS:顺便说一句,我尝试使用 ccDrawSolidRect 绘制我自己的边界框,但我似乎无法让它工作。

4

2 回答 2

0

我相信我通过旧的“使用 printfs(CCLogs) 遍历代码并检查框架代码”方法找到了答案。:)

我相信这是 intersectRect 方法的限制。发生的事情是我的弹丸精灵被旋转了。现在,当旋转精灵时,您会注意到,最大 X 和最大 Y 不在同一个坐标中。一种可能的组合是 (min X, max Y), (min Y, max X)。

intersectRect 没有考虑到这种可能性,并假设一个矩形总是平行于 X 轴和 Y 轴,但在我的场景中并非如此。

希望这可以帮助某人。在我写出一个简单的方法来解决这个问题之后,我会发布一个解决方案。

于 2013-10-19T20:51:37.920 回答
0

boundingBox() 只为您提供节点的边界/矩形,而不管其在父节点上的位置/位置。您需要根据它的位置来翻译它,如下所示:

CCSize = projectileSprite->getContentSize();
CCRect projectileRect = CCRectMake(
    projectileSprite->getPosition().x - (size.width/2),
    projectileSprite->getPosition().y - (size.height/2),
    size.width,
    size.height);

size = enemySprite->getContentSize();
CCRect enemyRect = CCRectMake(
    enemySprite->getPosition().x - (size.width/2),
    enemySprite->getPosition().y - (size.height/2),
    size.width,
    size.height);

if (projectileRect.intersectsRect(enemyRect)) {
    // Collision detected
}
于 2013-10-19T20:30:01.393 回答