extends CanvasLayer signal exit(success: bool) @onready var ripple = $"水波" as Sprite2D @onready var shader = $"水波Shader" as ColorRect @onready var timer = $RippleTimer as Timer @onready var child_sprite = $"人像幼年" @onready var grownup_sprite = $"人像成年" var image: Image var show_childhood := false func _ready() -> void: # 第三章设置为启用 c03_meta_enabled show_childhood = ArchiveManager.get_global_value("c03_meta_enabled", false) layer = GlobalConfig.CANVAS_LAYER_LITTLE_GAME image = ripple.texture.get_image() shader.gui_input.connect(_shader_input) timer.timeout.connect(_try_ripple) shader.material.set("shader_parameter/amplitude", 0.0) # 幼年 -> 成年 if show_childhood: var tween = create_tween() as Tween tween.tween_interval(1.5) tween.tween_property(child_sprite, "modulate:a", 0.0, 0.5) else: child_sprite.modulate.a = 0 await get_tree().create_timer(1.5).timeout _try_ripple() func _try_ripple(): if ripple_tween and ripple_tween.is_valid(): return # 先尝试 mouse 位置 var mouse_pos = shader.get_global_mouse_position() if not _make_ripple(mouse_pos): var rand_pos = Vector2(randf_range(140, 425), randf_range(80, 250)) _make_ripple(rand_pos) var ripple_tween: Tween func _shader_input(event: InputEvent) -> void: if event.is_pressed(): var pos = ripple.get_global_mouse_position() _make_ripple(pos) func _make_ripple(pos:Vector2) -> bool: var p_pos = pos / ripple.scale.x var image_size = image.get_size() # return false if out of image if p_pos.x < 0 or p_pos.x > image_size.x or p_pos.y < 0 or p_pos.y > image_size.y: return false if image.get_pixelv(p_pos).a > 0: # setup shader_parameter/offset var m_offset = -Vector2(pos.x / 564 - 0.5, pos.y / 316 - 0.5) shader.material.set("shader_parameter/offset", m_offset) if GlobalConfig.DEBUG: print("水波特写 m_offset=", m_offset) if ripple_tween and ripple_tween.is_valid(): ripple_tween.kill() ripple_tween = create_tween() ripple_tween.tween_property(shader.material, "shader_parameter/amplitude", 2.0, 0.3) if show_childhood: ripple_tween.parallel().tween_property(child_sprite, "modulate:a", 1.0, 0.2) ripple_tween.parallel().tween_property(grownup_sprite, "modulate:a", 0.5, 0.2) ripple_tween.tween_property(shader.material, "shader_parameter/amplitude", 0.0, 2.0) if show_childhood: ripple_tween.parallel().tween_property(child_sprite, "modulate:a", 0.0, 1.0) ripple_tween.parallel().tween_property(grownup_sprite, "modulate:a", 1.0, 1.5) return true return false