0

我正在研究一个无限的跑步者,我需要在单个精灵和精灵的 CCArray 中的任何精灵之间进行碰撞检测。你如何建议我这样做?目前这是我用来检查碰撞的方法,但它不起作用。

bool RunningScene::spritesAreColliding(cocos2d::CCSprite *spr1, cocos2d::CCSprite *spr2)
{
//Take the bounding box of the two sprites that are bounded
CCRect r1 = spr1->boundingBox();
CCRect r2 = spr2->boundingBox();

if (r1.intersectsRect(r2)) { //Check if the bounding boxes are intersecting and return a true/false
    return true;
} else {
    return false;
}

}

我在 if 语句中使用它,如果它返回 true,则 if 语句有效。我不希望像素完美的碰撞检测,但我想知道该方法是否适用于检查碰撞,并且我想知道如何从 CCArray 访问碰巧与 _runner sprite 碰撞的任何 sprite。

4

1 回答 1

0

我不确定您的代码为什么不起作用,因为我看不到您在做什么。假设该方法返回 true。你做什么工作?

碰撞检测很困难。我建议您查看本书的相应章节:实时碰撞检测

有两种方法:连续的和离散的。

看起来您正在尝试使用离散碰撞检测。这是您在碰撞发生对碰撞做出反应的时候。您需要找到穿透轴,以便您知道“将盒子推开”的方向。一种简单而缓慢的方法是在它们开始碰撞之前的那一刻进行一种“二分搜索”。在应用它们的速度之前将对象带到它们的位置(帧开始)。现在应用一半的速度。它们相交吗?如果不是,应用 0.75 的速度,如果是,应用 0.25 的速度。重复预设次数的迭代,直到它们不再相交。

您还必须设置它们的速度,以便它们“反弹”或至少停止沿它们最后相交的轴移动。

离散碰撞检测是有问题的。最著名的问题是隧道。这是当物体移动得如此之快以至于它们不相交时。当应用它们的速度时,“相互穿过”并且碰撞永远不会被捕获。对于 2D 碰撞检测,我推荐使用连续方法。

于 2014-07-22T20:50:19.047 回答