From 3a9a623de2d600b28cc03b588c3c96512fde7b3d Mon Sep 17 00:00:00 2001 From: Haze Weathers Date: Fri, 14 Mar 2025 18:40:30 -0400 Subject: [PATCH] 2d-3d velocity separation example --- objects/player/player.gd | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/objects/player/player.gd b/objects/player/player.gd index 758f149..0fdb656 100644 --- a/objects/player/player.gd +++ b/objects/player/player.gd @@ -10,7 +10,7 @@ extends CharacterBody3D @export var level_path: Path3D -var h_speed: float = 0.0 +var velocity_2d: Vector2 = Vector2.ZERO func _physics_process(delta: float) -> void: @@ -24,20 +24,23 @@ func _physics_process(delta: float) -> void: # horizontal movement var input_dir = signf(Input.get_axis(&"walk_left", &"walk_right")) - h_speed += input_dir * walk_acceleration * delta + velocity_2d.x += input_dir * walk_acceleration * delta if input_dir == 0.0: - h_speed = move_toward(h_speed, 0.0, stopping_rate * delta) - h_speed = clampf(h_speed, -walk_speed, walk_speed) - - var h_velocity = global_transform.basis.z * h_speed - velocity.x = h_velocity.x - velocity.z = h_velocity.z + velocity_2d.x = move_toward(velocity_2d.x, 0.0, stopping_rate * delta) + velocity_2d.x = clampf(velocity_2d.x, -walk_speed, walk_speed) # vertical movement - velocity.y -= gravity * delta - if Input.is_action_just_pressed(&"jump"): - velocity.y = jump_force + velocity_2d.y -= gravity * delta + if is_on_floor() and Input.is_action_just_pressed(&"jump"): + velocity_2d.y = jump_force + # translate 2d movement to 3d + velocity.x = global_transform.basis.z.x * velocity_2d.x + velocity.y = velocity_2d.y + velocity.z = global_transform.basis.z.z * velocity_2d.x + + # apply movement and translate 3d velocity back to 2d move_and_slide() - - # update horizontal speed after slide + var h_vel = (velocity * Vector3(1.0, 0.0, 1.0)) + velocity_2d.x = h_vel.length() * signf(global_transform.basis.z.dot(h_vel)) + velocity_2d.y = velocity.y