Game Lab · Game feel & juice

The difference between played
and closed is feel

Two games can share mechanics, art and audio — and one feels alive while the other feels dead. The difference is a hundred tuned numbers: hit-stop lengths, easing curves, camera lag, squash scale. This lab exists to find those numbers and write them down.

Try the AI Game Builder

Feel is tuned before art exists

Every piece starts as gray boxes with the complete feel layer: fall gravity heavier than rise, coyote time, input buffering, camera lookahead with smoothing. Art never rescues a game that feels wrong — so feel is proven by play first.

FEEL_NOTES.md — jump
fall gravity ×1.8rejected ×1.0 "floaty, no weight" · ×2.4 "brick"
coyote time 90msrejected 0 "unfair" · 150ms "mushy edges"
input buffer 120msearly jump presses honored at landing
Every constant ships with its reasons — and what the rejected values felt like.

Juice, tuned — not just present

The checklist is table stakes; the craft is the numbers. Hit-stop per impact class, decaying rotation-free shake, a named easing family for every motion, squash scale on landings. A checklist item that exists but is mistuned is a finding here.

Juice audit — cycle gateTuned
Hit-stoplight 40ms · heavy 70ms · kill 110ms + flash
Screen shakeamplitude 4px, decay 0.85/frame, rotation 0
Easingpickups Back.out · UI Cubic.inOut · landings Bounce-lite
Squashland 1.15x/0.85y → settle in 90ms

Benchmarked, not vibes-checked

Every piece must prove its responsiveness: sustained 60fps with recorded frame-time samples, input-to-response within two frames, feedback within 100ms of every interactive event — measured via telemetry timestamps, recorded in the ledger.

Feel benchmarkPass
60fps sustained · worst frame 17.8msinput→response: 1 framefeedback ≤100ms: 100% of events

Lessons every engine inherits

A tuned hit-stop range or the right easing family for a landing works identically in canvas, Godot and Defold games. The lab’s findings port as numeric, engine-agnostic rules into the guidance every 2D build follows — that portability is why this lab exists.

Ported this cycle
Impact hit-stop tablelight 30–50ms · heavy 60–80ms · kill 100–120ms + flash
Easing families per motion classpickup / UI / landing / camera — named, with reasons
→ builder guidancenow binds every 2D game, on every engine

How a piece gets made

01

Concept pack

Sheets + inventory — the shared standard.

02

Feel-first blockout

Gravity, coyote time, camera — tuned as gray boxes, written down.

03

Art + juice pass

Mocap sprites; hit-stop, shake, easing — tuned with reasons.

04

Benchmark

60fps frame samples, 2-frame input latency, 100ms feedback.

05

Port the numbers

Engine-agnostic feel rules flow into all 2D builds.

Pieces

Each card is a piece produced by the loop above — newest first.

The first pieces are in the pipeline

The lab launched with the professional game-feel standard — its first pieces are being tuned and audited right now.

Questions, answered

What exactly is "game feel"?

The accumulated micro-decisions that make interaction satisfying: how gravity asymmetry gives a jump weight, how 60 milliseconds of hit-stop sells an impact, how a camera’s lookahead keeps the player oriented. Individually invisible, collectively the difference between alive and dead.

Why a whole lab for it?

Because feel knowledge is numbers plus reasons, and nobody writes the numbers down. Each cycle’s FEEL_NOTES document — every constant, why that value, what the rejected values felt like — becomes research the whole platform builds on.

Why Phaser for this work?

Phaser’s tweens, cameras and particle emitters are exactly the juice toolkit, on the professional web-2D framework — the shortest path from a feel hypothesis to a playable test.

Do other engines benefit?

That’s the point: feel constants are engine-agnostic. The ported rules bind every 2D game the builder ships — canvas, Phaser, Godot and Defold alike.

Build a game that feels as good as it looks

Every 2D game the builder ships inherits this lab’s feel research.

Try the AI Game Builder