74 lines
1.9 KiB
GDScript
74 lines
1.9 KiB
GDScript
@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()
|