From 47f9406a184d838e4701978a1a6f2dd871326d51 Mon Sep 17 00:00:00 2001 From: Clifton Palmer Date: Tue, 6 May 2025 16:20:33 +0300 Subject: [PATCH 1/1] Fixed up moves --- Scene.gd | 8 ++++---- player/Move.gd | 6 +++--- player/dash.gd | 14 ++++++++++++-- player/idle.gd | 16 ++++++++++++---- player/model.gd | 8 +++++--- player/player.gd | 6 ++++-- player/walk.gd | 25 +++++++++++++++++-------- 7 files changed, 57 insertions(+), 26 deletions(-) diff --git a/Scene.gd b/Scene.gd index b43d72f..e733bfb 100644 --- a/Scene.gd +++ b/Scene.gd @@ -3,19 +3,19 @@ class_name Scene @onready var player: Player = %Player -@onready var model: PlayerModel = %Model @onready var debug: CanvasLayer = %debug @onready var version: String = ProjectSettings.get_setting("application/config/version") func _ready() -> void: debug.draw.add_vector(player, "velocity", 1, 1, Color(0,1,0,1)) - #_debug.draw.add_vector(model, "floor_normal", 1, 1, Color(0, 0, 1, 1)) - #_debug.draw.add_vector(model, "last_movement_direction", 1, 1, Color(1,0,0,1)) + debug.draw.add_vector(player, "floor_normal", 1, 1, Color(0, 0, 1, 1)) + debug.draw.add_vector(player, "last_movement_direction", 1, 1, Color(1,0,0,1)) debug.stats.add_property(self, "version", "") + debug.stats.add_property(player, "state", "") debug.stats.add_property(player, "velocity", "length") - #debug.stats.add_property(model, "idle_time", "round") + debug.stats.add_property(player, "idle_time", "round") func _input(event: InputEvent) -> void: diff --git a/player/Move.gd b/player/Move.gd index 70fb73a..3401850 100644 --- a/player/Move.gd +++ b/player/Move.gd @@ -3,7 +3,7 @@ class_name Move ### # flags and variables here -var player: CharacterBody3D +var player: Player var camera: Camera3D # enums are prioritized by order of list @@ -18,12 +18,12 @@ static func moves_priority_sort(a: String, b: String): ### -func should_enter(input: InputPacket) -> String: +func should_enter(_input: InputPacket) -> String: print_debug("Function should_enter must be implemented in its child class!") return "" -func update(input: InputPacket, delta: float): +func update(_input: InputPacket, _delta: float): pass diff --git a/player/dash.gd b/player/dash.gd index c062734..6b6368f 100644 --- a/player/dash.gd +++ b/player/dash.gd @@ -7,5 +7,15 @@ func should_enter(input) -> String: return input.actions[0] -func update(input: InputPacket, delta: float): - player.move_and_slide() +func update(input: InputPacket, _delta: float): + # Get the XZ input direction based on player's input relative to the camera + var forward := camera.global_basis.z + var right := camera.global_basis.x + var move_direction := ( + forward * input.movement_direction.y + right * input.movement_direction.x + ).normalized() + move_direction.y = 0 + + # TODO: check if new_pos is valid! + var new_pos := player.last_movement_direction * player.dash_length + player.global_position += new_pos diff --git a/player/idle.gd b/player/idle.gd index 0fa5569..f7bd955 100644 --- a/player/idle.gd +++ b/player/idle.gd @@ -1,7 +1,15 @@ -extends Move +extends Walk class_name Idle -func should_enter(input) -> String: - input.actions.sort_custom(moves_priority_sort) - return input.actions[0] +func update(input: InputPacket, delta: float): + player.idle_time += delta + super.update(input, delta) + + +func on_enter_state(): + player.idle_time = 0.0 + + +func on_exit_state(): + player.idle_time = 0.0 diff --git a/player/model.gd b/player/model.gd index 05564a8..ec1a952 100644 --- a/player/model.gd +++ b/player/model.gd @@ -15,22 +15,24 @@ var current_move: Move ### func _ready() -> void: + # assign starting state current_move = moves["idle"] - # assign player object to each move + # assign objects to each move for move in moves.values(): move.player = player move.camera = camera func update(input: InputPacket, delta: float): - var relevent_move = current_move.should_enter(input) - if not relevent_move.is_empty(): + var relevent_move := current_move.should_enter(input) + if moves[relevent_move] != current_move: switch_to(relevent_move) current_move.update(input, delta) func switch_to(state: String): + player.state = state current_move.on_exit_state() current_move = moves[state] current_move.on_enter_state() diff --git a/player/player.gd b/player/player.gd index ea89487..6f82ce6 100644 --- a/player/player.gd +++ b/player/player.gd @@ -6,11 +6,13 @@ class_name Player @export var walk_speed := 8.0 @export var dash_length := 10.0 @export var air_speed := 3.0 -@export var acceleration := 30.0 +@export var acceleration := 20.0 @export var rotation_speed := 10.0 @export var idle_timeout := 5.0 -var idle_time := 0.0 +var idle_time := 0.00 +var last_movement_direction := Vector3.ZERO +var state := "" var floor_normal := Vector3.ZERO var ground_slope_input := 0.0 diff --git a/player/walk.gd b/player/walk.gd index 5f536b3..e9cf6d9 100644 --- a/player/walk.gd +++ b/player/walk.gd @@ -8,20 +8,29 @@ func should_enter(input) -> String: func update(input: InputPacket, delta: float): + player.velocity = get_new_velocity_from_input(input, delta) + player.move_and_slide() + + +func get_new_velocity_from_input(input: InputPacket, delta: float) -> Vector3: # Get the XZ input direction based on player's input relative to the camera var forward := camera.global_basis.z var right := camera.global_basis.x - var move_direction := ( + var movement_direction := ( forward * input.movement_direction.y + right * input.movement_direction.x ).normalized() - move_direction.y = 0 + movement_direction.y = 0 + + # save off last movement direction + if movement_direction.length() > 0.2: + player.last_movement_direction = movement_direction # if we're not stuck, then it's okay to set the velocity - var floor_normal = player.get_floor_normal() - var ground_slope_input = (PI / 2) - player.velocity.angle_to(floor_normal) - player.velocity = player.velocity.move_toward( - move_direction * (player.walk_speed + ground_slope_input * player.walk_speed), + player.floor_normal = player.get_floor_normal() + player.ground_slope_input = (PI / 2) - player.velocity.angle_to(player.floor_normal) + var new_velocity = player.velocity.move_toward( + movement_direction * (player.walk_speed + player.ground_slope_input * player.walk_speed), player.acceleration * delta ) - - player.move_and_slide() + + return new_velocity -- 2.47.2