SpriteKit:当此类别从未分配给节点时,为什么碰撞中的节点具有类别位掩码4294967295

Cra*_*lot 6 sprite-kit skphysicsbody skspritenode swift

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
}
Run Code Online (Sandbox Code Playgroud)

要重复,All对应于4294967295 的类别永远不会分配给任何节点.那么为什么有一个物理体具有这种类别的掩码呢?此类别位掩码是否隐式分配给物理主体?

func didBegin(_ contact: SKPhysicsContact) {
    print("Collision was detected: \(contact.bodyA.categoryBitMask). \(contact.bodyB.categoryBitMask).")
}
Run Code Online (Sandbox Code Playgroud)

Whi*_*ind 7

categoryBitMask是a UInt32,它的最大值是4294967295,这也是它的默认值(所有位都设置).从文档引用:

场景中的每个物理主体最多可以分配32个不同的类别,每个类别对应于位掩码中的一个位.您可以定义游戏中使用的蒙版值.结合collisionBitMask和contactTestBitMask属性,您可以定义哪些物理实体彼此交互以及何时向您的游戏通知这些交互.

默认值为0xFFFFFFFF(设置所有位).

  • @Crashalot要添加Whirlwind所说的内容 - 默认情况下,一切都与其他所有内容发生冲突,没有任何联系.这要求每个physicsBody属于每个类别(因此categoryBitMask是UInt32Max),每个physicsBody的collisionBitMask包括每个类别(UInt32Max再次)和每个contactTestBitMask不包括任何类别(因此为0). (4认同)