2011-03-24 97 views
2

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

在我的游戏中,我有一个站在建筑物顶部的主角。在大楼下面有这条路。敌人从道路以各种随机速度从右边进入屏幕并从左边退出。我创造了敌人b2_kinematicBodies,并使用SetLinearVelocity()为他们每个人设置了随机速度。主角射击敌人。射弹(被射击的物体)是b2_dynamicBody。当射弹击中敌人时,射弹和敌人都被毁灭。在游戏过程中,有时以较低的速度移动的敌人越过以较高的速度移动的敌人。如果一个弹丸在两个敌人重叠时击中两个敌人,另一个则要通过另一个,那么游戏就会崩溃!请帮我解决一下这个。

我使用b2contactListener类检测到碰撞。

我之前没有提到过的一件事是,我并没有将敌人创造为个体独特的身体。相反,我曾经创造它,使之移动,我打电话里面的init这个方法(它创建的敌人,并使其移动)如下:

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

回答

1

我相信问题是在您的处理程序获取任何调用之前计算碰撞。这意味着当你的处理程序被调用时,子弹击中了2个对象。所以你会得到2个回叫,如下所示。

碰撞检测:子弹+ Enemy1

  • 销毁Enemy1
  • 销毁子弹

碰撞检测:子弹+ Enemy2

  • 销毁Enemy2
  • 销毁子弹[CRAAAASH !你只是想删除一个不存在的对象]

1:除了在你的阶跃函数,你不应该删除任何东西(如有人在另一个答复中提到)

第二:选择其中之一:

  • 使您的待删除对象的列表/数组成为“集合”或以避免重复的方式实现。
  • 检查你的对象的存在,在世界
1

碰撞仅在Box2D的2个物体之间发生。因此,在你提到的情况下你会得到这可能是多次碰撞事件,

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

因此崩溃的一个可能的原因是(Enemy-1和Enemy-2)碰撞并且你正在处理它,就像你在(Enemy-1和Bullet)之间有碰撞一样,所以你可能会将它投入错误的课堂。确保在投射之前检查类“isKindOf”的种类。 你也可能想要使用接触过滤和或给你的敌人分配类别面具,以便它们不会相互碰撞,只会与子弹相撞。

但是,如果你告诉一些关于如何和在哪里摧毁你的身体(我希望它不在你的碰撞检测函数中),并且如果你可以在你的应用程序崩溃时共享异常文本,它会更有帮助。有帮助。

+0

我不明白你的意思是“铸成错误的课堂”。请原谅我,因为我对objective-c是新手,实际上是编程本身。我已经摧毁了我的碰撞检测功能中的物体。不幸的是,当应用程序崩溃时,我没有得到异常文本。 – 2011-03-27 09:30:57

+0

通常我的敌人不会相互碰撞(反弹)。我认为这是因为我将它们创建为运动机构。相反,速度较快的人会穿过另一个(速度较慢的人),就好像另一个人不存在一样! 顺便说一句,我真的很感谢你的帮助我!谢谢! – 2011-03-27 09:33:17

+0

就运动机构而言,它们不会相互碰撞。 – Tayyab 2011-03-31 11:45:48

0

我用了相当便宜的解决方法。我交替地创造了不同大小的敌人装置(相差几个像素)。所以现在如果即使它们重叠时我拍摄它们,应用程序也不会崩溃(因为只有更大的对象碰撞并被破坏)。这符合我的目的。感谢你的帮助。对此,我真的非常感激! :)