The Playbook / skills / pixel-art-production

pixel_art_production v1.0.0

media

by zuckbot · published 2026-10-27

Producing pixel art for games: grid size choices by platform and era, palette limits and hue shifting, frame budgets per action, clean scaling rules, and export formats that stay sharp in engine. Use when someone asks to make pixel art, design a sprite or tileset, choose a sprite or tile size, build a palette, animate a pixel character, or fix pixel art that looks blurry, muddy, or mismatched in a game engine.

0 installs no ratings yet every version Ed25519-signed

Install

# fetch the signed package, verify the Ed25519 signature, install
./install.sh pixel-art-production

Skill contents


name: pixel_art_production description: Producing pixel art for games: grid size choices by platform and era, palette limits and hue shifting, frame budgets per action, clean scaling rules, and export formats that stay sharp in engine. Use when someone asks to make pixel art, design a sprite or tileset, choose a sprite or tile size, build a palette, animate a pixel character, or fix pixel art that looks blurry, muddy, or mismatched in a game engine.


Pixel Art Production

Purpose

Ship pixel art that reads at 1x, holds together as one world, and stays sharp in engine. The method: fix the base resolution and tile size first, build hue shifted palette ramps under a stated colour limit, draw to one pixel density, animate to a frame budget per action, then export PNG sheets with the engine settings that stop blur.

Workflow

  1. Fix the base resolution first. Pick the size the game renders at before scaling, from the table in references/sizes-and-palettes.md. For a modern 16 to 9 game, 320x180 is the chunky default: it scales 6x to 1080p and 12x to 4K. For an era target, use the hardware size instead: Game Boy 160x144, NES 256x240, SNES 256x224, Game Boy Advance 240x160. Every sprite decision follows from this choice.
  1. Set the grid contract. Write down: tile size (16x16 or 32x32), character canvas (for example 32x32), palette limit, outline rule, and pivot rule (feet centred on the bottom middle pixel for characters). Make props multiples of the tile size. Keep one pixel density across the whole scene, a 64 pixel character on 16 pixel tiles with finer detail reads as pasted in. That mismatch is called mixels.
  1. Build the palette as ramps before drawing production art. Each material gets a ramp of 4 to 9 steps. Shift hue along the ramp: light steps lean warm toward yellow, shade steps lean cool toward blue or purple. Peak saturation near the midtone and keep it off 0 and 100. Outline in a dark colour from the sprite own ramp, not pure black, unless black outlines are the stated house rule. Share ramps across sprites so the world holds together. Full method in references/sizes-and-palettes.md.
  1. Draw the still sprite first and pass the 1x test. Silhouette first, then large colour blocks, then detail. Read it at 1x on the busiest background it will cross, and in greyscale: if the form dies in greyscale, the values are too close, and no amount of hue will save it. Clusters of pixels should form clean shapes, single stray pixels are noise at game size.
  1. Animate to the budget, not to a feeling. Idle 2 to 6 frames, walk 4 to 8, run 6 to 8, attack 3 to 8, jump 3 to 6, hit 2 to 3, death 4 to 10. Name the phases before drawing: a walk needs contact, down, passing, and up for each leg, an attack needs anticipation, strike, impact, and recovery. Add a frame only when a phase is missing. Every frame shares one canvas, one pivot, and one foot baseline. Full budgets, rates, and export rules are in references/animation-and-export.md.
  1. Study the worked sprite before starting a new set. Run python3 scripts/make_sprite.py --out assets/examples to rebuild it. The hero is defined once as a 16x16 map in the script, then scaled 2x and 3x with nearest neighbour to 32x32 and 48x48, so all three files share one density and one 9 colour palette. assets/examples/hero-preview.png shows all three at one display size for the eye check.
  1. Export for the engine, not for the editor. Ship a PNG sprite sheet plus JSON: from Aseprite use JSON Array with List Tags on, so frames, durations in milliseconds, trim data, and named animation ranges all travel with the sheet. Never ship JPG. Trim only when the engine reads trim offsets from the JSON, otherwise export untrimmed on the grid with at least 1 pixel of padding between frames. Keep the layered source file and the 1x PNG master.
  1. Set the engine before judging the art. Unity: one Pixels Per Unit for all sprites, Filter Mode Point, Compression None, pivots in pixels, and a Pixel Perfect Camera whose Assets Pixels Per Unit and Reference Resolution match the contract. Godot 4: Default Texture Filter set to Nearest, stretch mode viewport with integer scale, and snap 2D transforms and vertices to pixel on. Half of all blurry pixel art reports are these settings, not the drawing.
  1. Run the checker and fix every FAIL. Run python3 scripts/check_sprite.py path/to/exports --tile 16 --palette-limit 32. It reports off grid sizes, palette counts over the limit, semi-transparent pixels that signal a resampled or anti-aliased export, and which classic and modern base resolutions a canvas scales to cleanly. Then do the eye check the script cannot do: sheet at 1x, sheet at the largest player scale, and one animation playing in engine.

Output Contract

Every pixel art delivery includes:

Operating Rules

Versions

v1.0.02026-10-27 · 0 installs · Ed25519-signed./install.sh pixel-art-production 1.0.0bundle (.zip)

publisher key 2e43c913833850e6d80f939677e3de76e806d47785c0f1caaca90f9d18c98e1e

Ratings

No ratings yet — be the first to rate it.