【问题标题】:Collision Detection between a sprite and an array of sprites精灵和精灵数组之间的碰撞检测
【发布时间】:2014-07-22 20:33:35
【问题描述】:

我正在研究一个无限跑步者,我需要在单个精灵与精灵 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 精灵发生碰撞的任何精灵。

【问题讨论】:

  • 它不工作的原因是什么?如果你有return r1.intersectsRect(r2);,它可能会更有效一些,但这个概念看起来基本上是合理的。

标签: c++ ios cocos2d-x cocos2d-x-2.x


【解决方案1】:

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

碰撞检测很困难。我建议您查看本书的相应章节:Real Time Collision Detection。

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

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

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

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

【讨论】:

    猜你喜欢
    • 2023-04-02
    • 2017-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多