2014-10-09 86 views
1

我想要一個精靈在觸摸另一個精靈時自己刪除。當他們接觸時,他們只是互相推each。beginner swift sprite kit - 節點碰撞檢測幫助(SKPhysicsContact)

我有這樣的:

let alphaCategory: UInt32 = 0x1 << 0 
let betaCategory: UInt32 = 0x1 << 1 

我做了動態的,不受重力的精靈

self.physicsworld.contactDelegate = self 

alpha.physicsBody?.categoryBitMask = alphaCategory 
alpha.physicsBody?.contactTestBitmask = betaCategory 

beta.physicsBody?.categoryBitMask = betaCategory 
beta.physicsBody?.contactTestBitmask = alphaCategory 

我無法找到那個迅速做出什麼對我來說意義重大,但我認爲問題在這裏

func didBeginContact(contact: SKPhysicsContact) { 

    var firstBody: SKPhysicsBody 
    var secondBody: SKPhysicsBody 

    if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask { 
     firstBody = contact.bodyA 
     secondBody = contact.BodyB 
     beta.removeFromParent() 
    } 
} 
+0

如果contact.bodyA最終成爲beta sprite,那麼您擁有的代碼將不會觸發。 – meisenman 2014-10-09 18:47:25

回答

1

首先,你應該你firstBody & secondBody設置爲其collisionBitMask的順序:

if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask 
    { 
     firstBody = contact.bodyA 
     secondBody = contact.bodyB 
    } 
else { 
     firstBody = contact.bodyB 
     secondBody = contact.bodyA 
    } 

if firstBody.categoryBitMask=0 && secondBody.categoryBitMask=1 { 
     secondBody.removeFromParent() 
} 

這會防止你的精靈從任何碰撞(包括對方) 。設置此,您可以設置其他位掩碼屬性:

alpha.physicsBody.collisionBitMask = 0 
beta.physicsBody.collisionBitMask = 0 
+0

參考以下教程,其中有專門介紹聯繫活動的部分。它正是你正在尋找的......當兩個物體相撞時,它將移除其中的一個。我個人更喜歡教程如何處理它。我只是包含了邏輯。 http://www.raywenderlich.com/42699/spritekit-tutorial-for-beginners – meisenman 2014-10-09 19:05:40

+0

謝謝,collisionBitMask非常好! – wanksta11 2014-10-09 19:13:16

+0

是的,我看到那個教程,但我認爲它不會在迅速工作。 – wanksta11 2014-10-09 19:14:32

0

嘗試:

secondBody = contact.bodyB 
1

這實際上會產生問題,因爲去年夏天我發現了一個SpritKit遊戲工作時。如果您在任何SKPhysicsContact回調期間修改場景的節點結構,則根據Apple的結果不確定。在提交這個bug後,我被告知,你不應該從任何回調中修改場景Node結構。相反,蘋果公司表示,只需設置一個標誌,然後在更新環路中處理場景修改,這是安全的。