From 395e16374a558dea515a05ae652c62f007f6eac7 Mon Sep 17 00:00:00 2001 From: Wynd Date: Mon, 16 Sep 2024 00:32:56 +0300 Subject: [PATCH] Smooth cell to cell player movement --- entities/player/player.gd | 66 ++++++++++++++++++++++++------------- entities/player/player.tscn | 3 +- 2 files changed, 44 insertions(+), 25 deletions(-) diff --git a/entities/player/player.gd b/entities/player/player.gd index f0eeb86..fbff022 100644 --- a/entities/player/player.gd +++ b/entities/player/player.gd @@ -1,28 +1,55 @@ extends CharacterBody2D -@export var speed: float = 400 +@export var speed: float = 40 @onready var raycast: RayCast2D = $RayCast2D +const TILE_SIZE = 8 + +var is_moving = false +var input_dir: Vector2 +var prev_input: Vector2 + func _ready(): pass -func _process_movement(): - velocity = Vector2.ZERO - if Input.is_action_pressed("move_up"): - velocity.y -= 1 - elif Input.is_action_pressed("move_right"): - velocity.x += 1 - elif Input.is_action_pressed("move_down"): - velocity.y += 1 - elif Input.is_action_pressed("move_left"): - velocity.x -= 1 - - if velocity.length() > 0: - velocity = velocity.normalized() * speed - raycast.target_position = velocity.normalized() * 8 +func _process(delta): + _try_interact() + pass - move_and_slide() +func _physics_process(delta): + _try_move() + + +func _try_move(): + input_dir = Vector2.ZERO + if Input.is_action_pressed("move_up"): + input_dir = Vector2.UP + elif Input.is_action_pressed("move_right"): + input_dir = Vector2.RIGHT + elif Input.is_action_pressed("move_down"): + input_dir = Vector2.DOWN + elif Input.is_action_pressed("move_left"): + input_dir = Vector2.LEFT + + if input_dir and !is_moving: + raycast.target_position = input_dir * 8 + + if input_dir != prev_input: + prev_input = input_dir + return + + var collision = raycast.get_collider() + if raycast.is_colliding(): + return + + is_moving = true + prev_input = input_dir + var tween = create_tween() + tween.tween_property(self, "position", position + input_dir * TILE_SIZE, 0.25) + tween.tween_callback(func(): + is_moving = false + ) func _try_interact(): if Input.is_action_just_pressed("attack") and raycast.is_colliding(): @@ -31,10 +58,3 @@ func _try_interact(): (collision as PuzzleElement).interact() pass pass - -func _process(delta): - _try_interact() - pass - -func _physics_process(delta): - _process_movement() diff --git a/entities/player/player.tscn b/entities/player/player.tscn index 5bf84b5..e15832e 100644 --- a/entities/player/player.tscn +++ b/entities/player/player.tscn @@ -48,7 +48,6 @@ size = Vector2(8, 8) z_index = 1 collision_mask = 3 script = ExtResource("1_jrd75") -speed = 40.0 [node name="Camera2D" type="Camera2D" parent="."] @@ -68,4 +67,4 @@ shape = SubResource("RectangleShape2D_l7fhd") [node name="RayCast2D" type="RayCast2D" parent="."] target_position = Vector2(0, 8) -collision_mask = 2 +collision_mask = 3