SpriteKit:为什么碰撞中的节点具有4294967295的类别位掩码,而这个类别从未分配给节点?

6
在下面的didBegin函数中,其中一个节点的类别掩码为4294967295。然而,这个类别从未分配给任何节点。
以下是所有使用中的位掩码:
struct PhysicsCategory {
    static let None                 : UInt32 = 0
    static let All                  : UInt32 = UInt32.max
    static let Player               : UInt32 = 0b1       // 1
    static let WorldBorder          : UInt32 = 0b10      // 2
    static let TopWorldBorder       : UInt32 = 0b100     // 4
    static let RightWorldBorder     : UInt32 = 0b1000    // 8
    static let Pellet               : UInt32 = 0b10000
}

重申一下,All类别对应的是4294967295,从未分配给任何节点。那么为什么有一个物理体带有这个类别位掩码?这个类别位掩码是否会被隐式地分配给一个物理体?
func didBegin(_ contact: SKPhysicsContact) {
    print("Collision was detected: \(contact.bodyA.categoryBitMask). \(contact.bodyB.categoryBitMask).")
}
1个回答

7
categoryBitMask是一个UInt32类型,其最大值为4294967295,这也是它的默认值(所有位都设置)。引用自文档
每个场景中的物理体可以分配给多达32个不同的类别,每个类别对应于位掩码中的一个位。您可以定义在游戏中使用的掩码值。与collisionBitMask和contactTestBitMask属性一起使用,您可以定义哪些物理体相互作用以及何时通知游戏这些相互作用。默认值为0xFFFFFFFF(所有位均设置)。

1
@Crashalot 没问题 :) 与 contactTestBitMask 设置为 0x00000000 不同,collisionBitMask 和 categoryBitMask 具有所有位设置。所以这是一件事情 :) - Whirlwind
4
补充Whirlwind所说的 - 默认情况下,一切都会相互碰撞而且什么也不接触。这要求每个物理体属于每个类别(因此类别位掩码是UInt32Max),每个物理体的碰撞位掩码包括每个类别(再次是UInt32Max),每个接触测试位掩码不包括任何类别(因此为0)。 - Steve Ives

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接