xiandie/scene/little_game/书架/陆小蝶名字.gd
2025-03-18 23:14:57 +08:00

133 lines
4.1 KiB
GDScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

@tool
extends Sprite2D
signal finished
@export var area_size := Vector2(60, 60):
set(val):
area_size = val
queue_redraw()
@export var gizmo_outline_color := Color(0.8, 0.3, 0.1, 0.8):
set(val):
gizmo_outline_color = val
queue_redraw()
@export_tool_button("Reset Stamps", "Callable") var reset_action := _debug_reset_stamps
func play() -> void:
visible = true
var tween = create_tween()
tween.tween_interval(3.0)
# var final_modulate = Color.PALE_VIOLET_RED
tween.tween_property(self, "self_modulate:a", 0.0, 4.0)
# tween.parallel().tween_property(get_parent(), "modulate", final_modulate, 12.0)
tween = create_tween()
tween.tween_interval(7.0)
# 小蝶名字消失后再显示其他名字
var interval = 2.0
# 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:
c.visible = false
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.2, 0.35)
# 最后一个印章消失后,稍加等待,发射完成信号
tween.tween_callback(_final_effect)
tween.tween_interval(4.5)
tween.tween_callback(_jump_scare)
tween.tween_interval(1.5)
tween.tween_callback(finished.emit)
# 共 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():
var tween = create_tween()
# 毛玻璃模糊 / 熔蜡扭曲
# 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()
var l1 = $DirectionalLight2D
var l2 = $DirectionalLight2D2
var polygon = $"../../Polygon2D"
tween.tween_property(l1, "energy", 1.0, 0.2)
tween.parallel().tween_property(l2, "energy", 2.0, 0.2)
tween.parallel().tween_property(polygon, "color:a", 0.5, 0.1)
tween.tween_property(l1, "energy", 0.0, 0.2)
tween.parallel().tween_property(l2, "energy", 0.0, 0.2)
tween.parallel().tween_property(polygon, "color:a", 0.0, 0.2)
# TODO 哈气
SceneManager.pop_debug_dialog_info("音效", "突然哈气")
$"SfxScare".play()
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.)
# # 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)
# )
# stamp
$"SfxStamp".play()
# show
seal.visible = true
var origin_scale = seal.scale
create_tween().tween_property(seal, "scale", origin_scale * Vector2(1.05, 1.05), .1)
create_tween().tween_property(seal, "scale", origin_scale * Vector2(1.0, 1.), .1)
func _draw() -> void:
if Engine.is_editor_hint():
# draw gizmo
var area_rect = Rect2(-area_size * 0.5, area_size)
# fill
var fill_color = gizmo_outline_color
fill_color.a = 0.4
draw_rect(area_rect, fill_color)
# outline
draw_rect(area_rect, gizmo_outline_color, false, 1.0)