gamedev-2d-art-animation-frames
Frame-by-frame animation for 2D games: typical frame counts (idle 2-4f / walk 6-8f / run 6-8f / attack 4-6f), squash/stretch limits in pixel art, looping cycles, sub-pixel motion problem, anticipation/impact/ recovery beats, sprite sheet layout (Aseprite tags, TexturePacker JSON, Unity Sprite Editor), frame timing easing. USE WHEN: animating sprites, choosing frame counts, debugging "stiff" or "floaty" motion, organizing sprite sheets. DO NOT USE FOR: skeletal 2D animation (Spine/DragonBones, Unity 2D Animation) - different rules. See `unity-2d-animation` skill.
What this skill does
# Animation Frames > **Quick refs**: [walk-cycle-keyframes.md](quick-ref/walk-cycle-keyframes.md), > [attack-anticipation.md](quick-ref/attack-anticipation.md) Frame-by-frame = drawing each frame. The pixel-art-classic technique. Different from skeletal where you transform parts of the rig — see `unity-2d-animation` for that. ## Frame count conventions ``` Animation Frames FPS Total time Notes Idle (subtle) 2 4 500ms Breathe, sway. Avoid 1f (static). Idle (active) 4-6 6-8 500-1000ms Tail wag, weapon shimmer. Walk 6-8 10-12 600-700ms Full gait cycle, must loop. Run 6-8 12-15 400-550ms Faster cadence than walk. Sprint 4-6 15-20 250-350ms Stretched legs, hair flow. Jump 3-5 ad-hoc 200-400ms Anticipation + release + air. Attack (light) 4-6 12-15 300-450ms Anticipation + impact + recovery. Attack (heavy) 6-10 8-12 600-1000ms More wind-up, slower recovery. Damage / hit 2-4 ad-hoc 100-200ms Brief, snappy. Death 4-8 8-10 500-1000ms One-shot, ends with last frame. ``` These are **rough**. Adjust to character feel: a heavy character has slower, more weighted animation; a kid has fewer, snappier frames. ## Cadence rules A walk cycle has **two contact frames** (foot lands) and **two passing frames** (foot crosses below body). Full cycle = 8 keyframes ideally, but reusable: cycle frames mirror legs left/right so 4 unique drawings + horizontal-mirror copies. ``` F1: contact (right foot forward) F2: down position (knees bent, body lowest) F3: passing (right foot under body, left ahead) F4: up position (body highest) F5: contact (left foot forward) - mirror of F1 F6: down position - mirror of F2 F7: passing - mirror of F3 F8: up position - mirror of F4 ``` For 6-frame walks, drop F2 and F6 (compresses the down-position phase). See [quick-ref/walk-cycle-keyframes.md](quick-ref/walk-cycle-keyframes.md) for the canonical sequence with arm + body bob notation. ## Anticipation, impact, recovery The 3-beat structure of any action animation: ### Anticipation (1-3 frames) Character prepares: pulls back, crouches, draws weapon. Tells the player "something's about to happen." Length scales with attack power. ### Impact (1 frame, sometimes 2) The actual hit. Single most important frame. Often paired with hitstop (game freezes for 1-3 frames) and visual flash. Pose is most extreme. ### Recovery (1-3 frames) Character returns to neutral. Eases back into idle. Vulnerable window in fighting games. Example light attack (5 frames): ``` F1: anticipation (sword raised) F2: anticipation (weight shift forward) F3: impact (sword extended, hit) ← hitstop trigger F4: recovery (sword past target) F5: recovery (returning to neutral) ``` See [quick-ref/attack-anticipation.md](quick-ref/attack-anticipation.md) for canonical anticipation poses. ## Squash and stretch (limits in pixel art) In animation principles, squash-and-stretch shows weight + flexibility. In pixel art, hard-pixel constraints limit how much you can deform: - **Subtle squash**: 1-2 pixel vertical compression on impact / landing. Always works. - **Heavy squash**: 4+ pixel compression. Looks cartoony, may break character silhouette. Reserved for comedic / cartoon styles. - **Stretch on jump**: 1-2 pixel vertical extension. Natural for athletic characters. Avoid sub-pixel deformation (looks blurry). Use whole-pixel deform. ## Looping cycles A loop must be **seamless**: last frame must transition naturally to first frame. Test: play frames F1-F8-F1-F8 manually in Aseprite (with onion skin) — the F8 → F1 transition should feel as natural as F4 → F5. Common bug: F8 designed as "end pose" instead of "predecessor of F1" — loop hitches. ## Easing in frame timing Frame timing controls the FEEL. Two approaches: ### Constant FPS Every frame = same duration. Mechanical. OK for idle / walk. ### Eased timing (variable per frame) Hold key poses longer, brisk through transitions. More expressive. Example heavy attack with variable durations: ``` F1: 100ms (slow anticipation start) F2: 80ms (committing) F3: 250ms (HOLD on impact - emphasizes power) F4: 60ms (snap to recovery) F5: 150ms (settle) ``` Aseprite supports per-frame duration. Unity Animator supports curves on sprite-swap. Engine support varies. ## Sub-pixel motion problem A sprite at world position (10.3, 5.7) renders at integer pixel (10, 6) on screen — but if the camera moves at 0.1 px/frame, the sprite might shimmer between (10, 5) and (10, 6) frame-to-frame. Looks broken. **Solutions**: 1. **Snap world positions to integer pixel** before rendering. Most "pixel-perfect cameras" do this. 2. **Use a higher render resolution** for pixel-perfect, render to a smaller texture, blit. Allows sub-pixel motion at the cost of half-pixel sprite locations (still cleaner than shimmer). 3. **Lock camera to integer movement** (camera teleports 1 px at a time). Modern indie pixel art generally accepts sub-pixel but uses approach #2 for camera + sprite anchoring. ## Sprite sheet layouts ### Aseprite tags + export Each animation = one tag. Export as sprite sheet with: - **Frame format**: rows or columns, padding. - **JSON sidecar**: tag names, frame durations, slice metadata. Unity Aseprite Importer reads the JSON natively and creates an animation clip per tag. ### TexturePacker Standard tool for atlasing sprite sheets: - **Trim** transparent borders (saves space). - **Pad** between sprites (avoids bleeding). - **Rotate** sprites for tighter packing. - Outputs JSON / XML / engine-specific (Unity, Godot, Phaser, Solar2D). ### Manual grid layout Rows = animations, columns = frames. Easy to read. Wastes space if animations have varying frame counts. Best for small projects. ### Atlas vs per-frame textures - Atlas: one large texture, source rects per frame. Fewer draw calls, more cache-friendly, standard. - Per-frame: separate texture per sprite. Easier debugging, larger memory footprint, OK in development. Modern engines all use atlasing under the hood; you author per-sprite and the import pipeline atlases. ## Common bugs - **Stiff walk** = too few frames OR identical pose mirrored without weight shift. - **Floaty jump** = no anticipation, no apex pause, no impact frame. - **Loop hitch** = last frame doesn't transition to first. - **Inconsistent contact frames**: foot at different position frame 1 vs frame 5 (cycle drift). Onion skin to verify. - **Sub-pixel shimmer**: camera or sprite at fractional pixel. - **Drift** in cycle (sprite moves a few pixels each loop): root motion baked into sprite. Solution: anchor cycle around fixed point; movement comes from gameplay code, not animation. - **Animation longer than gameplay window**: 6-frame attack at 60ms each = 360ms; if attack should be 200ms, cut to 4 frames or speed timing. ## See also - [pixel-art-fundamentals/SKILL.md](../pixel-art-fundamentals/SKILL.md) - [character-design/SKILL.md](../character-design/SKILL.md) — what poses to animate - [tools/SKILL.md](../tools/SKILL.md) — Aseprite tags, TexturePacker - Engine: `unity-2d-animation` (skeletal + frame-by-frame in Unity)
Related in General
modeling-omnistudio-epc-catalog
IncludedSalesforce Industries CME EPC product-modeling skill for Product2-based catalog creation. Use when creating EPC products, configuring product attributes, building offer bundles with Product Child Items, or reviewing EPC DataPack JSON metadata for product catalog changes. TRIGGER when: user creates or updates Product2 EPC records, AttributeAssignment payloads, AttributeMetadata/AttributeDefaultValues, Offer bundles, or ProductChildItem relationships. DO NOT TRIGGER when: designing OmniScripts/FlexCards/Integration Procedures (use building-omnistudio-omniscript, building-omnistudio-flexcard, or building-omnistudio-integration-procedure), implementing Apex business logic (use generating-apex), or troubleshooting deployment pipelines (use deploying-metadata).
relationship-science-coach
IncludedUse this skill for direct, practical adult relationship coaching: couples conflict, repair, trust, marriage, dating, flirting, attachment patterns, emotional connection, sex, desire differences, eroticism, kink negotiation, affection, love languages, breakups, and long-term passion. Draw on Gottman, EFT and Hold Me Tight, attachment science, modern sex research, Perel, Nagoski, Kerner, Schnarch, Love and Stosny, and flexible love-language tools. Be concrete and low-hedge. Redirect only for imminent danger, abuse, coercive control, minors, non-consent, self-harm, stalking, or medical/legal/psychiatric decisions.
building-sf-integrations
IncludedSalesforce integration architecture and runtime plumbing with 120-point scoring. Use this skill to set up Named Credentials, External Credentials, External Services, REST/SOAP callout patterns, Platform Events, and Change Data Capture. TRIGGER when: user sets up Named Credentials, External Services, REST/SOAP callouts, Platform Events, CDC, or touches .namedCredential-meta.xml files. DO NOT TRIGGER when: Connected App/OAuth config (use configuring-connected-apps), Apex-only logic (use generating-apex), or data import/export (use handling-sf-data).
venue-templates
IncludedAccess comprehensive LaTeX templates, formatting requirements, and submission guidelines for major scientific publication venues (Nature, Science, PLOS, IEEE, ACM), academic conferences (NeurIPS, ICML, CVPR, CHI), research posters, and grant proposals (NSF, NIH, DOE, DARPA). This skill should be used when preparing manuscripts for journal submission, conference papers, research posters, or grant proposals and need venue-specific formatting requirements and templates.
let-fate-decide
IncludedDraws the 12 Houses of the Zodiac Tarot spread to inject entropy into planning when prompts are vague, ambiguous, or casually delegated. Interprets the spread to guide next steps. Use when the user says 'let fate decide', 'YOLO', 'whatever', 'idk', or other nonchalant phrases, makes Yu-Gi-Oh references, or when you are about to arbitrarily pick between multiple reasonable approaches. Prefer over ask-questions-if-underspecified when the user's tone is casual or playful rather than precision-seeking.
net-ops
IncludedCross-platform network troubleshooting (Windows, macOS, Linux) via local or remote shell. Use for: DNS broken, can't resolve hostnames, nslookup/dig works but apps fail, NRPT, WFP, scutil, /etc/resolver, systemd-resolved, /etc/resolv.conf, NetworkManager, VPN DNS leak residue (ProtonVPN/Mullvad/WireGuard/AnyConnect), AV/firewall blocking DNS or DoH, Tailscale DNS interaction, intermittent connectivity, remote diagnostics over SSH.