我正在使用 XCode 7 中的新 SceneKit 编辑器。我设法与两个对象发生碰撞。我想知道如何指定与多个类别的冲突。假设玩家与地面和敌人发生碰撞。仅使用这两个输入字段如何实现?
Best Answer-推荐答案 strong>
关键是要确保您的类别都是 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
对于您的示例,类似以下的内容会起作用;
- 播放器
- 类别 = 2
- 碰撞掩码 = 12
4 | 8 = 0010 | 0100 = 0110 = 12
- 敌人
- 地面
为敌人和地面设置碰撞掩码很重要,因为有时敌人会与玩家发生碰撞。这与玩家与敌人碰撞不同。注意:我省略了敌人也会接触地面的部分,反之亦然。
关于ios - 如何在 SceneKit 场景编辑器中设置多重碰撞,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/33199502/
|