
Make the controls feel right
A jump can feel right, or it can leave the hero hanging in the air. The rules haven't changed; the settings have. Today we'll compare those settings, then add a control panel to your remix and choose the numbers you like.
- a panel on P to adjust jumping, falling, assists and the hitbox
- your numbers written into the game and saved
- three notes: what felt wrong and which setting you changed
To compare: open remix.html, press P, then play index.html.
Working on your own idea from day 1? Tune its main action. Ask the agent to adapt the panel and choose settings for your game, such as speed, reload time or the delay between turns. You don’t need to copy Dino’s controls.
Already familiar with coyote time and jump buffering? Start with the taste test, then head to the control panel.
Start with your remix
Ask the agent to open your remix and play a few rounds. Don't adjust anything yet.
Find the number you wrote down for yesterday's homework. We'll start there.
A quick recap
You shoot an enemy, but there's no visible or audible sign of a hit. What's missing?
- A goal: nothing to work towardThe goal is to stop the enemies. What is missing is a sign that your shot landed.
- Feedback: you cannot tell whether you hitYes. The game needs to show the result of your action.
- An obstacle: nothing gets in your wayThe enemies are the obstacle. The missing part is the response to a hit.
You copied remix.html into a new folder and opened the agent there. What should you remember?
- Nothing; the agent remembers yesterday's rulesA new chat doesn't include yesterday's conversation. The rules need to be in the notes.
- The agent cannot work without notesIt can work, but it will not know the agreements you made in the other folder.
- Bring the agent notes into the new folder tooRight. The notes live in the game folder. On day 4, we will carry them into a new project.
What we'll change today
The jump works, but something about it bothers you. It is hard to explain what.
Open the panel with P, adjust a number and check the difference straight away.
Blind taste test
There are five rounds here, set on the mountain pass from our example game Ember Climb. The little flame Ember runs on her own, and you jump over ice spikes and a crevasse. Try A and B in each round: they differ by one setting, which stays hidden until you choose. Jump with space or tap inside the game. Pick the version you prefer, then see what changed.
One version delays the jump by 0.1 s. Could that be noticeable while playing?
- Yes, the controls can feel slowYes. Around 0.1 seconds is the point beyond which a response stops feeling instant (Nielsen, 1993).
- No, the difference cannot be feltIt may be hard to see, but noticeable when you press a button. Try comparing the versions again.
- Only a professional player would noticeYou do not need the technical term to notice it. A player might say the game feels slow or mushy.
Explain what you want to change
“Mushy,” “like a brick,” and “like the Moon” are useful first impressions. They do not yet say what to change. Let's connect each impression to a setting you can test. Here are some suggestions for your game:
| they say | you turn |
|---|---|
| mushy, laggy | faster rise: smaller timeToApex, 0.35 → 0.28 |
| floaty, like the Moon | faster fall than rise: fallMult 1.5–2 |
| like a brick | higher jump or longer rise: jumpHeight, timeToApex up |
| unfair, I didn't touch it | hitbox smaller than sprite: hitboxShrink 4–6 |
| I pressed, it didn't jump | jump buffer: jumpBuffer 0.1 |
| boring, it crawls | faster world: runSpeed +10% or more |
| they say | you turn |
|---|---|
| drops like a stone | weaker pull: smaller gravity, 1400 → 1200 |
| like a balloon | stronger pull: bigger gravity |
| weak flap | sharper flap: bigger flapSpeed |
| can't catch the fall | fall speed limit: smaller maxFall |
| unfair, I didn't touch it | hitbox smaller than sprite: hitboxShrink 4–6 |
| the pipes are too tight | wider gap: gapSize 170 → 190 |
| they say | you turn |
|---|---|
| sleepy | shorter step: stepTime 0.15 → 0.12 |
| jittery, can't keep up | longer step: bigger stepTime |
| goes crazy fast at the end | gentler speed-up: speedUp closer to 1, 0.97 → 0.98 |
| it ate my turn | remember two presses: inputQueue 2 |
| unfair, I turned in time | grace at the wall: graceTime 0.12 |
| cramped | bigger field: gridSize 20 → 24 |
Set a jump by what the player sees: height and time to the top. The agent works out gravity. Kyle Pittman's advice from “Building a Better Jump” (GDC, 2016).
“Heavy” isn't always bad: Dong Nguyen tuned Flappy Bird so any extra tap kills the bird (Rolling Stone, 2014). The word says which way to turn; how far is your call.
If you don't know which number to try, ask the agent for a suggestion. You still get to test it:
Someone says, “The hero jumps as if they were on the Moon.” What would you try?
- Raise the jump height to stay airborne longerThat would keep the hero in the air even longer. Try the time to the top or the fall speed.
- Shorten the rise or speed up the fallYes. That lets you check whether the hero is spending too long in the air.
- Increase the running speedThat changes the distance covered, but does not fix the long hang in the air.
Give a slightly mistimed press a chance
Sometimes you are sure you pressed jump, but the hero falls anyway. Two small assists help those near misses count:
- Coyote time: a short window to jump after the hero has left a platform.
- Jump buffer: press jump just before landing, and the game waits for the landing before jumping.
Here is Ember's pass again: a crevasse, a narrow rock pillar and another crevasse. Make 5 attempts without assists and 5 with them. Compare the results. A label appears whenever an assist helps you.
Celeste's coyote time is exactly 0.1 seconds (see its open player code). Maddy Thorson broke these assists down and admitted: “I don't think that we invented any of these techniques.” In 1997 Taneli Armanto gave Nokia's Snake a few milliseconds before a crash so you could still turn (MEL, 2019).
Try both versions yourself. Is landing on the rock pillar easier?
Make 5 attempts in each mode. Then try “Brick” and “Feather”: the task stays the same, but the jumps behave differently.
The scoreboard keeps the results from both versions.
How to check:
- 5 tries each, with and without assists
- More wins with assists
- Saw an assist save you: a label at the edge or pillar
If you cannot make it across yet, choose “Celeste's numbers” and hold jump longer to give yourself more time near the top.
Now play the example game in full. Ember Climb is modelled on Celeste. It borrows the jump numbers, both assists, the floaty top of the jump and the dash: you get one in the air, and it comes back once the flame lands. The screens are short, and after a fall the flame is back at the start of the screen right away.
While you play, notice where an assist saved you. Your own game can be a completely different genre: assists help anywhere the player has to press a button at just the right moment.
Add the panel to your game
Ask the agent to put a control panel in your remix. Press P to open its sliders. Adjust one and the game changes without reloading. The settings depend on which game you chose.
While the agent works, find your homework setting in the cheat sheet above.
The panel lets you try settings without sending a new task for every adjustment.
Send the prompt, open your remix and press P. Try every slider while the game keeps running.
How to check:
- Sliders change the game live, no reload
- Keys work again after you let go of a slider
- “Copy numbers” gives you CONFIG lines
- Checked what the agent said to notice
If the panel behaves differently, find a similar case in the table and send the agent the suggestion beside it.
| what you see | what to say |
|---|---|
| sliders move, game doesn't change | “The panel changes nothing. Read CONFIG every frame” |
| space moves the slider | “Space should control the game after I release a slider” |
| P opens nothing | “P doesn't work. Check the key by event.code, not by the letter” |
| the button doesn't copy | “Show the numbers in a text field, I'll copy them” |
Find settings you enjoy playing with
Make three tests. For each one, adjust a single slider and play for a minute. Write down what bothered you and which number helped. Start with yesterday's homework.
For comparison, change the number by at least 10%. That makes the difference easier to notice. You can choose a value in between afterward.
Jaime Griesemer, a Halo 3 designer, changed the sniper rifle's time between shots from 0.5 to 0.7 s. His GDC 2010 advice: change by at least 10%; overshoot and come back (talk recording).
When you find values you like, press “Copy numbers” and send them to the agent. It will put them in the game; otherwise, reloading brings back the old values.
Save your chosen numbers as part of the game.
Record your three tests in the notebook, then send the prompt above with the numbers from your panel.
How to check:
- One slider per pass
- Three “word → number” pairs written down
- Your numbers survive a page reload
- The agent saved “my numbers”
If you adjusted several sliders and lost track of the result, restore the last save. Repeat the test with one number.
Settings to try in your genre
This part is optional. Every genre has settings that affect how it responds. Try these in genre.html from day 1 homework or in remix.html. Treat the numbers as a starting point and adjust them for your game.
Start with 0.1 s of coyote time and a 0.1 s jump buffer. Try falling 1.5–2 times faster than rising and compare.
Try reaching full speed and stopping in 0.1–0.15 s. If the hero feels slippery, check how long it takes to stop.
Try a move animation lasting 0.1–0.15 s, with undo available for every move. A stray press should not mean restarting the puzzle.
Have a card lift in 0.1 s when you hover over it. That makes your current choice visible.
Show a marker and play a sound within 0.1 s of an order. The player can see that the click registered while the unit finds a path.
Add a “+1” and a small hop when collecting an item. Check whether collecting several in a row feels satisfying.
Try 30–40 characters per second. Let a click reveal the whole line, so players need not wait for text they have read.
Start with fire rate, damage or spread. Change one number in steps of at least 10%, as Griesemer suggests in the Halo 3 example.
Try a grid step lasting 0.12–0.15 s. Holding an arrow should keep the hero moving without pauses.
Check that your settings are saved
Compare the versions once more, then save your chosen settings.
The agent checks
You play
Play three rounds in index.html, then three in remix.html. What is more comfortable now? Describe one specific difference.
★ Fresh eyes
Start a new chat: type /cleartype /newopen a new session in the same folder. Have the agent check the files without the earlier conversation.
Once the checks pass, save the day.
Someone says, “The jump feels mushy.” Where would you start?
- Choose one setting and test itYes. Try shortening the time to the top, for example. A single change is easier to judge.
- Ask the agent to make the jump nicerFirst, say what you want to test: height, rise time or falling speed.
- Change height, rise time and fall speed togetherAfter three changes, it will be harder to tell which affected the feel.
What does coyote time do?
- Draws the edge a bit widerThe drawing is the same. The assist is in time, not pixels.
- Lets you jump just after the edgeYes. In Celeste it's 0.1 s. The player doesn't see it, they just fall less.
- Slows the game at the edgeThe speed is the same. The jump just still counts.
You moved four sliders at once, and it got worse. Now what?
- Move two more until it's betterSix changes at once: even more confusion.
- Ask the agent to guess which setting went wrongIt can suggest candidates, but you test the feel. Return to one slider.
- Undo and go one at a timeYes. One at a time, you see right away which number is to blame.
You found great numbers, then closed the tab. What happens when you reopen the game?
- The old CONFIG numbers returnYes. The panel changes the game while it's open. To keep numbers, you write them into CONFIG.
- The numbers stay: the panel remembersThe panel stores nothing. Only CONFIG remembers.
- The panel opens by itselfThe panel opens with P, and the numbers will be the old ones.
The taste test has jumps with 0.35 and 0.6 s to the top. Which should you choose?
- 0.35: snappy is always betterNot always. A floaty jump can fit too.
- 0.6: easier, so betterEasier doesn't mean better. It's taste.
- Whichever fits my gameYes. Snappy and floaty jumps suit different games. You now know which number changes that feel.
The agent says, “Done, jumping feels nice now.” What next?
- Trust it and save right awayThe agent checked the code, not the feel. Play it.
- Play and compare it myselfRight. Checking the code does not tell you whether the controls feel comfortable.
- Ask it to play once moreIt won't feel it in its hands. Play it yourself.
Let someone else try both versions
- Have someone play
index.html, thenremix.html. Ask, “Which version feels better to control?” - Write down their pick and exact words
- Match their feedback to a setting and add a fourth pair to the notebook
- One more feel change in the remix; play with and without it
Play genre.html with and without assists. Where did you fall less? Note it.
Turn acceleration from 0.05 to 0.3 s and find the number where the hero stops sliding.
Let a friend solve a level and count how many times they press Z.
Play a fight and note a moment when you wanted the card to respond faster.
Give several orders in a row. Does the marker follow your clicks?
Collect 20 items in a row. Does the “+1” get old? If it does, make it quieter or shorter.
Read one scene at 25, 35 and 50 characters per second. Which speed is yours?
Make three tests using the ±20% buttons. Write down the fire rate you prefer.
Walk through the village with a step of 0.10, 0.13 and 0.18 s. Which feels best?
| criteria | pass |
|---|---|
| Control panel | opens with P, sliders work live |
| My numbers | in CONFIG, survive a reload, saved |
| Words | 3–4 “word → number” pairs in the notebook |
| Player | played before and after, answer written down |
Time: 15 minutes.
- Test a feeling by adjusting a setting. Start with height, rise time, falling speed or the hitbox.
- Turn an impression into a test. “Mushy” might lead you to try a different rise time:
timeToApex 0.35 → 0.28. - Small assists can help the controls. Try a 0.1 s window after the edge and before landing.
- Change one number at a time. Use at least 10% for comparison. Put the values you like into CONFIG and save.
- The choice is yours. Play and decide whether the setting suits this game.
Sources
- Response Times: The 3 Important Limits
- Math for Game Programmers: Building a Better Jump
- Maddy Thorson on the assists in Celeste
- Celeste & Forgiveness
- Celeste's open player code: Source/Player/Player.cs
- Tuning Canabalt
- An Oral History of “Snake” on Nokia
- The Flight of the Birdman: Flappy Bird Creator Dong Nguyen Speaks Out
- Jaime Griesemer: time between shots for the Halo 3 sniper rifle
Next lesson, we'll come up with your own game. The agent will ask questions and build a first draft. For now, think about who you'd like to play as and what you'd like to do.