How to make a character(A Square) to rotate along side the slope it is on? (2d Platform)

:information_source: Attention Topic was automatically imported from the old Question2Answer platform.
:bust_in_silhouette: Asked By Xylo4nic

So I was following a GD quest tutorial on 2d platformer and noticed that although everything works well when I tried to add a slope in game the box just climb it without rotating along side the degree of the slope. The box is a kinematic body 2d and i am using move and slide(linear_velocity, up direction(0,-1)) to control it. I look up the documents and figure that move and slide could be used to handle slopes but I just couldn’t find a way to do that.

1 Like
:bust_in_silhouette: Reply From: PunchablePlushie

You can get the floor normal using get_floor_normal, then set the rotation of your sprite to be equal to the angle of the floor normal.
Note that you should call get_floor_normal after calling move_and_slide(). You can also use the is_on_floor() method to check if the player is on floor and only get the normal then.


So, the code could look something like this:

func _process(delta: float) -> void:
   # Some code for getting the velocity, applying gravity, etc

   move_and_slide(velocity, Vector2.UP)

   if is_on_floor():
      var normal: Vector2 = get_floor_normal()
      $Sprite.rotation = normal.angle()

Depending on your sprite, you might need to apply an offset to the rotation in order to align your it properly with the floor tho.

var offset: float = deg2rad(90)
$Sprite.rotation = normal.angle() + offset

The angle() method returns the angle of the vector in radians. You can use deg2rad() and rad2deg() to convert them into each other.


Edit: Formating and spelling errors.