OGeek|极客世界-中国程序员成长平台

标题: ios - 如何在 SceneKit 场景编辑器中设置多重碰撞 [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-12 16:43
标题: ios - 如何在 SceneKit 场景编辑器中设置多重碰撞

我正在使用 XCode 7 中的新 SceneKit 编辑器。我设法与两个对象发生碰撞。我想知道如何指定与多个类别的冲突。假设玩家与地面和敌人发生碰撞。仅使用这两个输入字段如何实现?

XCode7 Scenekit Editor Collision



Best Answer-推荐答案


关键是要确保您的类别都是 2 的幂(2、4、8、16 等),这样您就可以充分利用位掩码。

要检查两个对象是否发生碰撞,SceneKit 将执行类似于下面显示的 willCollide 函数的操作。按位与 (&) 运算符用于检查 Ints 中的任何位是否在 categorycollidesWith 中匹配。如果任何位匹配,则对象应该发生碰撞。

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

对于您的示例,类似以下的内容会起作用;

为敌人和地面设置碰撞掩码很重要,因为有时敌人会与玩家发生碰撞。这与玩家与敌人碰撞不同。注意:我省略了敌人也会接触地面的部分,反之亦然。

关于ios - 如何在 SceneKit 场景编辑器中设置多重碰撞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33199502/






欢迎光临 OGeek|极客世界-中国程序员成长平台 (http://sqlite.in/) Powered by Discuz! X3.4