xiandie/scene/entity/closeup.gd

74 lines
1.9 KiB
GDScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

@tool
extends Interactable2D
class_name Closeup2D
# 退出信号,默认 arg 为 null可能是一个 bool 值,从 packed_scene 的 exit 信号中传递过来
signal exit(arg)
# 第一次交互时的气泡文字unrevealed -> revealed 如果为空则跳过
@export var first_interact_os_key := ""
@export var packed_scene: PackedScene
@export var quit_closeup_on_exit := true
var current_child: Node
func _ready() -> void:
super._ready()
if Engine.is_editor_hint():
return
interacted.connect(_close_up_interacted)
func _close_up_interacted() -> void:
if interacted_times == 1 and first_interact_os_key:
SceneManager.freeze_player(0)
sign_mark.display_sign = false
var tween = await SceneManager.pop_os_with_str(first_interact_os_key)
tween.tween_interval(0.5)
tween.tween_callback(display)
tween.tween_callback(func(): sign_mark.display_sign = true)
else:
display()
# 可以直接调用
func display() -> void:
if current_child:
# 先退出
_exit()
if packed_scene:
SceneManager.freeze_player(0)
# 展示时,禁用 sign_mark 的输入
sign_mark.pass_unhandled_input = true
current_child = packed_scene.instantiate()
add_child(current_child)
if current_child.has_signal("exit"):
current_child.connect("exit", _exit)
elif GlobalConfig.DEBUG:
print("[特写界面] no exit signal, packed_scene:", packed_scene)
func _exit(arg = null):
if current_child:
SceneManager.release_player()
current_child.queue_free()
exit.emit(arg)
# 退出时,恢复 sign_mark 的输入
sign_mark.pass_unhandled_input = false
func _unhandled_input(event: InputEvent) -> void:
if not current_child:
return
if (
quit_closeup_on_exit
and (event.is_action_pressed("cancel") or event.is_action_pressed("escape"))
):
_exit()
get_viewport().set_input_as_handled()
# 在有特写界面时,阻塞 interact 输入
elif event.is_action_pressed("interact"):
get_viewport().set_input_as_handled()