xiandie/scene/ground/script/c02/水盆特写.gd

69 lines
2.2 KiB
GDScript

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
func _ready() -> void:
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)
# 幼年 -> 成年
var tween = create_tween() as Tween
tween.tween_interval(1.5)
tween.tween_property(child_sprite, "modulate:a", 0.0, 0.5)
_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)
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)
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