Files
godot-action-adventure-test/Scenes/Player/player.gd
T

96 lines
2.7 KiB
GDScript

extends CharacterBody2D
class_name Player
@export var move_speed: float = 100
@export var hp: int = 10
@export var push_strength: int = 50
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
update_scrolls()
%HealthBar.play("3_hp")
var damage: float = 2
if SceneManager.player_next_scene_spawn_pos != Vector2(0, 0):
position = SceneManager.player_next_scene_spawn_pos
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _physics_process(delta: float) -> void:
move_player()
push_blocks()
update_scrolls()
move_and_slide()
if Input.is_action_just_pressed("Interact"):
attack()
func move_player():
var move_vector: Vector2 = Input.get_vector("ui_left", "ui_right", "ui_up", "ui_down")
velocity = move_vector * move_speed
if velocity.x > 0:
$AnimatedSprite2D.play("move_right")
$InteractArea2D.position = Vector2(5, 2)
elif velocity.x < 0:
$AnimatedSprite2D.play("move_left")
$InteractArea2D.position = Vector2(-5, 2)
elif velocity.y > 0:
$AnimatedSprite2D.play("move_down")
$InteractArea2D.position = Vector2(0, 8)
elif velocity.y < 0:
$AnimatedSprite2D.play("move_up")
$InteractArea2D.position = Vector2(0, -4)
else:
$AnimatedSprite2D.stop()
func push_blocks():
var collision: KinematicCollision2D = get_last_slide_collision()
if collision:
var collisision_node = collision.get_collider()
if collisision_node.is_in_group("pushable"):
var collision_normal: Vector2 = collision.get_normal()
collisision_node.apply_central_force(-collision_normal * push_strength)
func update_scrolls():
$CanvasLayer/Panel/Label.text = str(SceneManager.opened_chests.size())
func _on_area_2d_body_entered(body: Node2D) -> void:
if body.is_in_group("interactable"):
body.can_interact = true
func _on_area_2d_body_exited(body: Node2D) -> void:
if body.is_in_group("interactable"):
body.can_interact = false
func _on_hit_box_area_2d_body_entered(body: Node2D) -> void:
SceneManager.player_hp -= 1
%HealthBar.play(str(SceneManager.player_hp) + "_hp")
if SceneManager.player_hp <= 0:
die()
func die():
get_tree().call_deferred("reload_current_scene")
SceneManager.player_hp = 3
func _on_sword_area_2d_body_entered(body: Node2D) -> void:
body.queue_free()
func attack():
if velocity.x > 0:
$Sword.position = Vector2(0, 0.5)
elif velocity.x < 0:
$Sword.position = Vector2(-5, 2)
elif velocity.y > 0:
$Sword.position = Vector2(0, 8)
elif velocity.y < 0:
$Sword.position = Vector2(0, -4)
$Sword.visible = true
$Sword/SwordArea2D.monitoring = true
$Sword/SwordTimer.start()
func _on_sword_timer_timeout() -> void:
$Sword.visible = false
$Sword/SwordArea2D.monitoring = false