所以我使用了一个简单的碰撞结构,然后我用它为我的碰撞对象设置catagoryMasks(见下文)。 但是,didBeginContact函数 - 为正确的碰撞触发 - 表示碰撞节点categoryBitMasks为1,无论哪个节点发生碰撞。我做了一件明显不对的事吗?
这里的结构与Apple的DemoBots示例非常相似:
struct ColliderStruct {
let rawValue: UInt32
var categoryMask: UInt32 {
return rawValue
}
static var Player: ColliderStruct { return self.init(rawValue: 1 << 0) }
static var AI: ColliderStruct { return self.init(rawValue: 1 << 1) }
static var Ball: ColliderStruct { return self.init(rawValue: 1 << 2) }
static var RedGoal: ColliderStruct { return self.init(rawValue: 1 << 3) }
static var BlueGoal: ColliderStruct { return self.init(rawValue: 1 << 4) }
static var Arena: ColliderStruct { return self.init(rawValue: 1 << 5) }
var hashValue: Int {
return Int(rawValue)
}
}
我像这样设置类别:
arenaGeometry.physicsBody!.categoryBitMask = ColliderStruct.Arena.hashValue
我按照这样检查:
func physicsWorld(world: SCNPhysicsWorld, didBeginContact contact: SCNPhysicsContact) {
//printing to test
print("A bitmask: \(contact.nodeA.categoryBitMask), B bitmask: \(contact.nodeB.categoryBitMask)")
if (contact.nodeA.categoryBitMask == ColliderStruct.Player.hashValue || contact.nodeB.categoryBitMask == ColliderStruct.Player.hashValue ) {
print("player hit something!")
}
}
}
但是,位掩码始终报告为1,并且碰撞永远不会通过第二个print语句:
A bitmask: 1, B bitmask: 1
我一直盯着这个太长时间,明显错了什么? 非常感谢。
答案 0 :(得分:3)
有时您只需稍微退一步。
print("A bitmask: \(contact.nodeA.categoryBitMask), B bitmask: \(contact.nodeB.categoryBitMask)")
应该是
print("A bitmask: \(contact.nodeA.physicsBody!.categoryBitMask), B bitmask: \(contact.nodeB.physicsBody!.categoryBitMask)")