如何正确使用Scenekit的类别蒙版,碰撞蒙版和Physicalbody,contactTestBitMask并进行正确的碰撞?

时间:2019-01-03 19:43:37

标签: swift collision-detection scenekit

我一直在尝试学习Scenekit并完成了一本书,但是只有碰撞检测部分不被理解,这也许是最重要的部分。 有类别蒙版,共谋蒙版和Physicalbody?.contactTestBitMask。

我想创建一个简单的游戏来解决这个问题,但是我陷入了困境。我不确定我的主意。

在游戏中,有一个球并收集珍珠,并且远离岩石和孔洞。在这种情况下:

类别面具:

  • ball = 0b0001
  • 珍珠= 0b0010
  • rocks = 0b0100
  • 孔= 0b1000

physicsBody?.contactTestBitMask:

  • 球=珍珠||岩石//表示0b1110
  • 珍珠= 1
  • 岩石= 1

Collusion掩码为1,因为它们都相互碰撞。

我不确定是否遇到此冲突问题。因此,在我开始编写代码之前,我想确定一下。在SCNPhysicsContactDelegate中,下面的函数解决了彼此接触时的学习方法:

physicsWorld(_ didBegin contact: _) {

var contactNode:SCNNode!
if contact.nodeA.name == "ball" {
 contactNode = contact.nodeB
 } else {
 contactNode = contact.nodeA
}

if contactNode.physicsBody?.categoryBitMask == 0b0010 {
 // mean pearls
 // raise score etc
}

if contactNode.physicsBody?.categoryBitMask == 0b0100 || 0b1000{
 if contactNode.name == "Rock" { print("You rocked") }
 if contactNode.name == "Hole" { print("You need to climb") }
}

}

我已经搜索了youtube和堆栈,但是只有一种解释。 Stack Link Youtube视频没有解释这些。 这本书的例子受版权保护,所以我不能在这里放它们。

谢谢你, 祝你有美好的一天。

1 个答案:

答案 0 :(得分:0)

您没有使用按位运算符。 https://docs.swift.org/swift-book/LanguageGuide/AdvancedOperators.html

更改

if contactNode.physicsBody?.categoryBitMask == 0b0100 || 0b1000

if contactNode.physicsBody?.categoryBitMask == 0b0100 | 0b1000

单曲|和&是用于此类按位运算的正确运算符。