Two games can have identical rules and one is compelling while the other is flat. The difference is almost entirely in the responses — the small, immediate, physical feedback to every action. It's cheap to add and it's the highest-return work in game development.

Respond to input instantly

The first frame after a button press must show something. Not the full action — just an acknowledgement. A squash, a flash, a sound. Latency between input and response is the fastest way to make a game feel dead.

The core techniques

Easing. Nothing in nature moves at a constant speed then stops. Accelerate in, decelerate out.

Squash and stretch. Deform on impact and launch. Two lines of scaling, enormous effect.

Screen shake. Tiny, brief, on impacts. Overdo it and it's nauseating — 3-6 pixels for 100ms is plenty.

Hit pause. Freeze everything for 50ms on a significant impact. Makes hits land.

Particles. A dozen small shapes flung outwards on a collision, fading out.

Sound. The single biggest one. A game with sound feels twice as responsive as the same game without.

game-juice.txt
Here's my game loop and collision code: <paste>

Add game feel, one technique at a time so I can tune each:
1. Easing on player movement — acceleration and friction, not
   instant start-stop.
2. Squash on landing, stretch on jump.
3. Brief screen shake on impact, with the magnitude as a constant I
   can tweak.
4. A short hit-pause on significant collisions.
5. A simple particle burst.

Put every magic number in one CONFIG object at the top so I can play
with them. Explain what each one does to the feel.

Then tune by feel, not by reason

Put the numbers where you can reach them and change them while playing. Every value that looks right on paper needs adjusting once your hands are on it. This is the part that can't be reasoned about — only felt.

Make it twice as strong as you think it should be, play it, then halve it. You'll land closer than by starting subtle.