All skills
thedivergentai avatar

/godot-2d-animation

@9d6e91e

Expert patterns for 2D animation in Godot using AnimatedSprite2D and skeletal cutout rigs. Use when implementing sprite frame animations, procedural animation (squash/stretch), cutout bone hierarchies, or frame-perfect timing systems. Trigger keywords: AnimatedSprite2D, SpriteFrames, animation_finished, animation_looped, frame_changed, frame_progress, set_frame_and_progress, cutout animation, skeletal 2D, Bone2D, procedural animation, animation state machine, advance(0).

Use this Skill: https://skilld.dev/gh/thedivergentai/gd-agentic-skills/godot-2d-animation

This session only. Nothing lands on disk.

SKILL.md

β‰ˆ124 tokens always: the name and description. β‰ˆ3.5k when used: this file. β‰ˆ3.6k more on demand in 4 files.

NEVER Do

  • NEVER use AnimatedTexture β€” This class is deprecated, highly inefficient in modern renderers, and may be removed in future Godot versions. Use AnimatedSprite2D or AnimationPlayer instead.
  • NEVER allow Tweens to fight over the same property β€” If multiple Tweens animate the same property, the last one created forcibly takes priority. Always assign your Tween to a variable and call kill() on the previous instance before creating a new one.
  • NEVER process kinematic movement outside the physics tick β€” If your AnimationPlayer moves a CharacterBody2D, ensure the AnimationPlayer's callback mode is set to Physics. Animating physics bodies during the Idle (render) frame breaks fixed timestep physics interpolation and causes stutter.
  • NEVER use animation_finished for looping animations β€” The signal only fires on non-looping animations. Use animation_looped instead for loop detection.
  • NEVER call play() and expect instant state changes β€” AnimatedSprite2D applies play() on the next process frame. Call advance(0) immediately after play() if you need synchronous property updates (e.g., when changing animation + flip_h simultaneously).
  • NEVER set frame directly when preserving animation progress β€” Setting frame resets frame_progress to 0.0. Use set_frame_and_progress(frame, progress) to maintain smooth transitions when swapping animations mid-frame.
  • NEVER forget to cache @onready var anim_sprite β€” The node lookup getter is surprisingly slow in hot paths like _physics_process(). Always use @onready.
  • NEVER mix AnimationPlayer tracks with code-driven AnimatedSprite2D β€” Choose one animation authority per sprite. Mixing causes flickering and state conflicts.
  • NEVER use paper-thin skeletons for deformation β€” 2D meshes require balanced vertex density. If your mesh deforms poorly, increase the vertex count near joints in the Mesh2D editor.

Available Scripts

MANDATORY: Read the script for the pattern you are implementing. Inline recipes that duplicated these scripts were removed β€” the script is the source of truth.

Do NOT Load (by scenario)

Scenario Load Do NOT Load
Single character / player one_frame_sync_fix.gd, animation_state_sync.gd, optional animation_tree_step.gd / tween_lifecycle_manager.gd multimesh_swarm_anim.gd, gpu_mesh_optimizer.gd (unless fill-rate profiling demands it)
Frame events / hitboxes / SFX sync animation_sync.gd (+ AnimationPlayer method tracks) Swarm/MultiMesh scripts
Squash/stretch game-feel MANDATORY procedural_squash_stretch.gd Inline landing-condition snippets in this skill
Cutout / IK limbs skeleton_2d_rig_helper.gd MultiMesh swarm scripts
Shader flash / dissolve on anim shader_hook.gd β€”
Thousands of bats/fish/props multimesh_swarm_anim.gd (+ docs fish tutorial) Per-entity AnimatedSprite2D / Tween managers

Script index


Expert Decision Tree: Choosing the Right Animation Tool

Scenario Recommended Node Expert Insight
Isolated, pure frame-by-frame spritesheets AnimatedSprite2D Cannot animate non-visual properties or method tracks β€” escalate to AnimationPlayer when you need those.
Cutout animations, non-visual sync, audio/particles AnimationPlayer Owns transforms, mesh deformation, method/value tracks.
Complex state machines, blending, locomotion AnimationTree Logic graph over an AnimationPlayer; use travel() via animation_tree_step.gd.
Procedural, dynamic, fire-and-forget UI/fx Tween Runtime targets; always go through tween_lifecycle_manager.gd.
Swarms of thousands of entities MultiMeshInstance2D + Shader Load multimesh_swarm_anim.gd only; skip character sync scripts.

Golden Path: One-Frame Sync (play + advance(0))

When changing animation and sprite properties in the same frame, play() alone applies next process tick β€” one-frame glitch.

MANDATORY: Read one_frame_sync_fix.gd. Minimal contract:

# After any play() that must match flip/modulate/etc. this frame:
anim.flip_h = dir < 0
anim.play(&"run")
anim.advance(0)  # force pose now

Related: animation_looped (loops) vs animation_finished (one-shots); use set_frame_and_progress when swapping skins mid-clip (see AnimatedSprite2D class docs).


Procedural Squash & Stretch

Do NOT paste landing snippets into agents. A prior body used an impossible condition (not is_on_floor() and is_on_floor()).

MANDATORY sole source: procedural_squash_stretch.gd β€” impact squash, velocity stretch, lerp recovery. Pair with godot-characterbody-2d / godot-2d-physics for floor/velocity authority.


Quick routing (scripts own the recipes)

  • Tween interrupt / flash loops β†’ tween_lifecycle_manager.gd (never race two Tweens on one property).
  • AnimationTree travel β†’ animation_tree_step.gd (start then travel).
  • IK foot plant β†’ skeleton_2d_rig_helper.gd + SkeletonModification2DTwoBoneIK docs.
  • Fill-rate / swarms β†’ gpu_mesh_optimizer.gd / multimesh_swarm_anim.gd per Do-NOT-Load table.
  • Pixel filter / shared SpriteFrames β†’ Official Documentation (2D sprite animation, SpriteFrames); keep resources shared via preload.

