Skip to content

Sprite sheet (PNG) export

The Sprite sheet engine packs every frame of an animated asset into a single PNG grid alongside a JSON manifest that encodes cell size, frame count, per-frame durations, and Aseprite-style frame tags. Pro feature at both asset scope (animated sprite sheets) and pack scope (one PNG per asset plus a pack.json summary). On the free tier, animated exports are limited to GIF - see Free vs Pro.

This is the format engine code reads when it needs to play animations - Phaser’s aseprite loader, Unity’s sprite slicer, Godot’s AnimationPlayer, and any custom Three.js sampler all consume this verbatim.

For asset-scope, the output depends on whether the asset has tags and you’ve selected the full frame range:

  • Bare sheet (no tags, or a custom / active-tag range): <asset-slug>-spritesheet.png downloads directly.
  • Sheet + manifest (asset has tags and Frames = “Full animation”): a .zip containing <asset-slug>-spritesheet.png plus <asset-slug>-spritesheet.json. The manifest gives engine loaders the tag ranges they need to play walk, attack, etc. by name.

For pack-scope, a .zip containing:

  • One <asset-slug>.png per asset (the asset’s sheet)
  • A top-level pack.json mapping every asset slug to its sheet filename plus that sheet’s layout and per-frame durations

Frames pack into a rectangular grid of cells. Each cell matches the asset’s canvas dimensions (16×16, 32×32, 50×80, …), and frames fill the grid in your chosen reading order:

  • Row-major (default) - left-to-right, top-to-bottom. Frame 0 sits in the top-left, frame 1 to its right, wrapping at the column limit. The typical convention; most engines assume this.
  • Column-major - top-to-bottom, left-to-right. Frame 0 top-left, frame 1 directly below it, wrapping at the row limit. Useful for engines that index by (row, col) rather than a flat frame index.

The Columns knob picks the grid width:

  • Auto (square) - the default. Picks ceil(sqrt(frame count)) so the sheet is roughly square. A 12-frame animation becomes 4 columns × 3 rows.
  • 1, 2, 4, 8, or 16 - explicit column count. 1 column is a vertical strip, useful for very-tall sheets or engines that prefer a single column.

The Cell padding knob inserts transparent pixels between cells:

  • 0 px (default) - cells are flush. Works for nearest- neighbor filtering, which is what pixel-art engines should use anyway.
  • 1, 2, or 4 px - leaves gutter pixels between cells. Bump this if your engine uses linear or mipmap sampling downstream; without padding, neighboring frames bleed into each other when sampled at sub-cell coordinates.

When a manifest is emitted, it carries the layout and timing the engine needs to slice and play the animation:

  • filename - the sheet PNG’s name (sibling to the JSON in the bundle).
  • cellSize - frame size in pixels (cells are square).
  • columns / rows - grid dimensions.
  • frameCount - total cells used in the sheet.
  • durations[] - one ms value per cell, in the sheet’s cell order (matches the row-major or column-major reading order).
  • frameTags[] - every tag from the editor’s tag strip, with name, from, to frame indices, and direction (forward, reverse, pingpong). This matches the Aseprite JSON Hash format, so Phaser’s aseprite loader and Aseprite-compatible importers in Unity / Godot read it directly.

For pack-scope, pack.json is an object keyed by asset slug where each value follows the structure above.

The Frames dropdown scopes what goes into the sheet:

  • All frames - every frame in source order. The default.
  • Active tag (only shown when the asset has tags) - just the active tag’s frames; the manifest carries a single tag entry covering the full sheet.
  • Custom range - explicit from / to indices.

Sprite sheet does NOT surface the Export per tag button that GIF and APNG offer - the whole point of the sprite sheet is that all tags coexist in one image with one manifest, so the engine can switch between them at runtime by name.

Same as the animated formats: leave empty to use per-frame durations from the timeline, or type a positive number to flatten every frame to a uniform rate. The manifest’s durations[] values reflect the override when set.

Layers composite to a flat frame before being placed in the sheet. To bundle individual layers, use the per-layer export on a single frame.

For block-texture assets in mirror mode, every cell shows the shared composite. In face-independent mode, the sheet uses the currently active face - switch faces in the editor and re-export if you need other faces.

  • Sharing on social media. Use GIF or APNG - they play directly in chat apps, browsers, and embeds without engine code.
  • Single static textures. Use Raw per-face PNGs or Multi-size PNG for a one-shot static image.
  • Engine-specific resource packs. Minecraft Java / Bedrock and Tiled have their own dedicated exports.