Reference · Project style guide

The Top-Down Contract

The three clauses every asset in the game must obey. Print this and pin it above the desk.


The whole thing in one line

Depth compresses to two-thirds and height doesn't. Value steps down as a surface turns away from the sky. Everything grounded gets a short contact shadow.

Clause 1 — Depth compresses to ⅔. Height doesn't.

The camera is an oblique 3/4 top-down projection. Three world axes map to the screen:

World axisScreen resultScale
Width (left–right)Screen X1 : 1 — never compressed
Height (up)Screen Y, upward1 : 1 — never compressed
Depth (away from camera)Screen Y, downward× ⅔ — always

Before drawing a single pixel:

top face height = depth × ⅔
front face height = object height
sprite height = (depth × ⅔) + height

Where ⅔ came from

Measured off shipped, public-domain art rather than invented. Both of these are 14 px wide, and a crate and a pot are both about as deep as they are wide:

SpriteWidthTop faceFront faceCompression
Crate — Ninja Adventure (CC0)14 px9 px4 px0.64
Pot — Ninja Adventure (CC0)14 px9 px4 px0.64

Published top-down art mostly sits between ½ and ⅔. The specific value stops mattering the moment it is written down; drift is what costs you.

Planning table for this game

ObjectW × D × HTop faceFront faceSprite
Dynamite crate12 × 12 × 88 px8 px12 × 16
Coffin, lying10 × 16 × 411 px4 px10 × 15
Water trough14 × 6 × 54 px5 px14 × 9
Grave slab8 × 3 × 92 px9 px8 × 11
Fence post2 × 2 × 101 px10 px2 × 11
Why this and not a fixed ratio

A memorised ratio like “9 pixels of top, 4 of front” only works for objects shaped like the one you memorised it on. Flat things show almost all top face; tall thin things show almost none. The ratio changes with every object; the compression never does. Learn the compression.

Clause 2 — Value steps down as a surface turns away from the sky

At 16 × 16 with four or five colours, light is not a gradient. It is an ordering. Sort the palette by brightness and assign it by surface direction:

SurfacePoints atValue
Top faceThe skyLightest
Front faceThe camera, sidewaysOne step down
Occluded / undersideNothingTwo steps down
Contact shadowDarkest non-outline value
OutlineReserved. Never used as a fill.

Do not ask “where is my light?” per pixel. Ask which way does this surface point, and take the value that goes with it. That is repeatable on your two-hundredth prop; hand-feeling the light is not.

Then: left–right bias

Clause 3 — Contact shadow, not cast shadow

DoDon't
A short dark smudge hugging the base, one or two rows deep. A long directional shadow stretching across the tile.
One value — the darkest non-outline colour. A soft gradient. It will not survive being tiled.
Contained inside the object's own tile footprint. Running off the tile edge into whatever gets placed next door.
On its own layer, always. Baked into the sprite, so it can never be moved or dropped.
Shadows should be “subtle and not cast out long in any particular direction, as to minimize conflicts with overlapping adjacent tiles.” Raymond Schlitter, SLYNYRD — Pixelblog 21: Top Down Objects

Project constants

DecisionValue
Base tile16 × 16 px
ProjectionOblique 3/4 top-down
Depth compression× ⅔
Light directionTop-left, fixed
Value assignmentBy surface direction, not by feel
Contact shadowMandatory on grounded objects; short; own layer
Prop footprintSnap to 16 px increments
EditorAseprite
EngineGodot
PaletteNot yet chosen
Outline styleNot yet chosen

The study palette

Lessons borrow the four-colour palette of the Ninja Adventure crate, so that the value ordering can be practised before the game's own colours exist. It is not the game's palette.

Four colours is not a beginner constraint — it is the whole discipline. Every value you add is one more thing that has to stay consistent across several hundred sprites.