Help us improve
Share bugs, ideas, or general feedback.
From summer
Generates animated 2D sprite sheets (walk cycles, attack frames, idle, death) and wires them into AnimatedSprite2D/SpriteFrames. Offers per-frame img2img, single-call sheet generation, or manual authoring paths.
npx claudepluginhub summerengine/summer-engine-agent --plugin summerHow this skill is triggered — by the user, by Claude, or both
Slash command
/summer:sprite-sheetassets/**sprites/**art/sprites/**This skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
This skill produces a grid of animation frames for a 2D character — walk cycle, idle bob, attack swing, death sequence — and wires the result into an `AnimatedSprite2D` via a `SpriteFrames` resource.
Creates and manages pixel art sprite animations: adds, deletes, duplicates frames; sets durations; creates/deletes tags; links cels using Aseprite tools.
Generates true pixel art sprites, tilesets, and animations via the Retro Diffusion API. Useful for quick 2D game prototyping and replacing placeholder art with cohesive pixel art.
Generates pixel art sprites, animations, sprite sheets, and converts images to pixel art using 30+ palettes, dithering algorithms, and automated quality scoring for retro/indie game art.
Share bugs, ideas, or general feedback.
This skill produces a grid of animation frames for a 2D character — walk cycle, idle bob, attack swing, death sequence — and wires the result into an AnimatedSprite2D via a SpriteFrames resource.
Up-front honesty: sprite-sheet generation from a single text-to-image call is unreliable. Models can render "a sprite sheet of a knight walking" and produce 8 frames, but the inter-frame consistency (same anatomy, same costume, same lighting) is poor. Limbs morph between frames. Pixel sprites get extra fingers in frame 3. The result usually looks worse than the static sprite did.
This skill therefore offers three paths, ranked by reliability:
referenceImageUrl with a small pose delta. Composite the frames into a sheet externally or wire each as a separate SpriteFrames entry.There is no dedicated sprite-sheet generation tool. Recommended path: per-frame summer_generate_image with referenceImageUrl (img2img) at consistent angle/lighting, OR external tools (Aseprite/Piskel).
summer:animation/generate-motion for skeletal animation.summer:2d-assets/pixel-art or summer:2d-assets/character-portrait.AnimationPlayer rotating/tweening a static texture instead. Don't sprite-sheet UI.You need a stable reference. Either:
res://sprites/goblin.png) — use it as referenceImageUrl.summer:2d-assets/pixel-art or summer:2d-assets/character-portrait first, then return here.Without a base, every frame drifts.
Ask the user (or decide based on context):
| Signal | Path |
|---|---|
| Short cycle (≤4 frames), willing to accept some drift | Try single-call sheet first; fall back if bad |
| Pixel art at small resolution | Aseprite manual is often fastest |
| Higher-res character (128px+), 6-12 frames | Per-frame img2img |
| User wants exact-pixel consistency | Aseprite manual — AI cannot deliver exact pixels |
State the path before starting: "I'll do per-frame img2img — 6 generations, ~$0.12. The first frame is the base; each next frame uses the previous as reference. OK?"
Generate frame 1 (or use existing base). For each subsequent frame, prompt the pose delta and pass the previous frame as referenceImageUrl:
summer_generate_image(
prompt="goblin warrior, walk cycle frame 2 of 6, right leg forward, slight bob upward, identical character, same costume, same palette, transparent background",
referenceImageUrl="<frame 1 fileUrl>",
model="nano-banana-2",
style="<same as base>",
options={ image_size: "square_hd", negative_prompt: "different character, different costume, scene background" }
)
Repeat for each frame. Save each as goblin_walk_01.png, goblin_walk_02.png, etc.
After all frames return, either:
SpriteFrames resource (Godot will treat them as a sequence — no need to composite into a single sheet image).File → Import Sprite Sheet) or ImageMagick (montage frame_*.png -tile 6x1 -geometry +0+0 sheet.png).summer_generate_image(
prompt="goblin warrior walk cycle, sprite sheet, 6 frames in a horizontal row, identical character across frames, side view, transparent background, frames clearly separated, consistent lighting, consistent palette",
model="nano-banana-2",
style="pixel",
options={ image_size: "landscape_16_9", negative_prompt: "different character per frame, scene background, varying lighting" }
)
Inspect the result. If frames are coherent and the count matches, proceed. If anatomy morphs or count is wrong, fall back to Path 1 or Path 3.
Tell the user:
AI sprite-sheet generation is unreliable — best path for clean pixel animation is to hand-author in Aseprite (or Piskel for free in-browser). Onion-skin frame-by-frame; ~10 minutes for a 4-frame walk cycle. Want me to generate a base reference image you can trace?
If yes, generate the static base via summer:2d-assets/pixel-art and stop here. The user takes it to Aseprite.
For per-frame import (Path 1):
summer_import_from_url(url="<frame 1>", path="res://sprites/goblin/walk_01.png")
summer_import_from_url(url="<frame 2>", path="res://sprites/goblin/walk_02.png")
...
For a composited sheet (Path 2 or external composite):
summer_import_from_url(url="<sheet>", path="res://sprites/goblin/walk_sheet.png")
Set Filter: Nearest on import for pixel art, Linear for high-res.
summer_add_node(parentPath="/root/Game/Goblin", type="AnimatedSprite2D", name="Sprite")
Create a SpriteFrames resource and add an animation named walk. For per-frame textures:
summer_set_resource_property(
nodePath="/root/Game/Goblin/Sprite",
resourceProperty="sprite_frames:animations/walk/frames",
value=["res://sprites/goblin/walk_01.png", "res://sprites/goblin/walk_02.png", ...]
)
summer_set_resource_property(
nodePath="/root/Game/Goblin/Sprite",
resourceProperty="sprite_frames:animations/walk/speed",
value=8.0
)
summer_set_resource_property(
nodePath="/root/Game/Goblin/Sprite",
resourceProperty="sprite_frames:animations/walk/loop",
value=true
)
For sheet-based (Path 2): use AtlasTexture with one region per frame, then add each AtlasTexture as a frame.
@onready var sprite: AnimatedSprite2D = $Sprite
func _physics_process(delta):
if velocity.length() > 0.1:
sprite.play("walk")
else:
sprite.play("idle")
| Goal | Frame 1 (base) | Frame N prompt skeleton (with referenceImageUrl: <frame N-1>) |
|---|---|---|
| Walk cycle (6 frames, side view) | <character>, side view, idle stance, transparent bg | <character>, walk cycle frame N of 6, <leg position description>, identical character, same costume, transparent bg |
| Attack swing (4 frames) | <character>, side view, weapon raised over head | <character>, attack frame N, <weapon position: descending / impact / recovery>, identical character, transparent bg |
| Idle bob (2 frames, loop) | <character>, neutral stance, slightly compressed | <character>, idle bob upper position, slightly extended upward, identical character, transparent bg |
| Death (6 frames) | <character>, hit react, leaning back | <character>, death frame N, <position: stumbling / kneeling / falling / collapsed>, identical character, transparent bg |
| Jump (3 frames) | <character>, crouched ready to jump | <character>, jump frame N, <apex extended / falling tucked / land impact>, identical character, transparent bg |
| Goal | Prompt that sometimes works |
|---|---|
| 4-frame walk cycle | <character> walk cycle, sprite sheet, 4 frames in horizontal row, side view, identical character, transparent background, clear frame separation, consistent lighting |
| 2-frame idle | <character> idle bob, sprite sheet, 2 frames horizontal, identical character, slight up-down delta, transparent background |
| Bad | Failure mode |
|---|---|
goblin walking | Returns one image of a walking goblin. Not a sheet, not multiple frames. |
12-frame walk cycle in one image | Frame count too high for single-call. Anatomy morphs across the row. |
walk cycle for any character | No character anchor. Frames have different characters. |
Per-frame without referenceImageUrl | Each frame is a different goblin. |
sprite sheet, photorealistic | Photoreal characters in tight frames lose identity coherence fast. Stay stylized. |
AnimationPlayer to tween a static texture instead. Sprite sheets are for character animation specifically.AnimationPlayer-tweened layer (Sprite2D for the cape, sin-wave-tweened rotation).Print the per-frame call sequence:
Frame 1: summer_generate_image(prompt="<base>", model="nano-banana-2", style="pixel", ...)
Frame 2: summer_generate_image(prompt="<base + delta>", referenceImageUrl="<frame 1>", ...)
Frame 3: summer_generate_image(prompt="<base + delta>", referenceImageUrl="<frame 2>", ...)
...
Tell the user to run via the Summer dashboard. Or recommend Aseprite (paid, $20) / Piskel (free in-browser) for hand-authoring — for pixel art under 64×64, it is the faster path even with MCP available.
After the animation is wired:
summer:audio/sound-effect, then wire via Call Method Track in AnimationPlayer.summer:2d-assets/pixel-art first.summer:animation/generate-motion.summer:2d-assets/pixel-art — base sprite generation.summer:2d-assets/character-portrait — base portrait for higher-res characters.summer:animation/generate-motion — 3D-skeletal counterpart.summer:audio/sound-effect — frame-synced SFX.references/mcp-tools-reference.md — summer_generate_image schema.