Expert insights (WHY β€” keep in body)

  • Hybrid cutout + cel β€” Animate bones for body motion; keyframe frame/texture on child sprites for hand/face swaps. WHY: transform-only motion is cheap; cel swaps stay art-directable without re-rigging.
  • GPU fill rate β€” Large transparent sprites waste fill rate. WHY: tight MeshInstance2D polygons skip transparent texels; pair with gpu_mesh_optimizer.gd.
  • Tween property fights β€” WHY: the last Tween on a property wins silently. Always kill() the prior instance (tween_lifecycle_manager.gd).
  • AnimationTree travel β€” WHY: StateMachine uses internal A* between states; call start() before travel() (animation_tree_step.gd).

Deep recipes (on demand)

Topic Reference / script
Signals / frame events / skin swap signals-and-frame-events.md
Cutout rigs / procedural IK feet cutout-and-skeletal.md
GPU mesh / swarms / memory streaming expert-techniques.md
Frame metadata / spawn offsets animation_data_extractor.gd
Async SpriteFrames VRAM sprite_sheet_memory_manager.gd

Reference

Progressive disclosure: open Official Documentation links only when researching a specific API; load Related Skills when routing work to a peer domain β€” do not preload the whole lattice.

Official Documentation

  • 2D sprite animation β€” Canonical AnimatedSprite2D + SpriteFrames workflow for frame-based sheets and signal timing.
  • Introduction to the animation features β€” When to graduate from spritesheets to AnimationPlayer for tracks, methods, and non-visual properties.
  • Cutout animation β€” Paper-doll hierarchies and hybrid cutout/cel setups before full skeletal IK.
  • 2D skeletons β€” Skeleton2D / Bone2D rigging, rest poses, and deformation expectations for cutout meshes.
  • Using AnimationTree β€” Blend spaces and state-machine graphs that drive an underlying AnimationPlayer.
  • Animation track types β€” Method/value/property tracks for frame-perfect SFX, hitboxes, and shader uniform hooks.
  • AnimatedSprite2D β€” play(), advance(), set_frame_and_progress(), and animation_looped vs animation_finished contracts.
  • SpriteFrames β€” Shared frame resources, loop flags, and per-animation timing used by AnimatedSprite2D.
  • Tween β€” Runtime squash/stretch and interruptible one-shot motion without baking AnimationPlayer clips.
  • Animating thousands of fish β€” GPU vertex / MultiMesh patterns for swarm motion that must leave the node tree.
  • SkeletonModification2DTwoBoneIK β€” Lightweight two-bone IK for procedural foot/hand planting on Skeleton2D stacks.

Related Skills

Prerequisites
  • godot-animation-player β€” AnimationPlayer ownership, callback modes, and track authoring that this skill’s hybrid/cutout patterns assume.
  • godot-characterbody-2d β€” Physics-tick movement so animated CharacterBody2D motion stays on the fixed timestep.
  • godot-signal-architecture β€” Safe wiring for animation_finished / animation_looped / frame_changed without lifecycle leaks.
Complements
  • godot-animation-tree-mastery β€” Deepen blend trees, OneShot layers, and travel() pathfinding beyond the 2D locomotion basics here.
  • godot-tweening β€” Broader Tween composition when squash/stretch or UI pops outgrow inline create_tween() snippets.
  • godot-shaders-basics β€” CanvasItem shader uniforms driven by AnimationPlayer tracks or MultiMesh swarm materials.
  • godot-2d-physics β€” Impact velocity, raycasts for IK targets, and interpolation rules that feed procedural deformation.
  • godot-state-machine-advanced β€” Gameplay FSMs that should own intent while AnimationTree/AnimatedSprite2D own presentation.
  • godot-particles β€” Dust, hit sparks, and trails spawned from method tracks or frame events.
  • godot-adapt-3d-to-2d β€” Directional sheets, billboards, and fake-depth sorting that still use 2D animation nodes.
Downstream / consumers
  • godot-genre-platformer β€” Jump/land/run presentation stacks consume sync, squash/stretch, and state-machine travel patterns.
  • godot-genre-fighting β€” Frame-perfect hitboxes and method tracks depend on AnimationPlayer + AnimatedSprite2D discipline here.
  • godot-resource-data-patterns β€” Shared .tres SpriteFrames and skin packs for memory-safe multi-instance characters.
Master
  • godot-master β€” Library router and mirrored module entry for cross-skill discovery.

Source: SKILL.md on GitHub

1 warning16d4 checks Β· Risk SAFE
  • Gen Agent Trust Hub16d

    The skill provides comprehensive, production-grade templates and guidelines for handling 2D animation workflows in Godot 4.x. It covers critical concepts like managing frame synchronization glitches via `advance(0)`, implementing procedural squash and stretch, utilizing lightweight 2D IK stacks (`SkeletonModification2DTwoBoneIK`), optimizing fill rates with 2D meshes, managing high-resolution sprite sheet memory dynamically, and executing state transitions correctly. No security flags or risks were identified.

  • Socket16d

    No alerts

  • Snyk16d

    Risk: LOW Β· No issues

  • Runlayer7mo

    2/4 files flagged

Signed by skilld at 9d6e91e. This ties the file your Agent reads to that commit on GitHub. It does not review the instructions.

Last checked against GitHub 3 weeks ago.

Activeupdated 2 months ago

README badge

README badge for thedivergentai/gd-agentic-skills/godot-2d-animation