2016-01-26 60 views
0

在SpriteKit中,我希望將contactTestBitMask值分配給一組值。指定contactTestBitMask爲<Set>

這是正常的方式:

sprite.physicsBody?.contactTestBitMask = ColliderType.goal.rawValue | ColliderType.greyBox.rawValue 

意味着我的精靈通知我,當談到它與這些撞機類型的聯繫。 但是我的問題是我的collider類型會在遊戲過程中動態變化,而且精靈contactTestBitMask也需要改變。我想用一組對撞機類型和分配不同的組和挪用時間:

sprite.physicsBody?.contactTestBitMask = SetManager.sharedSetManager.normalSet 

在SetManager類:

enum NormalColliderType:UInt32 { 
    case greyBox = 0 
    case enemy = 2 
    case goal = 4 
    case coin = 8 
    } 

var currentSet: Set<Int> = [] 

var normalSet: Set<UInt32> = [NormalColliderType.greyBox.rawValue | NormalColliderType.goal.rawValue] 

static let sharedSetManager = SetManager() 

從理論上講,它的可行的,但我收到的唯一的錯誤是: 「無法分配類型‘設置’的價值鍵入‘UInt32的’」 我猜我問了一套如何可以用作可變

+0

碰撞可以了'greyBoxAndGoal'情況下你'enum' 5('greyBox'的增值應該是1不是0)。 – 0x141E

回答

2

contactTestBitMasktype UInt32,所以類型可以只是UInt32,您可以將其存儲爲此。

var normalSet: UInt32 = NormalColliderType.greyBox.rawValue | NormalColliderType.goal.rawValue 
+0

開眼。謝謝 – jtmwanakhu

+0

爲了補充一點,我會創建一個UInt32的字典,以便不會創建大量變量。讓collisionTypes = [UInt](); collisionTypes [「normalSet」] = NormalColliderType.greyBox.rawValue | NormalColliderType.goal.rawValue; – Knight0fDragon

1

不要忘記,你可以設置和使用特定類別明確個人的碰撞和接觸位的位與和NOT操作,在不影響任何其他位:

關閉特定的聯繫人(或碰撞):

sprite.physicsBody?.contactTestBitMask &= ~ColliderType.goal.rawValue 

與目標的sprite聯繫不會再被忽略。

打開一個特定的聯繫人/ colission:

sprite.physicsBody?.collisionBitMask |= ColliderType.newItem.rawValue 

精靈現在將與newItem

+0

對於簡單的更改,我會採取這種方法(一次只更改1個類別),但對於多個類別交換,我會預先定義其他答案,以避免在交換類別時出現錯誤。 – Knight0fDragon

相關問題