I built a small set of registered top-down water-interaction animations and used the free Shallow Step sprite to make a reusable one-shot AnimatedSprite2D scene in Godot 4.
The sheet contains 16 centered frames in a 4x4 layout. Set the animation to 16 FPS, disable looping, and attach:
extends AnimatedSprite2D
func _ready() -> void:
play("shallow_step")
await animation_finished
queue_free()Save that as a small VFX scene and spawn it wherever a foot, projectile, or object touches shallow water:
const SHALLOW_STEP_VFX := preload(
"res://vfx/water/shallow_step_vfx.tscn"
)
func spawn_water_step(at: Vector2) -> void:
var fx := SHALLOW_STEP_VFX.instantiate()
get_tree().current_scene.add_child(fx)
fx.global_position = atBecause every frame shares the same registered center, the splash stays fixed on the contact point without per-frame offset work. The same approach works for ripples, wakes, bobber bites, rain splashes, and projectile impacts.
The free starter contains Calm Ripple, Shallow Step, and Bobber Bite in 64x64 and 128x128 sizes, with clear-blue and tintable-white variants:
https://rio1222.itch.io/top-down-water-interaction-vfx
The full pack adds 12 water interactions, three palettes, numbered PNG sequences, 4x4 sheets, GIF previews, and a JSON manifest.
AI assistance disclosure: the concept, build code, documentation, and this post were prepared with Codex assistance and reviewed before publication. The graphics are original deterministic procedural drawings; no third-party or model-generated source images were used.

