ios - 如何在 SceneKit 场景编辑器中设置多重碰撞

标签 ios xcode7 scenekit

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

XCode7 Scenekit Editor Collision

最佳答案

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

要检查两个对象是否发生碰撞,SceneKit 将执行类似于下面所示的 willCollide 函数的操作。按位 AND (&) 运算符用于检查 Int 中的任何位是否在 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 (|) 运算符来组合多个 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
    • 碰撞 mask = 12
      • 4 | 8 = 0010 | 0100 = 0110 = 12
  • 敌人
    • 类别 = 4
    • 碰撞 mask = 2
  • 地面
    • 类别 = 8
    • 碰撞 mask = 2

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

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

相关文章:

ios - iOS 9 中的聚光灯扩展

ios - DAE 文件解析错误

ios - Scenekit 旋转节点以面对点击点

iphone - 像IOS一样集成Twitter - 5

ios - Size classes 在 Swift 2.0 中无法正常工作

iOS Map Kit Locations 从数据库读取

interface-builder - Xcode 7 beta 使我的应用程序 Storyboard文件无法访问

ios - 我们可以在 SceneKit 中的透明平面上渲染阴影吗

ios - 为什么我没有得到服务器中图像的所有字节?

JavaScript OnClick 不适用于 iOS