一尘不染

无法理解碰撞位掩码的工作原理

swift

我正在尝试在Swift中使用碰撞位掩码和接触测试位掩码,我希望两个对象不会碰撞在一起,所以我正在做:

firstNode.physicsBody?.collisionBitMask = 0b01
secondNode?.collisionBitMask = 0b10

由于SpriteKit对这两个数字执行AND操作,因此结果不应该是00因为10 & 01 = 00

那么为什么仍然发生碰撞呢?

谢谢。


阅读 267

收藏
2020-07-07

共1个答案

一尘不染

这不是冲突处理的工作原理。当两个物体相交时,物理引擎AND在当前物体collisionBitMask与他人的物体
之间执行逻辑运算符categoryBitMask

当两个物理物体相互接触时,可能会发生碰撞。通过执行逻辑“与”运算,将该人体的防撞蒙版与其他人体的类别蒙版进行比较。如果结果为非零值,则此主体受碰撞影响。每个机构独立选择是否要受到另一个机构的影响。例如,您可以使用它来避免碰撞计算,该碰撞计算对物体速度的变化可以忽略不计。

因此,结果取决于您categoryBitMask在这两个物体上的设置方式。的默认值categoryBitMask
0xFFFFFFFF,表示设置了所有位。因此,当您在0xFFFFFFFF0b10或之间执行&时0b01,结果将为非零值,即碰撞。

因此,例如,将您的身体设置如下:

spriteA.physicsBody?.categoryBitMask = 0b01
spriteA.physicsBody?.collisionBitMask = 0b01

spriteB.physicsBody?.categoryBitMask = 0b10
spriteB.physicsBody?.collisionBitMask = 0b10

会给您想要的结果。另外,这可能不是您需要的确切设置,这只是一个简单的示例,您将必须根据需要更改值。在这种情况下,spriteA仅会与categoryBitMask设置为的物体碰撞0b01。spriteB同样如此,它将与categoryBitMask设置为的物体碰撞0b10

另外,如果您不希望这些精灵与任何东西碰撞,只需将其collisionBitMask属性设置为0。

2020-07-07