2025-05-13 11:45:33 +00:00
|
|
|
|
@tool
|
|
|
|
|
|
|
|
|
|
extends Interactable2D
|
|
|
|
|
class_name Closeup2D
|
|
|
|
|
|
|
|
|
|
# 退出信号,默认 arg 为 null,可能是一个 bool 值,从 packed_scene 的 exit 信号中传递过来
|
|
|
|
|
signal exit(arg)
|
|
|
|
|
|
|
|
|
|
@export var packed_scene: PackedScene
|
|
|
|
|
|
|
|
|
|
@onready var sign = $Sign as Sign
|
|
|
|
|
|
|
|
|
|
var current_child: Node
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func _ready() -> void:
|
|
|
|
|
super._ready()
|
|
|
|
|
if Engine.is_editor_hint():
|
|
|
|
|
return
|
2025-05-14 20:43:55 +00:00
|
|
|
|
interacted.connect(display)
|
2025-05-13 11:45:33 +00:00
|
|
|
|
|
2025-05-14 20:43:55 +00:00
|
|
|
|
# 可以直接调用
|
|
|
|
|
func display() -> void:
|
2025-05-13 11:45:33 +00:00
|
|
|
|
if current_child:
|
|
|
|
|
# 先退出
|
|
|
|
|
_exit()
|
|
|
|
|
if packed_scene:
|
|
|
|
|
SceneManager.freeze_player(0)
|
|
|
|
|
# 展示时,禁用 sign 的输入
|
|
|
|
|
sign.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 的输入
|
|
|
|
|
sign.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()
|