xiandie/scene/ground/scene/c01/s05_animation.gd

136 lines
3.8 KiB
GDScript3
Raw Normal View History

@tool
extends AnimationRoot
var ambush: Ambush2D
var frame: Note2D
var paper: Interactable2D
var right_door: Portal2D
2025-01-21 10:52:36 +00:00
var piano: Interactable2D
2025-01-31 10:44:30 +00:00
var bed_reading: AnimatedSprite2D
# 覆盖该方法
func _default_data() -> Dictionary:
return {
"frame_relocated": false
}
func _ready() -> void:
super._ready()
oneshot_animation_finished.connect(show_interact_help)
func play_intro_dialogue():
# 播放开场对话
DialogueManager.show_dialogue_balloon(dialogue_c01, "c01_s05_院长房间_开场")
2025-01-22 13:13:18 +00:00
func _on_ground_ready() -> void:
ambush = $"../DeployLayer/ambush鸡毛掸子"
frame = $"../DeployLayer/画框"
paper = $"../DeployLayer/oneshot纸片"
right_door = $"../DeployLayer/portal_right"
2025-01-21 10:52:36 +00:00
piano = $"../DeployLayer/钢琴"
2025-01-31 10:44:30 +00:00
bed_reading = $"../DeployLayer/小小蝶看书"
bed_reading.frame_changed.connect(_on_bed_reading_frame_changed)
2025-01-21 10:52:36 +00:00
# 画框是否已经正位
data.frame_relocated = ambush.played and ambush.one_shot
2025-01-21 10:52:36 +00:00
# 禁用鸡毛掸子
ambush.enabled = false
2025-01-21 10:52:36 +00:00
# 画框已经正位时,重制画框状态
if data.frame_relocated:
frame.rotation_degrees = 0.0
frame.note_key = "c01_摆正的洋相片"
if GlobalConfig.DEBUG:
print("重置画框位置")
else:
2025-01-21 10:52:36 +00:00
# 画框未正位时,首先允许互动相框
frame.read_note.connect(_on_note_read, CONNECT_ONE_SHOT)
ambush.triggered.connect(_on_ambush_triggered)
2025-01-21 10:52:36 +00:00
# 纸片状态
if data.frame_relocated:
2025-01-21 10:52:36 +00:00
# 画框已经正位,纸片已经被拾取
if paper.interacted_times > 0:
paper.visible = false
paper.enabled = false
right_door.enabled = true
else:
# 画框已经正位,纸片未被拾取,直接掉落
paper.visible = true
paper.enabled = true
paper.interacted.connect(_on_paper_interacted, CONNECT_ONE_SHOT)
else:
2025-01-21 10:52:36 +00:00
# 画框未正位,纸片未掉落
paper.visible = false
2025-01-21 10:52:36 +00:00
paper.enabled = false
paper.interacted.connect(_on_paper_interacted, CONNECT_ONE_SHOT)
2025-01-21 10:52:36 +00:00
piano.interacted.connect(_on_piano_interacted)
2025-01-31 10:44:30 +00:00
func _on_bed_reading_frame_changed():
if bed_reading.animation == "c01_小小蝶_床上看书" and bed_reading.frame == 10:
# 播放结束0.5s 后释放角色
get_tree().create_timer(0.5).timeout.connect(SceneManager.release_player)
func _on_note_read():
frame.enabled = false
# 稍加延时后显示鸡毛掸子
get_tree().create_timer(1.0).timeout.connect(func(): ambush.enabled = true)
func _on_ambush_triggered():
ambush.enabled = false
frame.note_key = "c01_摆正的洋相片"
get_tree().create_timer(5.5).timeout.connect(func(): frame.enabled = true)
# 鸡毛掸子 4.5s,再等待 3s 后掉落纸片
get_tree().create_timer(8).timeout.connect(_play_paper_animation)
func _play_paper_animation():
# 播放纸片动画
paper.enabled = true
2025-01-21 10:52:36 +00:00
play("纸片飘落")
func _on_paper_interacted():
paper.visible = false
paper.enabled = false
SceneManager.enable_prop_item("prop_信碎片1")
right_door.enabled = true
SceneManager.pop_debug_dialog_info("音效", "开门声")
$"../sfx_door_open".play()
var inspector = SceneManager.get_inspector() as PropInspector
if inspector:
# 显示互动提示
inspector.quit_and_hidden.connect(
SceneManager.pop_center_notification.bind(tr("ui_press_b")), CONNECT_ONE_SHOT
)
2025-01-21 10:52:36 +00:00
# 钢琴音效,每次按下播放不同音符
# 最长间隔时间
var piano_time_epsilon := 2.0
# 钢琴音符最大编号
var piano_id_max := 10
var piano_last_played_time := 0.0
var piano_id := 0
2025-01-21 10:52:36 +00:00
func _on_piano_interacted():
# 播放音符
var now = Time.get_ticks_msec()
if now - piano_last_played_time < piano_time_epsilon * 1000:
piano_id = wrapi(piano_id + 1, 0, piano_id_max)
else:
piano_id = 0
piano_last_played_time = now
SceneManager.pop_debug_dialog_info("音效", "钢琴声: " + str(piano_id))
func show_interact_help():
2025-02-10 10:59:19 +00:00
pass
# 暂时无需使用背包系统
# SceneManager.pop_center_notification(tr("ui_press_e"))