98 lines
2.9 KiB
GDScript
98 lines
2.9 KiB
GDScript
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:
|
|
# 1s 内锁定交互,留给镜头复位时间
|
|
if Time.get_ticks_msec() - inspected_time < 1500:
|
|
return
|
|
if status == STATUS_NORAML:
|
|
sfx.play()
|
|
inspected_time = Time.get_ticks_msec()
|
|
SceneManager.focus_node(self)
|
|
CameraFocusMarker.tween_zoom(2.0, 1.5)
|
|
status = STATUS_INSPECTING_COVER
|
|
sign_mark.show_sign = false
|
|
SceneManager.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.kill()
|
|
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
|