Moving Platforms
Problem
You need moving platforms in your 2D platformer.
Solution
There are several ways to approach this problem. In this recipe, we’ll use KinematicBody2D
s for our platforms and move them with AnimationPlayer
. This allows for a variety of movement styles while minimizing the amount of code we need to write.
Setting up
We’ll start with a basic platformer setup using the Platform character recipe. We will need to make one small modification from that recipe: using move_and_slide_with_snap()
for the movement.
Here is the updated code:
func _physics_process(delta):
get_input()
velocity.y += gravity * delta
var snap = Vector2.DOWN * 16 if is_on_floor() else Vector2.ZERO
velocity = move_and_slide_with_snap(velocity, snap, Vector2.UP)
if Input.is_action_just_pressed("jump"):
if is_on_floor():
velocity.y = jump_speed
With this code, we’ll still get the same behavior with jumping and sliding, but the snap
value will ensure that the character “sticks” to the platform even if it moves. See the KinematicBody2D docs for more information on how the snap
parameter works.
Creating the platform
The platform scene contains the following nodes:
The Node2D
parent is there to act as the “anchor” or start point for the platform. We’ll animate the platform’s position
relative to this parent node.
Set up the Sprite
’s Texture and the collision shape appropriately. In the KinematicBody2D
, set the Sync to Physics property “On”. Since we’re not moving the body in code, this ensures that it’s moved during the physics step. You’ll also need to set the Process Mode property of the AnimationPlayer
to “Physics”.
To move the platform, create an animation in the AnimationPlayer
that animates the body’s position
property. For example, here’s one animating the platform horizontally in a 4 second loop:
You’re done! Instance some platforms in your level/world and try them out:
Related recipes
Like video?
Coming soon