63 lines
2.2 KiB
GDScript
63 lines
2.2 KiB
GDScript
extends CanvasLayer
|
|||
|
|
|
||
|
|
@onready var health_text = $HealthText
|
||
|
|
@onready var vignette = $Vignette
|
||
|
|
|
||
|
|
var health_component: Node = null
|
||
|
|
|
||
|
|
func _ready() -> void:
|
||
|
|
# Ищем HealthComponent у нашего игрока (родителя)
|
||
|
|
if get_parent():
|
||
|
|
health_component = get_parent().find_child("HealthComponent", true, false)
|
||
|
|
|
||
|
|
if health_component == null:
|
||
|
|
print("[UI ЗДОРОВЬЯ] КРИТИЧЕСКАЯ ОШИБКА: HealthComponent игрока не найден!")
|
||
|
|
|
||
|
|
# Изначально принудительно настраиваем видимость
|
||
|
|
if health_text:
|
||
|
|
health_text.visible = true
|
||
|
|
if vignette:
|
||
|
|
vignette.visible = false
|
||
|
|
|
||
|
|
func _process(delta: float) -> void:
|
||
|
|
if health_component == null:
|
||
|
|
return
|
||
|
|
|
||
|
|
var current_health = health_component.current_health
|
||
|
|
|
||
|
|
# 1. ОБНОВЛЯЕМ ЦИФРЫ НА ЭКРАНЕ
|
||
|
|
if health_text:
|
||
|
|
health_text.text = str(clamp(int(current_health), 0, 100))
|
||
|
|
|
||
|
|
# Красим цифры при низком здоровье
|
||
|
|
if current_health <= 30:
|
||
|
|
health_text.add_theme_color_override("font_color", Color.RED)
|
||
|
|
else:
|
||
|
|
health_text.add_theme_color_override("font_color", Color.WHITE)
|
||
|
|
|
||
|
|
# 2. УПРАВЛЯЕМ КРАСНОЙ ВИНЬЕТКОЙ
|
||
|
|
if vignette:
|
||
|
|
if current_health <= 30 and current_health > 0:
|
||
|
|
vignette.visible = true
|
||
|
|
|
||
|
|
# Эффект плавного биения сердца (пульсация)
|
||
|
|
var color_rect = vignette.get_node_or_null("ColorRect")
|
||
|
|
if color_rect:
|
||
|
|
color_rect.visible = true
|
||
|
|
var pulse = (sin(Time.get_ticks_msec() * 0.005) + 1.0) / 2.0
|
||
|
|
color_rect.modulate.a = lerp(0.3, 1.0, pulse)
|
||
|
|
else:
|
||
|
|
vignette.visible = false
|
||
|
|
|
||
|
|
# 3. АВТОРЕСТАРТ ПРИ СМЕРТИ (Перезагрузка уровня)
|
||
|
|
if current_health <= 0:
|
||
|
|
print("[UI ЗДОРОВЬЯ] Игрок погиб! Перезагружаю уровень через 2 секунды...")
|
||
|
|
# Отключаем процесс, чтобы не спамить перезагрузкой
|
||
|
|
set_process(false)
|
||
|
|
|
||
|
|
# Ждем 2 секунды, чтобы игрок успел понять, что умер
|
||
|
|
await get_tree().create_timer(2.0).timeout
|
||
|
|
|
||
|
|
# Мягко перезапускаем текущую сцену
|
||
|
|
get_tree().reload_current_scene()
|