在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'” 我想我问的是如何将一个集合用作变量
答案 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