Techoship

Gaming · own product · 2026

2D Platformer Game

A 2D platformer where the level exists twice.

  • Flutter
  • Dart
  • Game Development
  • Game Design
  • Mobile Game Development
2D Platformer Game — Gaming · own product

A 2D platformer where the level exists twice. You run through the physical world and can shift into a phase version of the same space — different platforms, different gaps, different route. The jump you couldn't make was only ever possible in the other one. Shifting costs energy that refills only while grounded. Underneath sits the part players never see but always feel: coyote time, input buffering, variable jump height, and a filter that stops an accidental wall brush firing a wall jump. Physics, collision and the phase system written from scratch.

2D Platformer Game — The mechanic

The mechanic

The player starts in the Physical world. Shifting to Phase costs 15% energy, regenerating at 8% per second and only while grounded. Running out mid-shift triggers a force-return: snap back to Physical, stunned for a third of a second.

The shift itself is instant. The 150 ms visual transition is cosmetic and doesn't block movement — a decision that matters, because a shift that locks you mid-air would make precision platforming feel unfair.

A 200 ms echo window after shifting back keeps Phase objects collidable, so you don't fall through a platform you were just standing on.

2D Platformer Game — Game feel is a set of forgiveness windows

Game feel is a set of forgiveness windows

Walk off a ledge and you can still jump for 100 milliseconds afterwards. Without it, players swear the button didn't register.

Press jump up to 120 milliseconds before landing and it fires the moment you touch down, instead of being thrown away.

A tap gives a 42-pixel hop, a hold gives 85 — releasing early adds extra gravity rather than cutting velocity dead.

Brush a wall for one frame during a normal jump and nothing happens; slide for three frames and a wall jump arms. That 50-millisecond filter was added after a playtest where jumping past a platform's edge kicked the player away from it.

2D Platformer Game — Every number tuned by hand

Every number tuned by hand

Run at 180 px/s with 1300 acceleration and 1700 deceleration. Jump at 520 with 1600 gravity. Wall slide capped at 120 px/s. Wall jump 480 up and 300 away, with a 100 ms re-grab lock. Dash covers 350 pixels in 0.15 seconds — 2333 px/s — with sub-stepped collision so it can't tunnel through geometry.

The movement speed was deliberately reduced from an earlier build: at the old values the character crossed roughly 17 body-widths per second, too fast to control on a touchscreen. It was retuned to roughly Celeste's pace for a more deliberate, precision-friendly feel.

The hitbox is 16×24 under a 32×32 sprite frame, so what looks like a near-miss actually is one.

2D Platformer Game — Generated as you run at it

Generated as you run at it

Nothing is hand-placed past the opening. Geometry is assembled from patterns into chunks, streamed in as the player approaches the right edge and despawned once they're far enough past, so memory stays flat whether a run lasts 30 seconds or 30 minutes.

The pool of patterns the generator can draw from widens with total distance travelled, so difficulty climbs without spiking. The first chunk is always a safe starting zone. Checkpoints, energy orbs, hazards and phase gates are placed by the patterns themselves, so pacing comes out of the generator rather than being sprinkled on top.

2D Platformer Game — How it's put together

How it's put together

Flutter and Flame, with a component-and-system architecture — collision, input, phase and touch controls each isolated — and a UI layer handling menus, pause, HUD and game-over as its own state machine. The only dependencies are Flame, flame_audio and shared_preferences; everything else is written.

Every value that affects how the game feels lives in one constants file, with a note beside it recording what it used to be and why it changed. The rule at the top of that file is "never hardcode game values inline", and a companion document is kept in sync with it.

244 assets: twelve parallax layers per chapter across seven chapters, an original seven-track score, and full SFX.

This is a polished vertical slice rather than a released game — built to prove the mechanic and the feel.