Performing your own physics calculations for a collision in Sprite Kit
Asked Answered
K

3

47

I'm trying to set up some elastic collisions using Sprite Kit. There is an issue with the case of multiple objects resting near each other as I asked in Sprite Kit Physics Collision Issue

I am confused on the timing of the situation for a collision.

I've tried to set dynamic to NO in -didBeginContact: delegate method, calculate final speeds, then in -didEndContact: set dynamic to YES and then set the velocities correctly.

The reason I want it to be dynamic outside of the collision is because I want friction/gravity etc to be available. What is wrong with the order/logic? I looked at -didSimulatePhysics method, but it didn't seem like the way to go.

Kittie answered 28/1, 2014 at 17:20 Comment(7)
How are you applying the speeds/forces you are calculating?Minetta
I'm doing "setVelocity"Kittie
collision has a float property (collision.collisionImpulse) that can inform you of the severity of an impact. SKPhysicsPins can have elastic properties. May i suggest downloading Matti Räty's MRRopes example from GitHub and playing with the properties on that example?Displease
Could you put your code to let us see clearly. May be it's a matter of physics theory and not sprite kit problem.Protactinium
I don't understand very well what you want to do but maybe you want to remove some behavior on the animator and add them again with new settings? (change the friction behavior when items hit each other...) It's quite easy to do with animator.removeBehavior(frictionBehavior)Afterlife
Little confused on what you are asking here. Are you looking to have the bottom ball hit the 2 touching balls, have the bottom ball stop, have the center ball not move and the top ball to move up?Fenelia
Not sure if it works in your case but, have you seen this related answer where gravity is set to zero and dynamic to YES (goo.gl/PAqZde) ?Houck
M
5

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.

Marcelline answered 18/5, 2015 at 21:30 Comment(0)
C
1

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

Crumby answered 15/5, 2015 at 13:38 Comment(0)
M
0
  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.

Muckworm answered 19/5, 2015 at 6:0 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.