2016-04-13 111 views
0

這是我第一次嘗試使用SpriteKit,我無法通過位掩來獲得我的碰撞。 我有三個類別,如果玩家點燃,我想增加分數並將點亮的節點移出屏幕,否則,我想調用我的gameover()函數。我嘗試了很多變化,看不到任何東西,但一般的碰撞被認可。我也爲每個節點定義了類別和聯繫人位掩碼。Swiftkit碰撞處理

let playerCategory: UInt32 = 1 
let razzCategory: UInt32 = 2 
let litCategory: UInt32 = 4 

func didBeginContact(contact: SKPhysicsContact) { 

    var firstBody: SKPhysicsBody 
    var secondBody: SKPhysicsBody 


    if (contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask) 
    { 
     firstBody = contact.bodyA 
     secondBody = contact.bodyB 

    } 

    else 
    { 
     firstBody = contact.bodyB 
     secondBody = contact.bodyA 
    } 

    if ((firstBody.categoryBitMask & playerCategory) == 0 && (secondBody.categoryBitMask & litCategory) == 1) 
    { 
     lit.position.x = 400 
     score += 1 
    } 
    else { 
     gameOver() 
    } 

} 
+0

你不想要的,如果條件等於0和1,你希望他們等於要檢查 – Knight0fDragon

+0

ID didBeginContact叫在所有類別? – hamobi

回答

0

if ((firstBody.categoryBitMask & playerCategory) == 0 && (secondBody.categoryBitMask & litCategory) == 1)轉換爲英語以下。

如果Firstbody和playerCategory = 0 AND SecondBody而litCategory = 1

如果Firstbody AND 1 = 0 AND SecondBody和4 = 1

現在讓我們來定義Firstbody爲playerCategory和SecondBody作爲litCategory

如果playerCategory AND playerCategory = 0 AND litCategory和litCategory = 1

如果1 AND 1 = 0 AND 4 AND 4 = 1

如果1 = 0且4 = 1

如您所見,此失敗,並且此方法總是失敗,因爲如果您的測試的後半部分(SecondBody AND litCategory)只能有值0或者4,這些2個值永遠不會是1

要解決這個問題,你要確保,無論身體,你正在檢查等於你正在尋找

if ((firstBody.categoryBitMask & playerCategory) == playerCategory && (secondBody.categoryBitMask & litCategory) == litCategory) 

它說的類別如果firstBody是類別playerCategory的成員,並且secondBody是litCategory的成員,則執行以下操作iion。

下面是你的功能完整的修補程序:

func didBeginContact(contact: SKPhysicsContact) { 

    var firstBody: SKPhysicsBody 
    var secondBody: SKPhysicsBody 


    if (contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask) 
    { 
     firstBody = contact.bodyA 
     secondBody = contact.bodyB 

    } 

    else 
    { 
     firstBody = contact.bodyB 
     secondBody = contact.bodyA 
    } 

    if ((firstBody.categoryBitMask & playerCategory) == playerCategory && (secondBody.categoryBitMask & litCategory) == litCategory) 
    { 
     lit.position.x = 400 
     score += 1 
    } 
    else { 
     gameOver() 
    } 

} 
+0

它的工作原理!非常感謝您的解答和幫助! – user69309