我不明白 SpriteKit 物理体的类别位掩码单元

I don't understand SpriteKit physics bodies's categorybitmasks unit

我不明白 spritekit categorybitmask 中的 UInt32。它们让我很困惑,因为它们的类型类似于:“0b01 << 1”或“0x01”或类似的东西。 spritekit里面的用法我看懂了,但是单位我看不懂

你必须对二进制有所了解,这在你第一次遇到它时可能会很棘手。使您感到困惑的代码是 shorthand 用于处理二进制文件。

例如,在 0b01 << 1 中, 0b 前缀表示以下数字以二进制形式给出。这很有用,因为如果您刚刚看到 1001,您可能会认为它是数字 "one thousand and one"。但是如果你写 0b1001 你就知道这里 1001 是一个二进制数。 (Read more)

类似地,0x 是用于表示十六进制数的前缀(因为我猜 x 听起来有点像 "hex")。在 SpriteKit 中处理位掩码时,我个人更喜欢使用 0b 前缀,但我就是这样。

现在开始位移。 << 是 Swift 中的 按位左移运算符 。它将数字中的所有位向左移动一定数量的位置。比如十进制数3,用二进制写成0011

3 = 0011            // the number 3 is 0011 in binary
3 << 1 = 0110 = 6   // take 0011 and shift all bits one place to the left
3 << 2 = 1100 = 12  // take 0011 and shift all bits two places to the left

你举的例子是0b01 << 1。如果您只输入 0b01,那是十进制数 1 的二进制表示。通过输入 0b01 << 1,您告诉程序采用二进制数 01(更明确地写为 0b01) 并将其位向左移动一位,得到二进制数 10(更明确地写为 0b10),即十进制数 2。

您实际上可以将 0b01 简称为 0b1,这意味着相同的事情,因为您只是省略了前导零。

尝试在 Xcode 游乐场中输入以下内容并查看您获得的结果:

0b1        // decimal 1
0b1 << 1   // decimal 2
0b1 << 2   // decimal 4
0b1 << 3   // decimal 8
0b1 << 4   // decimal 16

你可以试试这个,移动更多的位,你会看到数字继续翻倍。事实证明,这是 SpriteKit 为其物理引擎实现位掩码的便捷方式。

更新:

您最多可以定义 32 个不同的类别以用于物理位掩码。这里他们都有相应的十进制值:

0b1       // 1
0b1 << 1  // 2
0b1 << 2  // 4
0b1 << 3  // 8
0b1 << 4  // 16
0b1 << 5  // 32
0b1 << 6  // 64
0b1 << 7  // 128
0b1 << 8  // 256
0b1 << 9  // 512
0b1 << 10 // 1,024
0b1 << 11 // 2,048
0b1 << 12 // 4,096
0b1 << 13 // 8,192
0b1 << 14 // 16,384
0b1 << 15 // 32,768
0b1 << 16 // 65,536
0b1 << 17 // 131,072
0b1 << 18 // 262,144
0b1 << 19 // 524,288
0b1 << 20 // 1,048,576
0b1 << 21 // 2,097,152
0b1 << 22 // 4,194,304
0b1 << 23 // 8,388,608
0b1 << 24 // 16,777,216
0b1 << 25 // 33,554,432
0b1 << 26 // 67,108,864
0b1 << 27 // 134,217,728
0b1 << 28 // 268,435,456
0b1 << 29 // 536,870,912
0b1 << 30 // 1,073,741,824
0b1 << 31 // 2,147,483,648