78 lines
1.6 KiB
GDScript
78 lines
1.6 KiB
GDScript
class_name Player
|
|
extends CharacterBody2D
|
|
|
|
@onready var raycast: RayCast2D = $RayCast2D
|
|
@onready var tile_map: MainLevel = $"../TileMap"
|
|
|
|
@export var speed: float = 40
|
|
@export var respawn_point: Marker2D
|
|
|
|
const TILE_SIZE = 8
|
|
|
|
var is_moving = false
|
|
var should_move = false
|
|
var input_dir: Vector2
|
|
|
|
func _ready():
|
|
_respawn()
|
|
pass
|
|
|
|
func _process(delta):
|
|
_try_interact()
|
|
pass
|
|
|
|
func _physics_process(delta):
|
|
_try_move()
|
|
|
|
func _respawn():
|
|
position = respawn_point.position
|
|
|
|
func _try_move():
|
|
should_move = false
|
|
if Input.is_action_pressed("move_up"):
|
|
input_dir = Vector2.UP
|
|
should_move = true
|
|
elif Input.is_action_pressed("move_right"):
|
|
input_dir = Vector2.RIGHT
|
|
should_move = true
|
|
elif Input.is_action_pressed("move_down"):
|
|
input_dir = Vector2.DOWN
|
|
should_move = true
|
|
elif Input.is_action_pressed("move_left"):
|
|
input_dir = Vector2.LEFT
|
|
should_move = true
|
|
|
|
if should_move and !is_moving:
|
|
raycast.target_position = input_dir * 8
|
|
raycast.force_raycast_update()
|
|
|
|
if raycast.is_colliding():
|
|
return
|
|
|
|
is_moving = true
|
|
var tween = create_tween()
|
|
tween.tween_property(self, "position", position + input_dir * TILE_SIZE, 0.25)
|
|
tween.tween_callback(func():
|
|
is_moving = false
|
|
_post_movement_check()
|
|
)
|
|
|
|
func _post_movement_check():
|
|
var is_death_tile = tile_map.is_death_tile(global_position)
|
|
if is_death_tile:
|
|
die()
|
|
|
|
func die():
|
|
_respawn()
|
|
|
|
func _try_interact():
|
|
raycast.target_position = input_dir * 8
|
|
raycast.force_raycast_update()
|
|
|
|
var collider = raycast.get_collider()
|
|
if Input.is_action_just_pressed("attack") and collider:
|
|
if collider is PuzzleElement:
|
|
(collider as PuzzleElement).interact(self)
|
|
pass
|
|
pass
|