当前位置: 首页 > 知识库问答 >
问题:

碰撞检测在 cocos2d-x 中不正确发生

吕自怡
2023-03-14

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

代码如下:

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-1.3验证了这一点。

PPS:顺便说一句,我试图使用ccDrawSolidRect绘制自己的边界框,但我似乎无法做到这一点。

共有2个答案

寿毅庵
2023-03-14

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

我相信这是相交法的一个限制。发生的情况是我的投射精灵被旋转了。现在,当一个精灵被旋转时,你会注意到,最大X和最大Y不在同一个坐标上。一种可能的组合是(min X, max Y),(min Y, max X)。

intersectRect没有考虑到这种可能性,并假设Rect将始终平行于X轴和Y轴,但在我的场景中并非如此。

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

楚岳
2023-03-14

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
}
 类似资料:
  • 我下面的碰撞方法有问题。问题是当游戏中有两个敌人时。它与循环中的一个敌人相交,然后返回true进行碰撞。但是如果在这个数组列表中有第二个敌人,它将不会与第二个物体碰撞,因此导致它返回false,玩家继续行走。有什么办法可以让他在接触任何敌人时停下来,而不是因为他没有接触到所有的敌人而继续下去吗?谢谢,这是密码。

  • 我正在用一个简单的克隆人进行实验,以了解游戏状态,游戏循环等。 我遇到的困难之一是碰撞检测。 我有一个由Ball、Brick和Paddle扩展的类。在这个类中,我有一个方法来返回对象的边界矩形,一个碰撞(item)方法来确定2个对象是否发生了碰撞,以及用于、、和的方法来确定对象的哪一边与另一边发生了碰撞。 这些方法如下: ball类有一个名为< code > checkBallCollission

  • 在一个小行星游戏中,我在旋转精灵时尝试使用XNA进行2D碰撞检测时遇到了一些问题。在子弹击中小行星之前,碰撞一直在发生(看起来是从各个方向),当飞船撞上小行星时,碰撞也是不准确的。我使用一个矩阵来旋转飞船发射的子弹,然后是一个小行星的矩阵,并且在一个Xbox独立游戏论坛上使用了每像素碰撞检测样本。 这是我的子弹矩阵…原点和位置是子弹的矢量2属性 和小行星... 我是编程新手,在过去的几天里,我一直

  • 问题内容: 我正在开发一种游戏,其中用户必须击打高速球。为了击球,我使用旋转关节将一个矩形物体与演员连接在一起,并使它的马达以指定速度(马达速度)旋转。现在一切都非常完美,但是当球的速度很高时,它绕过了矩形车身。使用碰撞列表器,我发现发生了碰撞,但是碰撞后球没有被反射。因为只有在球高速运转时才会发生这种情况,所以要碰撞的物体的密度是bcoz。还是它的旋转关节马达?我在这里想念什么吗? 这是两个主体

  • 碰撞检测 现在你知道了如何制造种类繁多的图形对象,但是你能用他们做什么?一个有趣的事情是利用它制作一个简单的 碰撞检测系统 。你可以用一个叫做:hitTestRectangle 的自定义的函数来检测两个矩形精灵是否接触。 hitTestRectangle(spriteOne, spriteTwo) 如果它们重叠, hitTestRectangle 会返回 true。你可以用 hitTestRect

  • 本节暂未进行完全的重写,错误可能会很多。如果可能的话,请对照原文进行阅读。如果有报告本节的错误,将会延迟至重写之后进行处理。 当试图判断两个物体之间是否有碰撞发生时,我们通常不使用物体本身的数据,因为这些物体常常会很复杂,这将导致碰撞检测变得很复杂。正因这一点,使用重叠在物体上的更简单的外形(通常有较简单明确的数学定义)来进行碰撞检测成为常用的方法。我们基于这些简单的外形来检测碰撞,这样代码会变得