xiandie/scene/little_game/书架/陆小蝶名字.gd

105 lines
3.3 KiB
GDScript3
Raw Normal View History

2025-02-07 01:56:12 +00:00
@tool
extends Sprite2D
signal finished
2025-03-17 14:12:53 +00:00
@export_tool_button("Reset Stamps", "Callable") var reset_action := _debug_reset_stamps
2025-02-07 01:56:12 +00:00
func play() -> void:
visible = true
var tween = create_tween()
tween.tween_interval(2.0)
2025-03-17 14:12:53 +00:00
# var final_modulate = Color.PALE_VIOLET_RED
2025-02-07 12:52:15 +00:00
tween.tween_property(self, "self_modulate:a", 0.0, 4.0)
2025-03-17 14:12:53 +00:00
# tween.parallel().tween_property(get_parent(), "modulate", final_modulate, 12.0)
2025-02-07 01:56:12 +00:00
tween = create_tween()
# 在小蝶名字消失的末尾(还没完全消失),开始盖章
tween.tween_interval(4.5)
2025-02-07 12:52:15 +00:00
# 小蝶名字消失后再显示其他名字
var interval = 1.0
2025-03-18 15:14:57 +00:00
# var interval = 0.1 # 很快,测试用
var children = $seals.get_children()
# 前四个按顺序,后面的乱序
var part1 = children.slice(0, 4)
var part2 = children.slice(4, children.size())
part2.shuffle()
for c in part1:
2025-02-07 01:56:12 +00:00
c.visible = false
2025-02-07 12:52:15 +00:00
tween.tween_interval(interval)
tween.tween_callback(_stamp_seal.bind(c))
for c in part2:
c.visible = false
tween.tween_interval(interval)
tween.tween_callback(_stamp_seal.bind(c))
interval = lerpf(interval, 0.15, 0.35)
# 最后一个印章消失后,稍加等待,发射完成信号
2025-03-17 14:12:53 +00:00
tween.tween_callback(_final_effect)
tween.tween_interval(4.5)
2025-03-17 14:12:53 +00:00
tween.tween_callback(_jump_scare)
tween.tween_interval(1.0)
tween.tween_callback(finished.emit)
2025-02-07 01:56:12 +00:00
2025-03-17 14:12:53 +00:00
# 共 6 画 28 个印章,+前 4 个独立布置,共至少 32 seals
var points_per_stroke = [5, 3, 6, 4, 7, 3]
func _debug_reset_stamps():
print("Reset Stamps")
var paths_root = $PathRoot
var stroke_id = 0
var stamp_id = 5 # 从 5 开始1-4 手动布置
for p in paths_root.get_children():
if p is Path2D:
var p_follow = p.get_node("PathFollow2D") as PathFollow2D
var stroke_points = points_per_stroke[stroke_id]
for i in range(stroke_points):
var stamp = get_node("seals/seal%d" % stamp_id) as Sprite2D
stamp_id += 1
p_follow.progress_ratio = float(i) / float(stroke_points)
stamp.global_position = p_follow.global_position
stamp.rotation = p_follow.rotation + PI / 2.0
stroke_id += 1
func _final_effect():
# TODO 渐进的铃铛声
SceneManager.pop_debug_dialog_info("音效", "渐进的铃铛声")
func _jump_scare():
2025-03-18 15:14:57 +00:00
# 毛玻璃模糊 / 熔蜡扭曲
# var e_materaial = $"../effect".material
# tween.tween_property(e_materaial, "shader_parameter/intensity", 0.05, 1.0)
# tween.tween_property(e_materaial, "shader_parameter/tint_amount", 0.4, 1.0)
# # 屏幕四周闪红jump scare屏幕抖动效果
# var shading_layer = SceneManager.get_shading_layer()
# shading_layer.flash_palette()
# shading_layer.flash_glitch()
# 闪烁
$AnimationPlayer.play("flash")
2025-03-18 15:14:57 +00:00
2025-03-17 14:12:53 +00:00
# TODO 哈气
SceneManager.pop_debug_dialog_info("音效", "突然哈气")
$"SfxScare".play()
2025-03-17 14:12:53 +00:00
2025-02-07 01:56:12 +00:00
func _stamp_seal(seal: Sprite2D) -> void:
# rand self_modulate
seal.self_modulate = Color(randf_range(.8, 1.), randf_range(.8, 1.), randf_range(.8, 1.), 1.)
2025-03-17 14:12:53 +00:00
# # rand rotation
# seal.rotation = randf_range(-1., 1.)
# # rand position within area
# seal.position = Vector2(
# randf_range(-area_size.x * 0.5, area_size.x * 0.5),
# randf_range(-area_size.y * 0.5, area_size.y * 0.5)
# )
2025-02-07 01:56:12 +00:00
# stamp
$"SfxStamp".play()
2025-02-07 01:56:12 +00:00
# show
seal.visible = true
var origin_scale = seal.scale
create_tween().tween_property(seal, "scale", origin_scale * Vector2(1.05, 1.05), .1)
2025-02-07 12:52:15 +00:00
create_tween().tween_property(seal, "scale", origin_scale * Vector2(1.0, 1.), .1)