2016-01-26 30 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

相关问题