63 lines
2.2 KiB
GDScript
63 lines
2.2 KiB
GDScript
extends CanvasLayer
|
|||
|
|
|
||
|
|
@onready var dialogue_box = $DialogueBox
|
||
|
|
@onready var name_label = $DialogueBox/NameLabel
|
||
|
|
@onready var text_label = $DialogueBox/TextLabel
|
||
|
|
@onready var press_e_label = $PressE
|
||
|
|
|
||
|
|
var current_dialogue_lines: Array = []
|
||
|
|
var current_line_index: int = 0
|
||
|
|
|
||
|
|
func _ready():
|
||
|
|
# Изначально скрываем и окно диалога, и саму подсказку "Press E"
|
||
|
|
dialogue_box.visible = false
|
||
|
|
if press_e_label:
|
||
|
|
press_e_label.visible = false
|
||
|
|
|
||
|
|
func start_dialogue(lines: Array):
|
||
|
|
# Как только диалог начался — подсказку "Press E" нужно СРАЗУ убрать с экрана
|
||
|
|
hide_prompt()
|
||
|
|
|
||
|
|
current_dialogue_lines = lines
|
||
|
|
current_line_index = 0
|
||
|
|
dialogue_box.visible = true
|
||
|
|
|
||
|
|
Input.mouse_mode = Input.MOUSE_MODE_VISIBLE
|
||
|
|
show_current_line()
|
||
|
|
|
||
|
|
func show_current_line():
|
||
|
|
if current_line_index < current_dialogue_lines.size():
|
||
|
|
var line_data = current_dialogue_lines[current_line_index]
|
||
|
|
name_label.text = line_data.get("name", "NPC")
|
||
|
|
text_label.text = line_data.get("text", "")
|
||
|
|
else:
|
||
|
|
end_dialogue()
|
||
|
|
|
||
|
|
func _input(event):
|
||
|
|
if dialogue_box.visible:
|
||
|
|
var is_mouse_click = event is InputEventMouseButton and event.pressed and event.button_index == MOUSE_BUTTON_LEFT
|
||
|
|
var is_accept = event.is_action_pressed("ui_accept")
|
||
|
|
var is_e_key = event is InputEventKey and event.pressed and event.keycode == KEY_E
|
||
|
|
|
||
|
|
if is_mouse_click or is_accept or is_e_key:
|
||
|
|
current_line_index += 1
|
||
|
|
show_current_line()
|
||
|
|
# Перехватываем ввод, чтобы клики мыши при листании не вызывали стрельбу в шутере
|
||
|
|
get_viewport().set_input_as_handled()
|
||
|
|
|
||
|
|
func end_dialogue():
|
||
|
|
dialogue_box.visible = false
|
||
|
|
Input.mouse_mode = Input.MOUSE_MODE_CAPTURED
|
||
|
|
|
||
|
|
# Функция для показа подсказки
|
||
|
|
func show_prompt() -> void:
|
||
|
|
if press_e_label and not dialogue_box.visible:
|
||
|
|
press_e_label.visible = true
|
||
|
|
print("[UI] Подсказка 'Press E' успешно включена на экране.")
|
||
|
|
|
||
|
|
# Функция для скрытия подсказки
|
||
|
|
func hide_prompt() -> void:
|
||
|
|
if press_e_label:
|
||
|
|
press_e_label.visible = false
|
||
|
|
print("[UI] Подсказка 'Press E' скрыта.")
|