Making a hover car feel like it flies: notes from a Godot 4 runner

CGT Rocket X Racer is a fan-made, desktop-only rocket-car runner we have been building in Godot 4. It is not affiliated with any car maker. You steer a hovering car through a giant factory: lane changes, jumps, rolls and a boost, with presses and robot arms trying to ruin your run. This post is about three problems that turned out to matter far more than we expected: making the car feel airborne, switching between indoor and outdoor sections without breaking the camera, and proving that every obstacle is actually fair. 1. Flight feel is mostly about thrust you can see Our first builds had a car that simply floated at a fixed height above the track. It worked, but it looked like a sticker sliding on glass. The fix was not physics, it was feedback. Continuous underbody jets. The car always has mist jets running underneath it. They never turn off, so the player's eye always has something tying the car to the ground below. That alone made the hover height believable. Nozzles

Making a hover car feel like it flies: notes from a Godot 4 runner

CGT Rocket X Racer is a fan-made, desktop-only rocket-car runner we have been building in Godot 4. It is not affiliated with any car maker. You steer a hovering car through a giant factory: lane changes, jumps, rolls and a boost, with presses and robot arms trying to ruin your run. This post is about three problems that turned out to matter far more than we expected: making the car feel airborne, switching between indoor and outdoor sections without breaking the camera, and proving that every obstacle is actually fair.

1. Flight feel is mostly about thrust you can see

Our first builds had a car that simply floated at a fixed height above the track. It worked, but it looked like a sticker sliding on glass. The fix was not physics, it was feedback.

Continuous underbody jets. The car always has mist jets running underneath it. They never turn off, so the player's eye always has something tying the car to the ground below. That alone made the hover height believable.

Nozzles that sit where they should. The car model has named marker nodes for every nozzle. At import time a post-import script merges the meshes by material but keeps those markers, and the car script reads the nozzle positions from the imported model at runtime. We moved the side nozzles back behind the front wheel arch so side mist reads as steering rather than exhaust. Then we wrote a small check tool that renders the car and confirms every mist emitter sits exactly on its marker. It sounds pedantic, but when skins swap the car model, the nozzles still line up, because both the base car and the skins are read the same way.

A boost with no cooldown. This is the rule in the current build, and it went through several iterations before we were happy with it:

  • A tap boosts for 1.5 seconds, ramping linearly up to 370.
  • Holding the button keeps boosting at about 370, and it holds there.
  • When you release, speed eases back down to natural speed over 1 second.
  • It behaves the same indoors and outdoors.

We tried cooldown-based boosts earlier. They made players wait instead of play. Removing the cooldown and putting the skill into when you release turned boost into a steering tool: you feather it to line up a gap, then let it ease off before a hazard. The linear ramp matters too. An instant jump to top speed felt like a teleport; a short ramp feels like thrust building.

Small, cheap juice. Pickups get a short sparkle burst parented to the car so it keeps up at high speed, and the coin itself pops in scale for a fraction of a second. A crash is a single screen flash (no strobe) plus a short decaying camera shake. None of this is expensive, and all of it adds to the sense of speed.

2. Indoor and outdoor switching

The route is one long closed loop through a factory site made of many separate hall models. The run keeps alternating: inside a hall, burst out above the roofs, fly through a big SUPER FACTORY sign tower, dive back in, and eventually fly into an end garage where the car brakes, hovers and the camera orbits before the results screen.

Three things made this workable.

Streaming and LOD. Each hall exists as a detailed "near" model and a cheap "far" shell. A site streamer loads halls on a background thread and swaps LOD by distance. Without this, flying above the roofs, where you can suddenly see everything, would tank the frame rate.

A rail-locked camera, with its own test. The camera follows the route frame rather than free physics. Transitions between tight halls and open sky are exactly where cameras clip into walls, so we added a dedicated camera test mode that flies the whole loop in all three lanes and reports clipping. Running it after every route change is far cheaper than finding clipping by hand.

Outdoors changes the look, not the rules. Outside, the sky is brighter and there is much less fog, so leaving a hall feels like a release. We deliberately do not change speed outdoors, and boost behaves exactly the same. Players should never have to relearn the controls because the ceiling disappeared.

3. Proving obstacles are fair

Runners live or die on fairness. If a player crashes and thinks "that was impossible", they quit. So we stopped trusting our eyes and started auditing.

Collision that matches the visuals. The car uses three oriented boxes fitted to its body, including during banking and barrel rolls. Obstacles use boxes attached to their animated nodes: the press head, posts, top beam and die plate; the arm's upper arm, forearm, wrist and gripper. Because collision reads the same transforms as the visuals, there is no invisible hitbox. On a hit, the car and the obstacle clock are bisected back to the moment of contact and frozen, so nothing is ever drawn inside the car on the crash screen.

Deterministic obstacle timing. The robot arm animation is sampled by the car's distance along the track, not by wall-clock time. That means every arm pattern has fixed safe lanes and jump windows at any speed, which makes them auditable.

An audit mode. A headless audit run tests every press pattern at every phase of its cycle at several speeds, and checks that the free lane is never hit. It also measures arm jump windows and rejects patterns where the window is too short to be fair. Indoor arm patterns always leave a stay-safe lane.

Pickups never sit inside danger. Each candidate coin or part is tested against the obstacle's boxes over its whole motion, and dropped if it touches. Nothing is worse than a coin that baits you into a press.

Debuffs with their own colors. Besides presses and arms there are debuffs such as red tape, a roadside media wave, an approval gate and a charging bear. Each has a distinct warning color family, so players can read what is coming before they reach it.

A few smaller notes

  • Everything runs on Godot's Compatibility renderer, and the web build uses the no-threads template, so it runs from a plain static host with no special headers.
  • Along the way you collect five part types: body, chip, motor, thrust and energy.
  • There are ten skins in the current build; confirming a skin saves it and applies it to the car.

Try it

If you want to feel the boost rule for yourself, CGT Rocket X Racer is playable in a desktop browser (desktop-only for now):

https://www.cgt.monster/x/devto · invite code 48WYTRMMDW

Fan-made · Not affiliated · Desktop-only. Feedback on flight feel and obstacle readability is the most useful thing you can send us.

Share