Skip to content

feat(examples): animate the skull (idle, laugh, glowing eyes, speech timing) - #21

Merged
scbrown merged 3 commits into
mainfrom
art/skull-animations
Sep 26, 2026
Merged

scbrown merged 3 commits into
mainfrom
art/skull-animations

Conversation

@scbrown

@scbrown scbrown commented Sep 26, 2026

Copy link
Copy Markdown
Owner

Depends on #13: this branch is stacked on art/skull-reference. Until #13 merges, the diff here includes #13's commits. Only the last commit is new.

pxl renders all the loops below from .pxl sources at 8x, and they keep the still's palette, outline and proportions. skull.png is unchanged pixel-for-pixel.

idle laugh eyes talking
idle laugh eyes talking

contact sheet

What's new

  • skull_anim.pxl uses a 44x44 canvas, so the head has room to float and the jaw has room to drop.
    • skull_idle: 24 frames at 120ms. A 1px float, with one blink every other bob: the inner socket walls go dark, half and then full.
    • skull_laugh: 12 frames at 70ms. Jaw chatter with a new wide pose (chin down 3px), and the head tips up a pixel on each open.
    • skull_eyes: the idle float plus an ember glow flickering in the sockets. It uses a new ember palette with four warm shades, and the glow_1..3 overlays can sit on top of any frame.
  • skull_talking in skull.pxl now has speech-like timing: 1-3 frame syllables, short closes between them and a longer hold between phrases.
  • contact_sheet.py builds skull_contact_sheet.png from pxl render --spritesheet strips.
  • The README is updated with the new files and render commands.

Craft notes

  • Every move is rigid and the jaw poses reuse the still's art, so the outline never changes shape between frames.
  • Compositions can't offset a layer (Compositions ignore derived-sprite shift and the {sprite, x, y} layer renders nothing #17), and derived shift sprites render empty as GIF frames. So the cranium, the jaw poses and the overlays are written out at both head heights (*_rest and *_up).
  • I skipped the stretch goal, a head turn toward the viewer. At 40px it would mean redrawing the face at new angles, and I didn't want to degrade the look to get it.

GAPS.md additions

Testing

Every animation renders with pxl render --strict and no warnings, and pxl validate is clean. This PR only touches examples/skull/.

🤖 Generated with Claude Code

https://claude.ai/code/session_01PXBCFZMofE9EGKzo8J2YKJ

scbrown and others added 3 commits September 26, 2026 01:34
…timing)

New skull_anim.pxl on a 44x44 canvas with three looping 8x GIFs:
- skull_idle: slow 1px float with a blink (the sockets go dark) every other bob
- skull_laugh: fast jaw chatter with a new wide jaw pose, the head tipping up
  a pixel on each open
- skull_eyes: the idle float with an ember glow flickering in the sockets
  (new `ember` palette; glow_1..3 overlays sit on top of any frame)

skull_talking in skull.pxl now uses speech-like timing: 1-3 frame
syllables and holds between phrases. The still is unchanged
pixel-for-pixel.

Compositions can't offset layers and derived shift sprites don't reach
GIF frames, so the two head heights are written out as sprites. GAPS.md
gains per-frame duration (#6) and palette @include in GIF frames (#7).
A contact sheet built from pxl spritesheets shows frames from each
animation.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PXBCFZMofE9EGKzo8J2YKJ
… now

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PXBCFZMofE9EGKzo8J2YKJ
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PXBCFZMofE9EGKzo8J2YKJ
@scbrown
scbrown force-pushed the art/skull-animations branch from 6f89863 to e233a89 Compare September 26, 2026 05:34
@scbrown
scbrown merged commit 80f8b50 into main Sep 26, 2026
27 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant