【发布时间】:2015-10-19 14:29:48
【问题描述】:
【问题讨论】:
【问题讨论】:
关键是确保您的类别都是 2 的幂(2、4、8、16 等),这样您就可以充分利用位掩码。
要检查两个对象是否发生碰撞,SceneKit 将执行类似于下面显示的 willCollide 函数的操作。按位与 (&) 运算符用于检查 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
您可以使用按位或 (|) 运算符来组合多个 Int,在这种情况下允许一个类别联系多个其他类别。
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为敌人和地面设置碰撞掩码很重要,因为有时敌人会与玩家发生碰撞。这与玩家与敌人碰撞不同。注意:我省略了敌人也会接触地面的部分,反之亦然。
【讨论】: