Trev&#246;r Anne Denise - 1 year ago 105
Swift Question

# Can't understand how collision bit mask works

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
``````

Since SpriteKit does an AND operation on those two numbers, shouldn't the result be
`00`
since
`10 & 01 = 00`
?

So why are collisions happening anyway ?

Thank you.

Answer Source

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 `categoryBitMask`:

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.

The source.

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 `0xFFFFFFFF` and `0b10` or `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
``````

and

``````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 `0b10`.

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.

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download