2025-06-16 03:15:57 +00:00
|
|
|
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
|
|
|
|
|
2025-06-17 09:10:48 +00:00
|
|
|
var show_childhood := false
|
2025-06-16 03:15:57 +00:00
|
|
|
func _ready() -> void:
|
2025-06-17 09:10:48 +00:00
|
|
|
# 第三章设置为启用 c03_meta_enabled
|
|
|
|
show_childhood = ArchiveManager.get_global_value("c03_meta_enabled", false)
|
2025-06-16 03:15:57 +00:00
|
|
|
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)
|
|
|
|
# 幼年 -> 成年
|
2025-06-17 09:10:48 +00:00
|
|
|
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
|
2025-06-16 03:15:57 +00:00
|
|
|
_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)
|
2025-06-17 09:10:48 +00:00
|
|
|
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)
|
2025-06-16 03:15:57 +00:00
|
|
|
ripple_tween.tween_property(shader.material, "shader_parameter/amplitude", 0.0, 2.0)
|
2025-06-17 09:10:48 +00:00
|
|
|
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)
|
2025-06-16 03:15:57 +00:00
|
|
|
return true
|
|
|
|
return false
|