Midterm Project – Rooftop Rush

Concept

Rooftop Rush is a fast rooftop runner where every second feels like a chase scene. You play as a street runner jumping across city rooftops, dodging obstacles, and grabbing coins while the world keeps speeding up. Since each run is slightly different, you never know exactly what is coming next.

The main idea is simple: the more points you earn, the farther you can jump. At first, your jumps are short and careful. As your score rises, your movement starts to feel powerful and confident. But there is a catch: the city also gets faster. That push and pull is what makes the game exciting.

To keep every run exciting, I added extra moves and features:

  • Double Jump: Jump once more in the air for extra control.
  • Grapple Hook: Swing across very wide gaps using crane points.
  • Wall-Run and Wall-Jump: Use building walls to climb and launch back into the air.
  • Dash: A quick burst forward to escape danger.
  • Slide Kick: Slide into some obstacles to break them and gain points.
  • Tricks: Do flips and spins in the air for bonus points.
  • Near-Miss Bonus: Get rewarded for narrowly avoiding obstacles.
  • Power-ups: Temporary boosts like speed, shield, and coin magnet.
  • Upgrade Shop: Unlock permanent upgrades by playing well over many runs.
  • Day/Night Cycle: The background slowly changes from sunset to night.

Code I Am Proud Of

getJumpForce() {
  let base = CFG.BASE_JUMP * this.jumpMult;
  let bonus = CFG.JUMP_SCORE_K * Math.log(1 + this._score);
  return max(base - bonus, CFG.MAX_JUMP);
}

This is the code I am most proud of because it controls the feeling of the whole game. It decides jump strength each time the player jumps.

In simple terms, the game checks your score and makes your jump stronger as you improve. It also has a safe limit, so the jumps never become wild or unfair. Players can clearly feel their progress, but they still need timing and focus to survive.

How It Was Made

I built Rooftop Rush in p5.js and kept the project organized by splitting it into small parts. One part handles the player, others handle buildings, obstacles, effects, sound, and the game screens.

The hardest part was balancing the jump feel. I wanted players to feel stronger as they scored more points, but I also wanted the game to stay fair. I tested many versions until the movement felt fun, smooth, and controllable.

Another challenge was making movement feel responsive. Wall-running, dashing, grappling, and trick moves all had to work together without glitches. I used AI tools to help with some tricky parts, then tuned and tested everything by hand.

I also made sure random level generation stays fair. Gap sizes and building heights are controlled so the game does not create impossible situations.

The visual style was drawn directly in p5.js, including the runner, skyline, and effects. Sound effects were generated directly in code using p5.js sound tools.

Reflection

This project taught me a lot about game design and creative problem-solving. Keeping the game organized helped me test faster, fix bugs faster, and stay motivated.

I am most proud that the main mechanic works in real playtests. Players could feel their jump getting stronger as they scored more points, which was exactly the feeling I wanted to create.

In the future, I want to add more power-ups, a second playable character, and a mobile version with touch controls. I also want to improve character animation so tricks and wall-runs look even more dynamic.

Play Rooftop Rush

You can play the game directly below:

Live Project URL: https://enockmagara.github.io/Rooftop-Rush/


p5.js v1.9.0 · March 2026 · Intro to IM, NYUAD

Leave a Reply