2014-12-20 22 views
0

所以我現在用的是didBeginContact方法使用下面的代碼塊來檢測子彈的物理機構和在我的場景中其他物體之間的碰撞:爲什麼只有一些節點從Sprite Kit的父級中被移除?

-(void)didBeginContact:(SKPhysicsContact *)contact 
{ 
    uint32_t collision = (contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask); 

    if (collision == (WWPhysicsCategoryOther | WWPhysicsCategoryBullet)) { 
     [_bullet removeFromParent] 
    } 
} 

當一顆子彈是在屏幕上,子彈已移除。但是,像很多射擊遊戲一樣,玩家可以重複發射子彈。我發現當屏幕上有多個子彈時,並不是所有的子彈在聯繫後都會被移除。我怎樣才能確保每一顆子彈在碰撞後立即被移除?

+2

建議你確定哪些接觸體(A或B)是子彈,然後從它的父對應的節點。例如,[contact.bodyA.node removeFromParent]; – 0x141E

+2

_bullet似乎是僅指向單個節點的指針。您需要找到與聯繫人委託本身中的物理體對應的節點。這裏是如何:http://stackoverflow.com/a/20604762/2043580 – ZeMoon

+0

謝謝兩個答覆。很有幫助! – wtivie05

回答

1

0x141E和ZeMoon的評論是正確的。

_bullet可能是一個指針指向一個特定的節點,因此,碰撞檢測,即碰撞的子彈節點可能不總是具有該指針(這意味着可能是一個,當碰撞發生時,一些其它的子彈屏幕上正在被刪除)。

一個更好,更「正確」的方法是,在didBeginContact:上標識哪個接觸體是子彈,並使用其屬性node將其從其父項中移除。

東西沿下面的例子中應該與工作

-(void)didBeginContact:(SKPhysicsContact *)contact 
{ 
    uint32_t collision = (contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask); 

    if (collision == (WWPhysicsCategoryOther | WWPhysicsCategoryBullet)) { 

     SKNode *bulletNode = (contact.bodyA.categoryBitMask == WWPhysicsCategoryBullt) ? contact.bodyA.node : contact.bodyB.node; 

     [bulletNode removeFromParent] 
    } 
} 
+0

確實有效!非常感謝! – wtivie05

相關問題