2011-03-24 95 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

我用了相當便宜的解決方法。我交替地創造了不同大小的敵人裝置(相差幾個像素)。所以現在如果即使它們重疊時我拍攝它們,應用程序也不會崩潰(因爲只有更大的對象碰撞並被破壞)。這符合我的目的。感謝你的幫助。對此,我真的非常感激! :)