NICO GUTIERREZ GAME PROGRAMMER
VERTICAL SLICE

ETERNAL JUMP

2D ENDLESS JUMPER

ROLE SOLO DEVELOPER
FRAMEWORK PHASER
PLATFORM PC
TEAM SOLO
DEVELOPMENT 38 DAYS
Eternal Jump gameplay

CLIMB. SURVIVE. GO HIGHER.

Eternal Jump is a 2D endless jumper where the player controls an adventurer equipped with a jetpack. The objective is to climb as high as possible by jumping between platforms, collecting power-ups and avoiding obstacles before falling or running out of time.

SOLO DEVELOPMENT.

Eternal Jump was developed entirely by me as my first academic video game project. I was responsible for both programming and game design throughout the development process.

PROGRAMMING

Gameplay logic, mechanics and implementation using Phaser.

GAME DESIGN

Core gameplay loop, rules, progression and player experience.

SYSTEMS BUILT FROM SCRATCH.

PLAYER SYSTEM

Player movement and control logic implemented using Phaser.

PROCEDURAL GENERATION

Runtime generation of platforms, obstacles and power-ups to support the endless gameplay loop.

GAME FLOW

Score tracking, timer logic, game-over conditions and menu flow.

AUDIO IMPLEMENTATION

Integration of sound effects and audio feedback throughout the gameplay experience.

PROBLEMS WORTH SOLVING.

Three problems from building an endless jumper solo in 38 days, and one thing I would do differently.

CHALLENGE 01

An endless climb with only 10 platforms

PROBLEM
An endless vertical level can't be built in advance, and creating and destroying platforms every few seconds adds allocation and garbage-collection pressure in the browser.
SOLUTION
Ten platforms are created once. When one scrolls past the bottom of the screen it is recycled: moved above the current highest platform with a random vertical gap (150–300px) and horizontal offset (up to ±250px from the centre).
RESULT
A fixed object count for the whole run. The level never ends, but nothing new is allocated for it during gameplay.
// scenes/Game.js (simplified): recycle instead of destroy
if (platform.getBounds().bottom > this.game.config.height) {
    this.positionPlatform(platform);
}

positionPlatform(platform) {
    const top = this.getHighesPlatform();
    platform.y = top - this.randomValue(gameOptions.platformVerticalDistanceRange);
    platform.x = this.game.config.width / 2
        + this.randomValue(gameOptions.platformHorizontalDistanceRange)
        * Phaser.Math.RND.sign();
}
CHALLENGE 02

One-way platforms and a jetpack boost that feels right

PROBLEM
The player has to boost up through platforms from below and land on top of them, and landing points must not be farmable by bouncing on the same platform.
SOLUTION
Each platform only collides on its top face (down, left and right checks are disabled). Gravity (1200 px/s²) applies to the player only, and the jetpack fires a single vertical impulse (960 px/s) from solid ground. A platformTouched flag awards landing points once per boost.
RESULT
Players chain boosts upward without snagging on platform edges, and the score reflects real progress.
CHALLENGE 03

Difficulty that ramps up on its own

PROBLEM
An endless game needs pressure that keeps growing without hand-authored levels.
SOLUTION
A looping timer raises the platform scroll speed every 5 seconds. A 60-second countdown is extended by watch pickups (+15s), while spikes end the run; each can appear on roughly 10% of recycled platforms. The best score persists in localStorage.
RESULT
Runs get harder by themselves, and returning players always have a record to beat.
WHAT I'D IMPROVE

Listeners that outlive their objects

ISSUE
Each power-up subscribes a postupdate listener on the scene to stay aligned with its platform, and that listener is never removed, so listeners pile up as the run goes on.
FIX
Decouple the follow logic from the scene and bind it to the power-up's lifecycle through the event emitter: subscribe on spawn, unsubscribe on destroy. Every listener then lives exactly as long as the object it serves.
// What I'd change: scope the listener to the power-up's lifetime
const follow = () => Phaser.Display.Align.To.TopCenter(powerUp, platform);

this.events.on("postupdate", follow);
powerUp.once("destroy", () => this.events.off("postupdate", follow));

BUILT SOLO.

GAME ART

Designed the player, platforms, obstacles and power-ups used throughout the game.

UI DESIGN

Designed the gameplay interface, score, timer and menu presentation.

STARTED JUNE 15, 2024
COMPLETED JULY 23, 2024
DURATION 38 DAYS
STATUS VERTICAL SLICE
WANT TO TRY IT?

PLAY ETERNAL JUMP.

NEXT PROJECT HÉROE SHOWDOWN →