@tool extends Sprite2D signal finished @export_tool_button("Reset Stamps", "Callable") var reset_action := _debug_reset_stamps func play() -> void: visible = true var tween = create_tween() tween.tween_interval(2.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(4.5) # 小蝶名字消失后再显示其他名字 var interval = 1.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.15, 0.35) # 最后一个印章消失后,稍加等待,发射完成信号 tween.tween_callback(_final_effect) tween.tween_interval(4.5) tween.tween_callback(_jump_scare) tween.tween_interval(1.0) 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 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") # 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)