Inspiration
We wanted a party game where phone motion is the whole game, not just a gimmick. Steering with a tilt is common, but what if tilting your phone actually tilted the world? A rider who always stays upright in the real world while the ground swings under them turned out to be really funny to watch, and surprisingly hard to master.
What it does
- Your phone is the ground. Hold it sideways and the course tilts 1:1 with your phone. Your unicyclist stays upright in the real world, so tilting the ground makes them roll downhill.
- Steeper = faster, until it isn't. Lean past about 50° (less on mud, sand, quicksand or slick metal) and you wipe out. Your phone shows a live balance meter.
- Land level. In the air your tilt still steers gravity. A level landing gives you a PERFECT speed boost, a crooked one is SLOPPY and loses speed, and a way-off one is a crash.
- Rivalry built in. Once you finish you become a Gravity God: your tilt now tips everyone else's world. Lead changes, crashes and perfect landings get called out live on the big screen.
- Group play for 1–6. The big screen shows the whole map in three rows. Every phone renders its own close-up landscape view, with the other riders as ghosts. You join by scanning a QR code, no app install.
- Three worlds, one Grand Prix: Sunny Grassland, Low-Gravity Space (0.4× gravity, slick metal) and Dusty Desert (loose sand, quicksand). Each has its own moving obstacles (tire swings, beach balls, energy gates, tumbleweeds), bounce pads, gaps and moving platforms.
- Designed against "tilt and hold". Holding one angle the whole race crashes you on the drops, stalls you on the climbs and makes you land sloppy. In 18 bot-test races with the current version, riders holding a fixed tilt won 0.
How we built it
- Phaser 3 + Matter.js on the host laptop runs all the physics (host-authoritative). Each rider is a frictionless, infinite-inertia wheel, and its gravity points wherever that player's phone says.
- Socket.IO + Express relay: phones send their tilt about 30×/s, and the host streams snapshots 20×/s. Phones render about 0.1 s in the past and interpolate on the host's clock, with a delay that adapts to network jitter, so everything glides.
- Tilt sensing:
deviceorientationangles are rebuilt into a gravity vector and measured against the screen's landscape axis, so the course tilt equals your phone tilt with no calibration. - Shared track code: both sides build the identical course from a feature list, and moving obstacles are a pure function of race time, so the geometry never goes over the network.
- Cartoon art: a procedural rider/unicycle rig cached as texture layers. Terrain is baked to textures on the big screen to keep it at 60 fps.
- A bot test harness races bots and "fixed-tilt holders" at full speed to check balance after every change.
Challenges we ran into
- Phones drop motion sensors on plain HTTP, and venue Wi-Fi blocks devices from reaching each other. We fixed both with a Cloudflare tunnel.
- iOS flips the page to portrait mid-race when you tilt far, so we counter-rotate the game to keep it glued to the phone.
- "Tilt and hold" kept winning early on. We redesigned the crash and landing rules and added low-grip surfaces and timing obstacles until skill won.
- Performance: Phaser builds each vector circle from about 600 points, which made the space world crawl. We moved to textures and baked terrain.
- Network lag made landings feel unfair, so the host judges them with your most level tilt from the last 0.25 s.
Accomplishments that we're proud of
- It's genuinely fun to watch: the rider stays upright while everyone frantically tilts their phones.
- Smooth 60 fps play on phones over the internet.
- Bot-tested balance, so skill beats a fixed tilt.
What we learned
Real-time multiplayer interpolation, device orientation math, physics tuning for game feel, and how much playtesting changes a design.
What's next for Cyclepathic Rodeo
More worlds with their own physics twists (factory conveyors, underwater buoyancy, rocking pirate ships, wind), map voting from the phones, and an endless mode.
Log in or sign up for Devpost to join the conversation.