I am trying to use collision bit masks and contact test bit masks in Swift, I want two objects not to collide together, so I am doing :
firstNode.physicsBody?.collisionBitMask = 0b01
secondNode?.collisionBitMask = 0b10
10 & 01 = 00
That is not how collision handling works. When two bodies are in intersection, physics engine performs logical
AND operator between current's body
collisionBitMask and other's body
When two physics bodies contact each other, a collision may occur. This body’s collision mask is compared to the other body’s category mask by performing a logical AND operation. If the result is a nonzero value, this body is affected by the collision. Each body independently chooses whether it wants to be affected by the other body. For example, you might use this to avoid collision calculations that would make negligible changes to a body’s velocity.
So the result depending on how you set categoryBitMask on those two bodies. A default value for categoryBitMask is
0xFFFFFFFF, means all bits set. So when you perform & between
0b01, the result would be non-zero value, thus the collision.
So for example, setting your bodies like this:
spriteA.physicsBody?.categoryBitMask = 0b01 spriteA.physicsBody?.collisionBitMask = 0b01
spriteB.physicsBody?.categoryBitMask = 0b10 spriteB.physicsBody?.collisionBitMask = 0b10
will give you the result you want. Also, this is probably not the exact setup you need, it is just a simple example, and you will have to change values according to your needs. In this case, spriteA will collide only with bodies which have categoryBitMask set to
0b01. Same goes for spriteB, it will collide with bodies which have
categoryBitMask set to
Also, in the case if you don't want these sprites to be able to collide with anything, simply set their
collisionBitMask properties to 0.