# How do I add a dynamic collision box on my player?

I want to have a box in my scene which can be pushed by the player. I have applied a dynamic collision object in the box sprite, now I want to add the same collision object around my player, so that he can push the box. How do I do that?

Is this the correct way of applying collision to my player?

I assume the player has a kinematic collision object? The problem you are encountering is that kinematic object canâ€™t affect dynamic ones. Only two dynamic objects that collide will be automatically resolved. And you donâ€™t want to use a dynamic object on three player. My recommendation is that you apply a force to the dynamic box object from your player script when you detect a collision between the two.

1 Like

Kinematic bodies should still collide with dynamic ones if the mask matches. The simulation might be unpredictable, though, because kinematic bodies are moved with set_position(). In your example above you should be ok I think, because the movement is so slow.

You can also set linear velocity on a kinematic body. Although this wonâ€™t make it move (like in vanilla Box2D) dynamic bodies react like it does if linear velocity is set. This helps interaction with dynamic bodies.

Update: Push a box, three ways:

Box Pushing.zip (2.6 KB)

3 Likes

True. I meant this but didnâ€™t explain it very well.

Is this working well in the tests youâ€™ve made @totebo?

1 Like

I would describe it as black magic; since the linear velocity or angular velocity is there but not visible, itâ€™s a question of guessing the values. It seems to work reasonably well. I updated my post above with an example of this; if the linear velocity is set on the kinematic player, you get a nice â€śbounceâ€ť as you collide with the dynamic box, as you would expect when two objects collide.

2 Likes

The simulation is incorrect.
With such dimensions of collision shapes physics scale must be 0.025 (1/40).
And I donâ€™t know why, but linear velocity must be premultiplied by dt before set on kinematic object.

The scale is set to the Defold default, so I suppose the simulation is correct if we assume the world is huge?

Thatâ€™s interesting, thanks! I have noticed that apply_force shouldnâ€™t use dt, so I assumed the same logic applied to linear velocity.

How do I add the collision object to my player? I mean, do I add it in my player_boy.collection or main.collection??

I donâ€™t know the specifics for defold, as Iâ€™m a newcomer, but from my experiences from other engines, put it in the player_boy.collection. That way, once you instance the collection, it comes with the collision object. But, thatâ€™s just my experiences with other game engines. Could be different with defold : /

1 Like

Tried it, but still no collision is detected when I run the game.

Like i said, iâ€™m a beginner, so sorry.

You usually add it to the same game object:

How do I convert the kinematic player to a dynamic collision object, when it loses contact with the static collision object (i.e., the platform), so that it falls along with the box?

You canâ€™t swap the collision object type at runtime, but a workaround is to have two collision objects, one kinematic and one dynamic. Then enable/disable them as needed with `msg.post(collisionobject_url, "enable")` or `msg.post(collisionobject_url, "disable")`.

3 Likes