xiandie/scene/entity/closeup.gd

74 lines
1.9 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
@export var quit_closeup_on_exit := true
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-20 17:51:36 +00:00
SceneManager.freeze_player(0)
sign_mark.display_sign = false
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-20 17:51:36 +00:00
tween.tween_callback(func(): sign_mark.display_sign = true)
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)
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()