Inspiration
We wanted to capture the punishing but incredibly rewarding flow-state of classic precision platformers (like Geometry Dash or Super Meat Boy), but inject it with a dark, cyberpunk hacker aesthetic. We were inspired by the idea of a digital world actively collapsing around the player—where the only way to survive is to literally break the rules of the game's physics by phasing through solid matter and flipping gravity itself. Thus, N U L L was born.
What it does
N U L L is a high-speed, autorunning glitch platformer. You play as a rogue entity navigating a terminal that is slowly being consumed by a digital void. As you run, you must:
- Phase (Z) through volatile, corrupted blocks before they crush you.
- Flip Gravity (X) to walk on ceilings and dodge impossible spike pits.
- Jump (Space) to clear gaps and ride gravity orbs.
The game features 9 hand-crafted levels of increasing difficulty, culminating in Level 0.8: VOID, an endless, randomly-generated gauntlet where the speed exponentially scales every frame you survive.
How we built it
We built the entire game engine from scratch using pure Vanilla JavaScript and the HTML5 Canvas API. We purposefully avoided heavy game engines (like Unity or Godot) to keep the project incredibly lightweight and fast.
- Rendering: All graphics, including the CRT scanlines, static zones, and glowing particle effects, are drawn mathematically on the canvas using custom blending modes (
globalCompositeOperation). - Physics Engine: We wrote a custom AABB (Axis-Aligned Bounding Box) collision detection system that natively supports inverse gravity and "phasing" states.
- Save System: We integrated the browser's native
sessionStorageAPI so the game perfectly resets the session upon closing, maintaining a true arcade feel.
Challenges we ran into
One of our biggest hurdles was building a physics system that could handle instant gravity flips without catapulting the player out of bounds or clipping them through floors. Because the game scrolls automatically, collision calculations had to be frame-perfect to prevent unfair deaths.
Another massive challenge was creating the "Static Zones" (areas where the screen is blinded by heavy CRT noise). Getting the static to look authentically glitched without completely destroying the game's performance required heavily optimizing the Math.random() canvas fill loops.
Accomplishments that we're proud of
We are incredibly proud of the game feel. The controls are tight and responsive, and dying feels fair rather than frustrating. We are also incredibly proud of the visual aesthetic. By utilizing CSS vmin math and canvas filtering, we ensured the game perfectly letterboxes to a cinematic 16:9 ratio on any screen, from ultra-wide monitors to tiny iframe embeds.
What we learned
Building a game engine entirely from scratch taught us an immense amount about the browser's rendering pipeline. We learned how to structure a requestAnimationFrame loop efficiently, manage dynamic garbage collection for thousands of active particle effects, and manipulate localStorage and sessionStorage for state management.
What's next for N U L L
We want to expand the glitch mechanics! We plan to introduce:
- Boss Fights: Giant corrupted code blocks that chase you through the level.
- Level Editor: Allowing players to build and share their own glitched-out courses.
- Global Leaderboard: To track the highest survival times in the Endless VOID mode.
Built With
- canvas-api
- css3
- html5
- javascript
- web-audio-api
Log in or sign up for Devpost to join the conversation.