将contactTestBitMask分配给<set>

时间:2016-01-26 01:13:45

标签: ios sprite-kit set collision bitmask

在SpriteKit中我希望将contactTestBitMask值赋给一组值。

这是正常的方式:

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

意味着我的精灵在接触到这些碰撞器类型时会通知我。 但是我的问题是我的碰撞器类型会在游戏过程中动态变化,并且还需要更改精灵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()

理论上,它可行,但我收到的唯一错误是: “无法指定'Set'类型的值来键入'UInt32'” 我想我问的是如何将一个集合用作变量

2 个答案:

答案 0 :(得分:2)

contactTestBitMask属于type UInt32,因此normalSet的类型可以只是UInt32,您可以将其存储为此类。

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

答案 1 :(得分:1)

不要忘记您可以使用按位AND和NOT运算符设置和清除特定类别的单个冲突和联系位,而不会影响任何其他位:

关闭特定联系人(或碰撞):

void func(const std::string& str)

与目标的精灵联系将不再被告知。

打开特定联系人/委托人:

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

精灵现在会与 sprite.physicsBody?.collisionBitMask |= ColliderType.newItem.rawValue

发生碰撞