Performing your own physics calculations for a collision in Sprite Kit Performing your own physics calculations for a collision in Sprite Kit ios ios

Performing your own physics calculations for a collision in Sprite Kit


I'm trying to set up some elastic collisions using Sprite Kit

I think you're misunderstanding the physics in play here. An elastic collision is an oversimplification of a collision. In reality, no collision results in a perfect transfer of energy. I've explained the physics here in an answer to the related question you linked to.

I suspect reading through that you will see that an "elastic" collision can be done in SpriteKit, but most people don't realize you need space between the objects. You shouldn't need to do your own physics calculations.


I'm not sure if this is exactly what you are trying to do, but if I wanted to compute results of collisions without the help of SpriteKit while leaving all other physics to SpriteKit, I would do the following:

  1. Leave the dynamic property always set to YES.
  2. Set the categoryBitMask property for each kind of object.
  3. Set the collisionBitMask property for an object to the disjunction of all categoryBitMasks for which you want to retain automatic collision calculations (e.g., walls, but not other objects), or just to zero, if you want to handle all collisions manually.
  4. Set the contactTestBitMask property for an object to anything for which you want to calculate collisions manually.
  5. Compute and set all resulting velocities in didBeginContact.

(In short, exclude your objects from their own collisionBitMask.)

This link might be helpful: Working with Collisions and Contacts


  1. Use applyImpulse instead of setVelocity. You want to be using impulses or forces to ensure the physics engine can warm up properly. Using setVelocity will yield unpredictable results for very close or overlapping objects.

  2. Ensure there is some distance between the objects and that they don't overlap.

  3. Setup the collision bit masks correctly.

This should all work perfectly.