Game Feel · Blog
Game controller close-up with dramatic lighting
Photo: Kamil Čičila / Pexels
Contents6
  1. Why It Works
  2. The Recipe
  3. The Code
  4. Tuning Tips & Common Mistakes
  5. Famous Examples
  6. FAQ

Hit stop freezes both the attacker and the target for a few dozen milliseconds the moment an attack connects. That tiny pause is why a sword strike in a polished game feels like it lands instead of passing through fog.

35 mslight hit freeze≈ 2 frames at 60 fps
70 msheavy hit freeze≈ 4 frames at 60 fps
120 msthreshold where freeze reads as a dropped frame
0.05minimum safe Engine.time_scaleavoids physics division-by-zero
Game controller close-up with dramatic lighting
Game controller close-up with dramatic lighting — Photo: Furkan Salihoğlu / Pexels

Why It Works

Your brain interprets a momentary freeze as resistance. When time stops for 70 ms, it reads as: this object had mass, the blow had consequence. Remove the freeze and every attack feels like swinging through air regardless of your animation or particles.

Two things the freeze buys you:

  • Perception time. It gives the player's eye a frame to register the contact and the hitflash before motion resumes.
  • Input safety. Hit stop freezes the simulation, not the input queue — a press during the freeze is registered normally the moment it ends (swordarcade.xyz).
Recommended hit stop duration by hit weight
Light hit
ms35
Medium hit
ms55
Heavy hit
ms70
Critical / perfect
ms90
Too long — lag spike
ms120
swordarcade.xyz
Slow-motion frozen moment in action
Slow-motion frozen moment in action — Photo: Skyler Ewing / Pexels

The Recipe

ParameterStarting valueRangeWhat it changes
duration (light)0.035 s0.02 – 0.05 sJab, ranged shot
duration (heavy)0.07 s0.05 – 0.10 sSword, hammer swing
duration (critical)0.09 s0.08 – 0.12 sFinisher, parry counter
scale0.050.0 – 0.150 = hard freeze · 0.1 = heavy slow-mo
Hitflash2–3 frames1 – 5 framesWhite/color overlay on the target
Vibration±3 px horizontal±1 – 5 pxAttacker shakes during the freeze

Never use scale = 0.0 with CharacterBody2D/3D on moving platforms. Godot's physics divides by zero and nodes can teleport. Use 0.02 as your hard floor.

Perceived time flow at different Engine.time_scale values
Hard freeze (0.02)
%2
Soft freeze (0.05)
%5
Slow-mo (0.10)
%10
Subtle (0.25)
%25
Normal (1.0)
%100
Godot 4 docs
Pixel art sword attack sparks
Pixel art sword attack sparks — Photo: Artem Podrez / Pexels

The Code

Add HitStop.gd as an Autoload (Project → Project Settings → Autoload).

# HitStop.gd — Autoload as "HitStop"
extends Node

## Freeze the game briefly to sell a hit's weight.
## duration : real-time seconds (0.035 light · 0.07 heavy · 0.09 crit)
## scale    : Engine.time_scale during freeze (0.05 = near-stop, 0.1 = slow-mo)
func freeze(duration: float = 0.07, scale: float = 0.05) -> void:
	Engine.time_scale = maxf(scale, 0.02)   # never go below 0.02 (physics safety)

	# CRITICAL: the 4th argument (ignore_time_scale = true) makes the timer run
	# in real time. Without it your 0.07 s freeze lasts ~3.5 s at scale 0.02.
	await get_tree().create_timer(duration, true, false, true).timeout

	Engine.time_scale = 1.0

Call it wherever an attack lands — typically in a hitbox's body_entered signal:

# In your weapon node or hitbox Area2D
func _on_hitbox_body_entered(body: Node2D) -> void:
	if not body.is_in_group("enemy"):
		return

	var is_crit: bool = randf() < crit_chance
	body.take_damage(damage * (2.0 if is_crit else 1.0))

	if is_crit:
		HitStop.freeze(0.09, 0.02)   # critical — near-hard freeze
	else:
		HitStop.freeze(0.07, 0.05)   # normal heavy hit
