xiandie/scene/entity/closeup.gd

66 lines
1.6 KiB
GDScript3
Raw Normal View History

@tool
extends Interactable2D
class_name Closeup2D
# 退出信号,默认 arg 为 null可能是一个 bool 值,从 packed_scene 的 exit 信号中传递过来
signal exit(arg)
2025-06-11 05:43:36 +00:00
# 第一次交互时的气泡文字unrevealed -> revealed 如果为空则跳过
@export var first_interact_os_key := ""
@export var packed_scene: PackedScene
var current_child: Node
func _ready() -> void:
super._ready()
if Engine.is_editor_hint():
return
2025-06-11 05:43:36 +00:00
interacted.connect(_close_up_interacted)
func _close_up_interacted() -> void:
if interacted_times == 1 and first_interact_os_key:
2025-06-15 05:11:41 +00:00
var tween = await SceneManager.pop_os_with_str(first_interact_os_key)
tween.tween_interval(0.5)
tween.tween_callback(display)
2025-06-11 05:43:36 +00:00
else:
display()
2025-05-14 20:43:55 +00:00
# 可以直接调用
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)
else:
printerr("[特写界面] Scene does not have 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
# 在有特写界面时,阻塞输入
get_viewport().set_input_as_handled()
if event.is_action_pressed("cancel") or event.is_action_pressed("escape"):
_exit()