答案 0 :(得分:2)
关键是要确保你的类别都是2(2,4,8,16等)的所有权力,这样你就可以充分利用位掩码。
要检查两个对象是否发生碰撞,SceneKit会执行类似于下面显示的willCollide
func的操作。按位AND(&
)运算符用于检查Ints中的任何位是否在category
和collidesWith
中匹配。如果任何位匹配,则对象应该发生冲突。
func willCollide(category:Int, collidesWith:Int) -> Bool {
return category & collidesWith != 0
}
使用2的幂表示每个类别在Int。
中具有唯一的位位置let cat1:Int = 2 // 00010
let cat2:Int = 4 // 00100
let cat3:Int = 8 // 01000
let cat4:Int = 16 // 10000
willCollide(cat1, collidesWith: cat1) // true
willCollide(cat1, collidesWith: cat2) // false
您可以使用按位OR(|
)运算符组合多个Ints,在这种情况下允许类别与多个其他类别联系。
let cat1and2 = cat1 | cat2 // 00110 or 6 in decimal
willCollide(cat1, collidesWith: cat1and2) // true
willCollide(cat2, collidesWith: cat1and2) // true
willCollide(cat3, collidesWith: cat1and2) // false
对于您的示例,以下内容可行;
4 | 8 = 0010 | 0100 = 0110 = 12
为敌人和地面设置碰撞掩模很重要,因为有时候敌人会与玩家发生碰撞。这与玩家与敌人相撞不同。注意:我遗漏了敌人也会接触地面的位置,反之亦然。