2015-09-07 27 views
0

我試圖聯繫,但它沒有工作。需要了解ENUM聯繫SpriteKit

創建一個枚舉:

enum object:UInt32{ 
    case BB = 1 
    case TR = 2 
    case GAP = 3 
} 

然後我有3個節點:

balloon.physicsBody?.categoryBitMask = object.BB.rawValue 
balloon.physicsBody?.contactTestBitMask = object.TR.rawValue 
balloon.physicsBody?.collisionBitMask = object.GAP.rawValue 

tree2.physicsBody?.categoryBitMask = object.TR.rawValue 
tree2.physicsBody?.contactTestBitMask = object.BB.rawValue 

gap.physicsBody?.categoryBitMask = object.GAP.rawValue 
gap.physicsBody?.collisionBitMask = object.GAP.rawValue 
gap.physicsBody?.contactTestBitMask = object.BB.rawValue 

在DidBeginContact:

let result = contact.bodyA.categoryBitMask + contact.bodyB.categoryBitMask 

switch result{ 
    case object.BB.rawValue + object.TR.rawValue: 
     xoaBB(contact.bodyA.node as! SKSpriteNode, TR: contact.bodyB.node as! SKSpriteNode, toaDo: contact.contactPoint) 

    case object.BB.rawValue + object.GAP.rawValue: 
     score++ 
     scorelabel.text = "\(score)" 

    default: 
     return 
    } 

的問題是:

"case object.BB.rawValue + object.GAP.rawValue" didn't work 

我希望氣球飛過間隙得分,但它不能。如圖所示,氣球剛剛接觸到間隙並卡在那裏。

enter image description here

誰能幫助我,我真的需要「如何使用枚舉教程太」

+0

首先要考慮的事實是位掩碼,以及位掩碼。值1,2和3是沒有意義的,因爲前兩個的總和等於第三個的值。值應該是1,2,4,8等 –

回答

0

正如我在評論中提及了您的位掩碼值並不完全意義。如何有點像這樣的東西(我沒有檢查錯別字):

enum MaskType : UInt32 { 
    case Balloon = 1 
    case Gap = 2 
    case Wall = 4 
    case None = 0 
} 

然後,你需要決定你在之後。以下示例不會註冊衝突,這意味着您希望在對象之間發生物理交互。

balloon.physicsBody?.categoryBitMask = MaskType.Balloon.rawValue 
balloon.physicsBody?.collisionBitMask = MaskType.None.rawValue 
balloon.physicsBody?.contactTestBitMask = MaskType.Gap.rawValue | MaskType.Wall.rawValue 

氣球精靈現在將向具有.Gap或.Wall值作爲其categoryBitMask值的對象註冊聯繫人。

如果你現在正確設置你的其他spriteNode的physicsBodies,你可以在didBeginContact函數中做一些很好的事情。也許是這樣的:

func didBeginContact(contact: SKPhysicsContact) { 
    let contactA = contact.bodyA 
    let contactB = contact.bodyB 

    func ballonHitType() -> Uint32 { 
     if contactA.categoryBitMask == MaskType.Baloon.rawValue { 
      return contactB.categoryBitMask 
     } else { 
      return contactA.categoryBitMask 
     } 
    } 

    // Then simply perform your wanted actions based on whatever ballonHitType you receive 
}