我正在尝试在Swift中使用碰撞位掩码和接触测试位掩码,我希望两个对象不会碰撞在一起,所以我正在做:
firstNode.physicsBody?.collisionBitMask = 0b01 secondNode?.collisionBitMask = 0b10
由于SpriteKit对这两个数字执行AND操作,因此结果不应该是00因为10 & 01 = 00?
00
10 & 01 = 00
那么为什么仍然发生碰撞呢?
谢谢。
这不是冲突处理的工作原理。当两个物体相交时,物理引擎AND在当前物体collisionBitMask与他人的物体 之间执行逻辑运算符categoryBitMask:
AND
collisionBitMask
categoryBitMask
当两个物理物体相互接触时,可能会发生碰撞。通过执行逻辑“与”运算,将该人体的防撞蒙版与其他人体的类别蒙版进行比较。如果结果为非零值,则此主体受碰撞影响。每个机构独立选择是否要受到另一个机构的影响。例如,您可以使用它来避免碰撞计算,该碰撞计算对物体速度的变化可以忽略不计。
该源。
因此,结果取决于您categoryBitMask在这两个物体上的设置方式。的默认值categoryBitMask是 0xFFFFFFFF,表示设置了所有位。因此,当您在0xFFFFFFFF和0b10或之间执行&时0b01,结果将为非零值,即碰撞。
0xFFFFFFFF
0b10
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。