Start with movement
Everything downstream depends on how the character moves, so it is tuned before a level is laid out and long before anything is painted.
Every article here is written from a build we shipped, with the real numbers in it. No worked examples invented for the article.
Most writing about game development is either a tutorial that builds something nobody would ship, or a postmortem so abstract that none of it can be acted on. This is neither. Every piece below describes something in a game we actually delivered to somebody, with the constants, the trade-offs and the bugs left in.
That means it also records where we depart from the standard advice. Our engines use a fixed timestep rather than delta time, because a game that behaves identically twice is a game a test can play. Our builds do not use a sprite sheet, because a single self-contained file has no requests to save. Both of those are the wrong answer in plenty of situations, and the articles say which.
The through-line is that almost nothing that makes a game feel good is visible in a screenshot. A jump feels right because of an eight-frame forgiveness window nobody notices. A hit lands because four cheap effects fire in the right order, and because everything pauses for a few hundredths of a second. A character reads as walking because the animation is driven by distance covered rather than by a clock. Those are the details that separate a game somebody finishes from one they put down without being able to say why.
If you are here because you are thinking about commissioning something, this cluster is the honest answer to whether we can build it. If you are here because you are building your own, take whatever is useful.
Everything downstream depends on how the character moves, so it is tuned before a level is laid out and long before anything is painted.
Read input, update the world, draw it, repeat. Ten lines, identical in a game for a four-year-old and in a chess engine.
The first playable version of every level we build is grey rectangles. That is the only order in which the work can be done.
A game can build cleanly, open without errors and still be impossible to complete. So a program plays it.

Every commission is the same engine and none of them is the same game. This is how that is true rather than a sales line.

A tape screech, a sword clang, thunder rolling. No audio files involved in any of them.

Four difficulty levels, one engine. The hardest problem was not making it strong, it was making it lose convincingly.

Nothing in a game actually collides. An impact is four cheap effects fired in the right order.

There is no scene. There is a list of drawing instructions, run back to front, sixty times a second.

A small palette is not a limitation left over from old hardware. It is what stops a player losing the character.

A game does not respond to a key being pressed. It asks, every frame, which keys are currently down. The difference is everything.

Every sound in our games passes through a single gain set to about a third. Everything else is decided against that.

Our adventure game saves in one line. Deciding what belongs in that line took considerably longer.

If a game needs a page of instructions, the first level is wrong.

Two rectangles overlapping is the easy part. Deciding what to do about it is where platformers go wrong.

Happy Birthday, in our 60th birthday game, is twenty-five pairs of numbers. Not one byte of it is audio.

The likeness is the easy half. Making it stand on a floor and turn around convincingly is the rest.

The commonest mistake in a commissioned game is making it too long. Nobody has ever complained that a gift was too easy to finish.

Two frames is enough. Understanding why is the difference between spending an art budget well and spending it on animation nobody sees.

The hardest part of playtesting is keeping your mouth shut. Everything useful happens in the silence.

Feet that skate, legs that race, a stride that changes tempo halfway across a room. One arithmetic mistake causes all three.

One file you can email. No install, no server, no broken image paths in five years' time.

It counts to 48000 because that is what a 48K machine had. And while it performs, it is doing real work.

The hard part is not drawing the bear. It is deciding which of its repairs to keep.

A game for a four-year-old is not an easier game. It is a different set of five numbers, and one of them removes losing entirely.

Three ways to put a character into a painted scene. Only one of them is parallax, and choosing between them is a per-room decision.

One of our games is 104KB of pixel art. Another is 20MB of painting. Neither choice was about taste.

The standard answer is to pack every frame into one big image. Our games do the opposite, and the reason is worth understanding.

Our platformer has eight states and one variable holding which one it is in. Every bug we did not have is because of that.

The measure of a commissioned game is not whether it is finished. It is whether it is opened again in March.

The code in our largest game is a rounding error. Everything you wait for is a picture.

Our gentlest difficulty has no way to lose at all. That is a design position, not a compromise.

Sixty is not about smoothness. It is about the gap between pressing a button and seeing something happen.

Collect one coin and it is satisfying. Collect fifty identical coins and you turn the sound off.

The standard advice is to scale everything by frame time. We do the opposite, on purpose, and the reason is testing.

Three of our games sit at 104KB, 3.3MB and 20MB. The difference is not quality. It is a decision made early about where the art comes from.

Twelve tube stations, three lines and a flight to Cape Town, in one HTML file. The problems that had to be solved, in the order they turned up.