extends Sprite2D # @export var entity_config: EntityConfig: # set(value): # entity_config = value enum { STATUS_NORAML, STATUS_INSPECTING_COVER, STATUS_INSPECTING_NOTES } @export var entity_name: String = "" @export var entity_title: String = "" @export var texture_cover: Texture2D @export_multiline var inspection_note: String = "" @onready var sprite2d = %AnimatedSoundSprite2D as AnimatedSoundSprite2D @onready var sign_mark = %Sign as Sprite2D @onready var area2d = %Area2D as Area2D @onready var sfx = %Sfx @onready var cover_sprite = %Cover as Sprite2D @onready var content_label = %ContentLabel as Label @onready var tip_label = %TipLabel as Label var tip_cover = "Q: 退出 E: 阅读" var tip_notes = "Q: 退出 E: 收起" var status := STATUS_NORAML var blinking_tween: Tween var inspected_time = 0.0 func _ready() -> void: sign_mark.interacted.connect(_on_interacted) sign_mark.cancel.connect(_on_cancel) content_label.text = inspection_note content_label.modulate.a = 0.0 tip_label.text = tip_cover tip_label.modulate.a = 0.0 cover_sprite.modulate.a = 0.0 cover_sprite.texture = texture_cover func _on_interacted() -> void: # 1.5s 内锁定交互,留给镜头复位时间 if Time.get_ticks_msec() - inspected_time < 1500: return if status == STATUS_NORAML: sfx.play() SceneManager.focus_node(self) CameraFocusMarker.tween_zoom(2.0, 1.5) status = STATUS_INSPECTING_COVER sign_mark.show_sign = false var player = SceneManager.get_player() if player: player.freeze_player(0) tip_label.text = tip_cover _blink_label(true) elif status == STATUS_INSPECTING_COVER: sfx.play() status = STATUS_INSPECTING_NOTES tip_label.text = tip_notes create_tween().tween_property(content_label, "modulate:a", 1.0, 0.2) create_tween().tween_property(cover_sprite, "modulate:a", 1.0, 0.15) elif status == STATUS_INSPECTING_NOTES: sfx.play() status = STATUS_INSPECTING_COVER tip_label.text = tip_cover create_tween().tween_property(content_label, "modulate:a", 0.0, 0.15) create_tween().tween_property(cover_sprite, "modulate:a", 0.0, 0.2) func _blink_label(init := true): if status == STATUS_NORAML: return blinking_tween = create_tween() if init: blinking_tween.tween_property(tip_label, "modulate:a", 0.8, 2.0) blinking_tween.tween_callback(_blink_label.bind(false)) else: blinking_tween.tween_property(tip_label, "modulate:a", 0.5, 1.0) blinking_tween.tween_callback(_blink_label.bind(true)) func _on_cancel(_body = null): inspected_time = Time.get_ticks_msec() status = STATUS_NORAML cover_sprite.modulate.a = 0.0 var tween = create_tween() tween.tween_property(content_label, "modulate:a", 0.0, 0.15) if blinking_tween and blinking_tween.is_running(): blinking_tween.stop() tween.parallel().tween_property(tip_label, "modulate:a", 0.0, 0.15) SceneManager.focus_player_and_reset_zoom(1.0) var player = SceneManager.get_player() if player: player.release_player() sign_mark.show_sign = true