使节点 'B' 和 'C' 仅与节点 'A' 发生碰撞

Make Node 'B' and 'C' collide only with Node 'A'

为什么我们不能让 didBegin 函数只在 B C 与 A 碰撞时调用,而在 B 和 C 碰撞时不调用?这是可能的还是我们总是需要检查是否有东西与 A 发生碰撞?

A.physicsBody!.collisionBitMask = 0
A.physicsBody!.contactTestBitMask = 1
A.physicsBody!.categoryBitMask = 1

B.physicsBody!.collisionBitMask = 0
B.physicsBody!.contactTestBitMask = 1
B.physicsBody!.categoryBitMask = 2

C.physicsBody!.collisionBitMask = 0
C.physicsBody!.contactTestBitMask = 1
C.physicsBody!.categoryBitMask = 3

Api 对 contactTestBitMask 说:一个掩码,定义了哪些类型的物体会导致与该物理物体的交叉通知。

我们需要 A.contactTestBitMask = 1 & 2

因为说 categoryBitMask 3 与说 categoryBitMask 1 AND categortyBitMask 2 是一样的。请参见单词 bitmask。这是他们的原因。这意味着您可以设置 32 个标志(或者您可以设置提供的 Int 中的每一位,但是您想要查看它)。

位掩码的有效唯一数字是 2 的幂,

1
2
4
8 等等

可以表示为

1 << 1
1 << 2
1 << 3
1 << 4

0b1
0b10
0b100
0b1000

不管你喜欢怎么写,这个值必须是2的幂。

所以将C的位掩码值改为4使其独立(或者将其设为2,因为B和C共享相同的碰撞属性,与A碰撞)