Game developer coding on a screen at night
Game developer coding on a screen at night — Photo: cottonbro studio / Pexels

Tuning Tips & Common Mistakes

Scale by damage, not just hit type. If your heavy sword does 10× more damage than a jab, its freeze should feel 2–3× longer, not identical. Sakurai ties hit stop directly to damage in Smash Bros. — high-damage moves automatically get more freeze (sourcegaming.info, Nov 2015).

Keep projectiles shorter. Bullets and arrows read as fast and light — give them 20–30 ms max, or no freeze at all. A frozen crossbow bolt looks wrong.

Combine, don't replace. Hit stop works best alongside a hitflash (white modulate for 2 frames), a sound with a sharp transient, and a screen shake. Any one effect alone is subtle; together they stack into something players feel.

Multiplayer caveat. If you pause Engine.time_scale globally, every player freezes. In co-op or versus that can feel unfair. For multiplayer: pause only the attacker and target nodes using a custom hitstop_frames counter in their _physics_process.

Common mistake — forgetting ignore_time_scale. It's the single most-reported hit stop bug in Godot. The default is false, which means the timer ticks in scaled time and your freeze runs forever. Always pass true as the 4th argument.

Retro arcade cabinet lit up at night
Retro arcade cabinet lit up at night — Photo: Dan Butler / Pexels

Famous Examples

Super Smash Bros. series (Masahiro Sakurai): Hit stop is documented directly by Sakurai in his Famitsu column (vol. 490, Nov 2015 — translated by sourcegaming.info). Key design choices: damage scales the freeze duration; Marth's sword tip gets more freeze than its blade to reward precision; Ryu's moves have extra-long freeze to recreate Street Fighter II's feel; electric attacks get an automatic hitstop bonus. Both attacker and target vibrate during the freeze (horizontal if grounded, vertical if airborne) while their hurtboxes stay fixed to prevent phantom hits.

Vlambeer (Nuclear Throne, Luftrausers): Jan Willem Nijman's "The Art of Screenshake" (INDIGO Classes 2013) demonstrates how layering freeze with screenshake, muzzle flash, and recoil transforms a flat shooter into something that feels like it's firing back at you. Hit freeze is one of the first effects added in the demo.

Hollow Knight (Team Cherry): The knockback + hitstop combination in Hollow Knight is intentional. Players and enemies both push away after the freeze, so the contact moment reads as impact first, consequence second — a deliberate sequencing choice by Team Cherry.

Fighting game joystick arcade stick
Fighting game joystick arcade stick — Photo: mingche lee / Pexels

FAQ

Does hit stop work in top-down RPGs, not just fighters?

Yes. Any attack benefits — sword swings, spells, even a shovel hitting dirt. Scale duration to context: a spell might warrant 60 ms, a melee critical 90 ms.

Will hit stop cause frame-rate drops?

No. Engine.time_scale slows the simulation, not the renderer. Your GPU keeps drawing frames at full rate; the game logic just runs slower for a moment.

Can I hit-stop without pausing the whole game?

Yes, with more code. Use a hitstop_frames: int counter on each node. In _physics_process, if the counter is > 0, decrement it and return without running any logic. This lets music, particles, and UI run normally — the approach used in many commercial action games.

What about audio — does hit stop slow sound effects?

Yes if you use AudioServer.time_scale (not set by default). Most devs keep audio at 1.0 and only scale the game simulation, so sounds play at normal pitch during the freeze.


Hit stop is the difference between a hit that reads and one that lands. Add the Autoload, wire it to your first hitbox, and your game will feel heavier before you change a single animation frame. Stack it with screen shake and a sound with punch, then browse the full Game Feel Cookbook for the next layer.