Guide

Game jump arc and gravity systems explained

Harbor Brawl's movement team shipped a patch that raised jump startup by two frames and buffed three anti-air normals. Neutral did not change: jump-in success at mid-screen stayed at 61%. Telemetry showed players cleared every grounded answer because full hops hung at apex for 11 frames — long enough to steer over crouching AA — while short hops used the same gravity constant and barely differed in height. The real bug was physics, not frame data on individual moves.

After splitting gravity into grounded jump, short-hop, fast-fall, and juggle curves, apex hang time on full hops dropped from 11 to 7 frames and short-hop peak height fell 38%. Jump-in success fell to 49% without touching AA startup. Jump arc and gravity systems are the shared substrate under anti-air windows, divekick angles, safe jumps, and combo juggles. This guide covers the physics parameters designers tune, variable height and squat frames, air control, fast-fall, juggle gravity scaling, the Harbor Brawl refactor, a technique decision table, pitfalls, and a production checklist.

What gravity and jump arcs actually control

Players experience “how floaty a character feels.” Engineers implement that with per-frame vertical velocity updates. Each jump applies an initial upward speed; every airborne frame subtracts a gravity value until vertical velocity crosses zero (apex), then adds gravity downward until landing collision fires.

The arc shape determines:

  • Time-to-apex — how long the hurtbox stays in AA-vulnerable ascent before peak.
  • Peak height — maximum Y offset; sets whether a jump clears projectiles or whiffs over standing pokes.
  • Hang time at apex — frames where vertical speed is near zero; high hang makes jump-ins harder to intercept.
  • Descent speed — how fast the character returns; pairs with landing lag to define safe-jump math.
  • Horizontal drift — air control multipliers applied each frame; wide drift extends crossup threat.

Tweaking one move's startup does not fix a broken arc. If gravity is too low, every aerial option inherits the same floaty hang. If gravity is too high, jump-ins become suicidal and neutral stagnates on the ground.

Core parameters in data

Document these fields per character (or per jump type) in your combat spec so balance passes do not require code archaeology:

Initial vertical velocity (jump_v0)

Pixels per frame applied on the first airborne frame after jump squat. Higher jump_v0 raises apex; does not alone fix hang time if gravity is low.

Gravity constant (grav_air)

Subtracted from upward velocity, added to downward velocity, each frame. Linear gravity is standard; some games use piecewise curves (stronger gravity below apex, weaker above) to shorten hang without lowering peak.

Terminal velocity (vy_max)

Cap on downward speed. Prevents fast-fall from breaking safe jump timing when combined with low jump attacks.

Air control (air_accel, air_friction)

Horizontal acceleration while airborne and decay when input releases. High air control stretches crossup routes; zero air control makes jump trajectories deterministic from takeoff position.

Jump squat frames

Grounded frames before velocity applies. Longer squat gives defenders time to react; shorter squat enables instant-air routes. Variable-height jumps read button hold duration during squat and scale jump_v0 at release.

Export debug overlays: plot Y position vs frame for full hop, short hop, and fast-fall descent. Compare across roster before tuning individual normals.

Full hop vs short hop gravity multipliers

Platform fighters popularized distinct short-hop arcs; traditional fighters often implement them as a fraction of jump_v0 with an optional gravity multiplier. Common patterns:

  • Velocity-only short hopshort_v0 = jump_v0 * 0.55; same grav_air. Simple but short hops still hang if gravity is globally low.
  • Velocity + gravity short hop — lower short_v0 and higher grav_air_short (e.g. 1.35x). Produces snappy low arcs ideal for divekick and tiger-knee setups.
  • Input-gated hop — tap jump within 3f for short, hold for full. Requires distinct state flags so empty hops share startup animation with real jumps.

Short hops should reach a different spacing band than full hops, not merely a lower peak. Target: short hop apex under standing AA height but above crouch block; full hop apex inside AA intercept window for at least 4 frames on ascent.

Variable jump height and fast-fall

Variable height (hold vs tap)

Measure hold duration during squat or early ascent; map to jump_v0 on a curve (linear, stepped tiers, or min/max clamp). Minimum height should still clear low pokes; maximum should not exceed double-jump routes. Release-to-cut velocity mid-ascent is an alternative: zeroing upward vy when the player releases jump shortens apex without changing squat timing.

Fast-fall

Down + jump (or dedicated fast-fall input) multiplies gravity after apex or at any airborne frame. Typical multiplier: 1.8x–2.5x grav_air. Fast-fall enables SHFF (short-hop fast-fall) for grounded pressure and alters anti-air timing: defenders must distinguish full-hop hang from snap descent.

Gate fast-fall during hitstun and during certain attack animations to prevent accidental escape from juggle routes. Document whether fast-fall cancels active jump normals or only applies during neutral air.

