Skip to content

Instantly share code, notes, and snippets.

@sjvnnings
Last active April 17, 2025 20:26
Show Gist options
  • Save sjvnnings/5f02d2f2fc417f3804e967daa73cccfd to your computer and use it in GitHub Desktop.
Save sjvnnings/5f02d2f2fc417f3804e967daa73cccfd to your computer and use it in GitHub Desktop.
An easy to work with jump in Godot
extends KinematicBody2D
export var move_speed = 200.0
var velocity := Vector2.ZERO
export var jump_height : float
export var jump_time_to_peak : float
export var jump_time_to_descent : float
onready var jump_velocity : float = ((2.0 * jump_height) / jump_time_to_peak) * -1.0
onready var jump_gravity : float = ((-2.0 * jump_height) / (jump_time_to_peak * jump_time_to_peak)) * -1.0
onready var fall_gravity : float = ((-2.0 * jump_height) / (jump_time_to_descent * jump_time_to_descent)) * -1.0
func _physics_process(delta):
velocity.y += get_gravity() * delta
velocity.x = get_input_velocity() * move_speed
if Input.is_action_just_pressed("jump") and is_on_floor():
jump()
velocity = move_and_slide(velocity, Vector2.UP)
func get_gravity() -> float:
return jump_gravity if velocity.y < 0.0 else fall_gravity
func jump():
velocity.y = jump_velocity
func get_input_velocity() -> float:
var horizontal := 0.0
if Input.is_action_pressed("left"):
horizontal -= 1.0
if Input.is_action_pressed("right"):
horizontal += 1.0
return horizontal
@LiamTheMagician
Copy link

There something I just can't figure out, my implementation looks fine, but jump height seems to be disregarded completely, in Godot 4.3:

extends CharacterBody2D

@export var speed = 300.0

@export var jump_height : float = 0.5
@export var jump_time_to_peak : float = 1.0
@export var jump_time_to_descent : float = 0.5

@onready var jump_velocity : float = ((2.0 * jump_height) / jump_time_to_peak) * -1.0
@onready var jump_gravity : float = ((-2.0 * jump_height) / (jump_time_to_peak * jump_time_to_peak)) * -1.0
@onready var fall_gravity : float = ((-2.0 * jump_height) / (jump_time_to_descent * jump_time_to_peak)) * -1.0

func get_input():
	return Input.get_axis("player_left", "player_right")

func get_gravity_2D():
	return jump_gravity if velocity.y < 0.0 else fall_gravity

func jump():
	velocity.y = jump_velocity

func _physics_process(delta):
	velocity.y += get_gravity_2D() * delta
	velocity.x = get_input() * speed
	
	if Input.is_action_just_pressed("player_jump") and is_on_floor():
		jump()
	
	move_and_slide()
	

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment