80 lines
1.8 KiB
GDScript
80 lines
1.8 KiB
GDScript
class_name Player
|
|
extends CharacterBody2D
|
|
|
|
@onready var raycast: RayCast2D = $RayCast2D
|
|
@onready var tile_map: TileMapLayer = $"../TileMapLayer"
|
|
|
|
@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():
|
|
print(tile_map)
|
|
_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 current_tile: Vector2i = tile_map.local_to_map(tile_map.to_local(global_position))
|
|
var tile_data: TileData = tile_map.get_cell_tile_data(current_tile)
|
|
if tile_data and tile_data.get_custom_data("death"):
|
|
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
|