# GamesPlayer is stuck on walls (Box2d - Tutorial)

#### ilan

##### Expert
Longtime User
[PLAYER = guy that plays the game | player = character in the game]

hi

one thing you will notice when you start working with box2d is that not everything works as you imagine it

a box2d body has much definition (restitution, Density, friction, type,...)
now moving your body in a box2d world should be done by applying forces or impulse to your body to get the right physic filling. just setting the position each frame or applying a constant velocity wont look very good.

the problem is when you have a static body (wall) and a dynamic body (player) and you apply consistently force on the x axis to the player then when he will be pushed on a wall and under that wall there is no ground ...

example image:

he wont slide down and will be stuck on this wall IF the friction of the body and wall is > 0

the friction and consistently force will hold the player on his position. now if you ask why is the force consistently?? the reason is if the PLAYER (the guy that plays the game) wont release the left/right button (where you apply the force to the player) then the player (game character) will always be applied a force since the button is still clicked by the PLAYER.

now you can say just change the friction of the wall. ok this will work but a wall is often also a ground! so that means the player will slide on it.
so we could always check when player hit the wall we stop applying force but you will need to check from where the collision was because a wall is often a ground too and we still want our player run on it.

so what i did is i changed the player friction to 0. so now the player is sliding on walls AND on ground.

and what i also do is when PLAYER release the button i change slowly the player velocity until it is 0 and like this the player wont slide consistently on the ground.

this solved me the problem my player stucking on walls.

snipped:

B4X:
``````            If drawleft = True Then
Dim desiredVel As Float = Min(0,player.getLinearVelocityFromWorldPoint(player.WorldCenter).x+(speed*0.1))
player.setLinearVelocity2(desiredVel,player.getLinearVelocityFromWorldPoint(player.WorldCenter).y)
Else
Dim desiredVel As Float = Max(0,player.getLinearVelocityFromWorldPoint(player.WorldCenter).x-(speed*0.1))
player.setLinearVelocity2(desiredVel,player.getLinearVelocityFromWorldPoint(player.WorldCenter).y)
End If``````

changing the stepp (speed*0.1) will let your player slide longer on the ground like if he is on ice you could change the step to (speed*0.01)

Have fun coding!

#### ilan

##### Expert
Longtime User
By the way, you could maybe indicate in the title that this is Box2D specific.

done

Replies
11
Views
5K
Replies
14
Views
4K
Replies
3
Views
9K
Replies
3
Views
6K
Replies
0
Views
2K