Skip to content

Animation, frames, and cels

Hexcalibur turns any asset into a frame-by-frame animation by adding a time axis on top of the existing layer stack. The result is a grid: every layer keeps its full stack of pixels at every frame, so a background layer can stay constant while a character layer cycles through poses. The two axes are independent, and that independence is the thing that makes the animation system worth learning.

The animation timeline - the frame strip is the time axis, and each frame pairs with the layer stack to form the cel matrix

Every animated asset is built around two ideas you already know:

  • Layers are the depth axis. They stack on top of each other and composite into the final image, exactly the same way they do on a single-frame asset. Each layer has its own visibility, opacity, and blend mode. See Layers and blend modes for the layer model in full.
  • Frames are the time axis. Playback walks through them in order, and each frame has its own playback duration in milliseconds. One frame = one moment in time.

Cross those two and you get a cel matrix: one cell per (layer, frame) combination. A 4-layer, 12-frame animation has 48 cels in its matrix. Here’s the matrix for a two-layer, four-frame torch, as the timeline’s Layer-cel grid draws it:

The Layer-cel grid for a two-layer torch - the flame row holds four independent buffer cels (dots), while the stick row is painted once and linked across the other three frames (chain icons)

The flame layer changes every frame, so each of its cels is an independent buffer (the dot glyph). The stick never moves, so it’s painted once and linked across the remaining frames (the chain glyph) - one pixel buffer showing up in all four. Played back, those four frames make this:

The four torch frames playing as a loop

At any active frame, the compositor walks bottom-to-top through visible layers and blends each one’s cel at that frame. That’s the frame the canvas paints and the 3D preview shows.

A cel is the unit of paint content for one layer at one frame. Picking a different frame in the timeline switches the canvas to the cel at (active layer, new frame); your next brush stroke lands in that cel and nowhere else.

Each cel is one of three kinds:

  • Buffer - the cel owns an independent pixel buffer that belongs only to this (layer, frame). Paint strokes mutate it in place. This is what new painted cels become.
  • Empty - no buffer, no link. Renders fully transparent. New frames default to empty cels on every layer (so they’re blank canvas).
  • Linked - shares pixels with another cel on the same layer via a reference. Painting on any linked cel updates the underlying buffer, which means every cel linked to that buffer updates together. The “share once, edit anywhere” workflow.

The cel matrix decides what every frame of every layer is doing, which is why the Layer-cel grid inside the timeline panel is the most informative view of an animation’s structure.

Linked cels are how Hexcalibur keeps a static background painted once across every frame without duplicating the buffer N times. The intended workflow:

  1. Paint your background layer at frame 0. The cel becomes a buffer cel.
  2. Add a new frame and pick Duplicate from the right-click menu. Every layer’s new cel becomes a linked cel pointing at the corresponding cel at the source frame.
  3. Continue adding frames. Each layer that hasn’t changed yet keeps its linked cels - that single background pixel buffer shows up on every frame.
  4. When you want a frame’s content to diverge, right-click the linked cel in the Layer-cel grid and pick Unlink. The linked cel materializes into its own independent buffer cel with a clone of the source pixels; future paints stay local to that frame.

Painting on a linked cel directly also works - it transparently materializes the cel into a buffer cel on the first stroke. The explicit Unlink action exists for when you want to break the link without painting yet.

Deleting the frame a link points at is safe. Since a linked cel doesn’t hold pixels of its own, you might expect deleting the frame it borrows from to leave it blank. It doesn’t - the artwork moves to whichever linked cel is left, and the rest go on sharing from there. Nothing you can see changes.

The right-click menu on any cel also offers Clear (wipe back to empty) and Link to frame… (point this cel at another frame’s cel on the same layer, choosing from a sub-list of candidates).

Tags are how you carve a single animated asset into multiple states. Each tag has:

  • A name - usually a state label like idle, walk, attack.
  • A color - tints the bar that represents the tag in the tag strip so you can tell them apart at a glance.
  • A frame range - inclusive [from, to] indices on the time axis.
  • A direction - forward (play first to last), reverse (play last to first), or ping-pong (play 0,1,…,N,N-1,…,1 repeatedly).
  • An optional fps override - playback uses this rate instead of the per-frame milliseconds when the tag is active.

Clicking a tag scopes playback to its range: the playback clock loops within the tag’s frames and the layer-cel grid highlights the relevant columns. Without an active tag, playback walks the full frame array.

Tags also export with the sprite-sheet format so that engines like Phaser, Unity, and Godot can play just the walk range by name without reading frame indices by hand.

Onion skin overlays adjacent frames as ghosts under the active one, so you can see how your animation flows from one pose to the next. Useful when drawing in-between frames - you can see exactly where the previous and next poses sit.

The onion popover (ghost icon in the timeline’s mode cluster) lets you tune:

  • Pre / Post frames - how many frames before and after the active one render as ghosts.
  • Opacity - dial each side down to a quiet hint or up to a full reference.
  • Tint - color each side a different hue so you can tell past from future at a glance. Defaults are red for pre frames and green for post.
  • Step - sample every other frame (2) or every third (3) instead of every consecutive frame, useful for sparser animations.
  • Scope - choose Active layer (cleaner for character animation) or All visible layers (full context across the stack).

Onion skin is automatically suppressed during playback - the overlays would distract from the animation playing through.

Free accounts have caps on the animation system:

  • 5 frames max per asset. The 6th frame would open the upgrade modal instead of being created. Existing assets you created with more frames continue to play, but new frames are gated.
  • 1 tag max per asset. The 2nd tag would open the upgrade modal.

Both caps are enforced on every entry point - the Animate button, the N keyboard shortcut, the + frame tile, and every right-click duplicate / insert path. Pro accounts have no caps; the only limit is the frame count’s effect on file size and playback memory, which is generous on modern browsers.

See Free vs Pro for the complete comparison.