53 lines
1.1 KiB
GDScript
53 lines
1.1 KiB
GDScript
extends Sprite2D
|
|
|
|
# @export var title := ""
|
|
@export var notes := [] as Array[String]
|
|
@export var dialogs := [] as Array[String]
|
|
|
|
@onready var sign_mark = %Sign as Sprite2D
|
|
@onready var area2d = %Area2D as Area2D
|
|
|
|
var played_time = 0
|
|
|
|
var mutex = Mutex.new()
|
|
|
|
|
|
func _ready() -> void:
|
|
area2d.body_entered.connect(_reset)
|
|
area2d.body_exited.connect(_on_cancel)
|
|
sign_mark.interacted.connect(_on_interacted)
|
|
sign_mark.cancel.connect(_on_cancel)
|
|
|
|
|
|
func _on_interacted() -> void:
|
|
if notes.is_empty():
|
|
return
|
|
var note_time = notes.size() * 2.0
|
|
# 0.5s 内锁定播放
|
|
mutex.lock()
|
|
if Time.get_ticks_msec() - played_time < note_time * 1000 + 500:
|
|
mutex.unlock()
|
|
return
|
|
# show note
|
|
played_time = Time.get_ticks_msec()
|
|
mutex.unlock()
|
|
%Sfx.play()
|
|
SceneManager.focus_node(self)
|
|
CameraFocusMarker.tween_zoom(1.2, 1.5)
|
|
for note in notes:
|
|
SceneManager.pop_note(note, "white", 2.0)
|
|
var player = SceneManager.get_player()
|
|
# TODO note viewing animation
|
|
player.freeze_player(note_time, "")
|
|
get_tree().create_timer(note_time - 0.5).timeout.connect(
|
|
SceneManager.focus_player_and_reset_zoom
|
|
)
|
|
|
|
|
|
func _on_cancel(_body = null):
|
|
pass
|
|
|
|
|
|
func _reset(_body):
|
|
pass
|