如何在Box2D中同时检测三个物体之间的碰撞?

时间:2011-03-24 09:19:26

标签: iphone objective-c box2d

我是Objective-C的新手。我目前正在使用Cocos2D和Box2D进行游戏。我的问题是,当3个物体碰撞在一起时,游戏会崩溃。现在让我详细描述我的游戏:

在我的游戏中,我有一个主角站在建筑物顶部。在建筑物下面是这条路。敌人以各种随机速度从道路经过,从右边进入屏幕并从左边离开。我已将敌人创建为b2_kinematicBodies,并使用SetLinearVelocity()为每个敌人设置随机速度。主角射击敌人。射弹(被射击的物体)是b2_dynamicBody。当射弹击中敌人时,射弹和敌人都会被摧毁。在游戏过程中,有时候以慢速移动的敌人会以更高的速度移动。如果一个射弹在它们重叠并且一个即将通过另一个的时候击中两个敌人,游戏就会崩溃!请帮帮我。

我使用b2contactListener类检测到了碰撞。

我之前没有提到过的一点是,我并没有将敌人创造为个体独特的身体。相反,我正在创建它并使其移动,我在init中调用此方法(创建敌人并使它们移动),如下所示:

[self schedule:@selector(addRightTarget) interval:2.0];

3 个答案:

答案 0 :(得分:1)

碰撞只发生在Box2D中的2个对象之间。因此,在您提到的场景中,您将获得多个碰撞事件,可能是

Enemy-1和Enemy-2 敌人-1和子弹 敌人-2和子弹

因此崩溃的一个可能原因可能是你没有想到(Enemy-1和Enemy-2)碰撞,而你正在处理它,就像你在Enemy-1和Bullet之间发生碰撞一样,所以你可能会把它投入错误的班级。确保在投射之前检查“isKindOf”类的类型。 此外,您可能希望使用接触过滤和/或为敌人分配类别蒙版,以便它们不会相互碰撞并且只与子弹碰撞。

但如果你讲述一下你的身体是如何以及在哪里摧毁你的身体(我希望它不在你的碰撞检测功能中),并且如果你可以在你的应用程序崩溃时共享异常文本,那将会更有帮助。很有帮助。

答案 1 :(得分:1)

我认为问题是在处理程序获得任何调用之前计算冲突。这意味着当你的处理程序被调用时,子弹击中了2个对象。所以你得到2个回拨,如下所示。

检测到碰撞:Bullet + Enemy1

  • 摧毁敌人1
  • 销毁子弹

检测到碰撞:Bullet + Enemy2

  • 摧毁敌人2
  • 销毁子弹[CRAAAASH !!!您刚刚尝试删除不存在的对象]

第一:你不应该删除除步骤功能之外的任何东西(如另一个答案中提到的那样)

第二:选择其中一个:

  • 使您的列表/要删除的对象数组成为“集合”或以避免重复的方式实现。
  • 检查世界中是否存在您的物品

答案 2 :(得分:0)

我使用了相当便宜的解决方法。我交替创造了不同大小的敌人装置(相差几个像素)。所以现在如果我拍摄它们即使它们重叠,应用程序也不会崩溃(因为只有较大的物体碰撞并被摧毁)。这符合我的目的。 Thanx a llot for your help。对此,我真的非常感激! :)