如何在SceneKit场景编辑器中设置多个碰撞

时间:2015-10-18 15:04:33

标签: ios xcode7 scenekit

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

XCode7 Scenekit Editor Collision

1 个答案:

答案 0 :(得分:2)

关键是要确保你的类别都是2(2,4,8,16等)的所有权力,这样你就可以充分利用位掩码。

要检查两个对象是否发生碰撞,SceneKit会执行类似于下面显示的willCollide func的操作。按位AND(&)运算符用于检查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

您可以使用按位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

对于您的示例,以下内容可行;

  • 播放器
    • category = 2
    • 碰撞面具= 12
      • 4 | 8 = 0010 | 0100 = 0110 = 12
  • 敌人
    • category = 4
    • collision mask = 2
  • 接地
    • category = 8
    • collision mask = 2

为敌人和地面设置碰撞掩模很重要,因为有时候敌人会与玩家发生碰撞。这与玩家与敌人相撞不同。注意:我遗漏了敌人也会接触地面的位置,反之亦然。