【问题标题】:How to set up multiple collision in SceneKit Scene Editor如何在 SceneKit 场景编辑器中设置多重碰撞
【发布时间】:2015-10-19 14:29:48
【问题描述】:

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

【问题讨论】:

    标签: ios xcode7 scenekit


    【解决方案1】:

    关键是确保您的类别都是 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
    

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

    • 播放器
      • 类别 = 2
      • 碰撞掩码 = 12
        • 4 | 8 = 0010 | 0100 = 0110 = 12
    • 敌人
      • 类别 = 4
      • 碰撞掩码 = 2
    • 接地
      • 类别 = 8
      • 碰撞掩码 = 2

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

    【讨论】:

    • 谢谢它的工作。在编辑器中很漂亮。节省大量样板代码。苹果应该添加的一件事是contactBitMask ..
    猜你喜欢
    • 2020-08-17
    • 2015-02-06
    • 1970-01-01
    • 2018-11-07
    • 2023-03-06
    • 1970-01-01
    • 2015-08-14
    • 2016-06-07
    • 1970-01-01
    相关资源
    最近更新 更多