CharacterBody2D

Godot Version
v4.2

Question
Hi guys, I wanted to know if there is any video showing how to set up a 2D character via CharacterBody2D. Thanks in advance

There is a template script for basic movement when you attach a script to a CharacterBody2D.

2024-04-29-104400_446x407_scrot

This is what it creates, good for side scroller movement.

extends CharacterBody2D


const SPEED = 300.0
const JUMP_VELOCITY = -400.0

# Get the gravity from the project settings to be synced with RigidBody nodes.
var gravity: int = ProjectSettings.get_setting("physics/2d/default_gravity")


func _physics_process(delta: float) -> void:
	# Add the gravity.
	if not is_on_floor():
		velocity.y += gravity * delta

	# Handle jump.
	if Input.is_action_just_pressed("ui_accept") and is_on_floor():
		velocity.y = JUMP_VELOCITY

	# Get the input direction and handle the movement/deceleration.
	# As good practice, you should replace UI actions with custom gameplay actions.
	var direction := Input.get_axis("ui_left", "ui_right")
	if direction:
		velocity.x = direction * SPEED
	else:
		velocity.x = move_toward(velocity.x, 0, SPEED)

	move_and_slide()
3 Likes

You can check the new video from Brackeys to setup a complete project:

You can see how to modify the default script shared by @gertkeno skiping to this section if you want:

thank you very much, I wanted to ask one more thing, I would like to add a double jump

I would start by adding a variable to track mid-air jumps. The jump condition checks if the button was pressed and the player must be on the floor, so let’s alter that to on the floor or has jumps. Then we have to subtract a mid air jump, and give one back when on land.

extends CharacterBody2D


const SPEED = 300.0
const JUMP_VELOCITY = -400.0

var gravity: int = ProjectSettings.get_setting("physics/2d/default_gravity")

# new variable to track double jumps
var air_jumps: int

func _physics_process(delta: float) -> void:
	if not is_on_floor():
		velocity.y += gravity * delta
	else:
		# on floor, reset double jumps
		air_jumps = 1

	# Handle jump or double jump
	if Input.is_action_just_pressed("ui_accept") and (is_on_floor() or air_jumps > 0):
		velocity.y = JUMP_VELOCITY
		# only subtract from air_jumps if in the air, up to you for game-feel
		if not is_on_floor():
			air_jumps -= 1


	var direction := Input.get_axis("ui_left", "ui_right")
	if direction:
		velocity.x = direction * SPEED
	else:
		velocity.x = move_toward(velocity.x, 0, SPEED)

	move_and_slide()
1 Like