我不明白 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
我不明白 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