Juggle gravity scaling

Combo juggles often use a separate gravity curve so launches remain readable without infinite float. Patterns:

  • Hit-count multiplier — each juggle hit adds +8% gravity; caps at 2.0x base. Pairs with juggle launch and limit systems.
  • State-based gravity — launcher applies grav_juggle = 0.7x for 30f, then snaps to 1.2x. Sells launch pop before forcing descent.
  • OTG gravity override — ground bounce and OTG attacks temporarily raise gravity so relaunches do not stack infinite hang.

Juggle gravity must be deterministic in rollback: use integer math or fixed-point; log gravity tier per hit for replay debugging.

Worked example: Harbor Brawl movement refactor

Problem. Full-hop and short-hop shared grav_air = 0.42 px/frame² with jump_v0 = 14.5. Short-hop used short_v0 = 8.2 only. Apex hang (|vy| < 0.5) lasted 11f on full hops; AA normals with 6f startup could not intercept ascent unless the defender pre-read. Jump-in rate dominated neutral telemetry.

Refactor steps.

  1. Piecewise gravity: ascent uses grav_air = 0.48; descent after apex uses grav_air_desc = 0.56 unless fast-fall active.
  2. Short-hop package: short_v0 = 7.4, grav_air_short = 0.62 (both ascent and descent).
  3. Fast-fall: 2.1x multiplier from frame 8 airborne; terminal vy_max = 18 px/f.
  4. Air control: reduced from 0.85 to 0.62 max horizontal drift on full hops only; short hops unchanged for rushdown identity.
  5. Juggle tier: +10% gravity per juggle hit after hit 3, cap 1.9x; documented in move JSON.
MetricBeforeAfter
Full-hop apex hang frames117
Short-hop peak height (px)14288
Mid-screen jump-in success61%49%
AA punish on jump attempts22%34%
Avg juggle length (hits)6.86.1

No individual AA move changed. Neutral shifted because arcs intersected defensive tools again. Rushdown short-hop offense remained viable at a lower, distinct spacing band.

Technique decision table

Design goalBest approachWeak when
Readable neutral jump threat Piecewise gravity + distinct short-hop curve You need floaty platformer exploration jumps
Uniform roster feel Shared grav_air, per-char jump_v0 only Rushdown vs zoner need different aerial texture
Low-commitment aerials Short hop + high grav_air_short Game has no fast grounded low attacks
Long combo juggles Reduced juggle gravity early, scaling after hit 4+ Infinite prevention systems are weak
Deterministic jump traps Zero air control, fixed jump_v0 Crossup and steering mixups are core
Fix jump-in meta without AA buffs Reduce apex hang and raise descent gravity Problem is actually plus-on-block jump normals
Flat jump speed tweak only Never as sole lever Always — arc shape drives AA windows

Common pitfalls

  • Same gravity for short and full hop — short hops become cosmetic; players cannot route distinct spacing.
  • Low gravity globally — every character inherits broken hang; AA and projectiles require per-move band-aids.
  • Fast-fall during hitstun — players escape juggles; gate explicitly.
  • Floating-point drift in netcode — desynced Y position breaks combo gravity tiers; use fixed-point.
  • Ignoring landing collision frame — gravity continues one frame past visual touchdown; skews safe-jump tests.
  • Tuning jumps before documenting squat — variable height bugs read as random arc variance in playtests.
  • Juggle gravity without limit system — low gravity plus scaling still produces infinite loops.

Production checklist

  • Define jump_v0, grav_air, vy_max, and air control per character in data.
  • Split short-hop velocity and gravity multipliers; verify distinct peak heights in debug plot.
  • Implement variable height or release-to-cut if the game supports it; document min/max apex.
  • Configure fast-fall multiplier, input gate, and hitstun restrictions.
  • Add juggle gravity tiers linked to hit count or launcher state.
  • Plot Y-vs-frame for full hop, short hop, fast-fall, and juggle launch.
  • Test AA intercept windows against ascent phase, not just peak height.
  • Validate safe-jump advantage after gravity changes.
  • Run rollback determinism tests on gravity state transitions.
  • Telemetry: track jump type distribution, apex hang duration, AA punish rate per hop class.

Key takeaways

  • Jump arc shape — apex hang, peak height, and descent speed — is the shared layer under anti-air, divekicks, safe jumps, and juggles.
  • Short hops need their own gravity curve, not just a lower initial velocity, or they inherit the same floaty neutral problems as full hops.
  • Piecewise gravity (stronger on descent) shortens hang time without making jump-ins feel weightless on ascent.
  • Harbor Brawl cut full-hop apex hang from 11 to 7 frames and dropped jump-in success from 61% to 49% without buffing any anti-air move.
  • Document physics parameters in data, plot arcs in debug, and test netcode determinism before tuning individual move frame data.

Related reading