Game Feel · Blog
Manette de jeu en gros plan avec un éclairage dramatique
Photo: Kamil Čičila / Pexels
Sommaire6
  1. Pourquoi ça marche
  2. La recette
  3. Le code
  4. Réglages fins & erreurs classiques
  5. Exemples dans des jeux connus
  6. FAQ

Le hit stop — ou gel d'image — fige simultanément l'attaquant et la cible pendant quelques dizaines de millisecondes au moment précis de l'impact. Cette toute petite pause est ce qui différencie un coup qui arrive d'un coup qui traverse votre ennemi comme du brouillard.

35 msgel coup léger≈ 2 images à 60 ips
70 msgel coup lourd≈ 4 images à 60 ips
120 msseuil où le gel ressemble à un freeze réseau
0.05Engine.time_scale minimal sûrévite une division par zéro physique
Manette de jeu en gros plan avec un éclairage dramatique
Manette de jeu en gros plan avec un éclairage dramatique — Photo: Furkan Salihoğlu / Pexels

Pourquoi ça marche

Votre cerveau interprète un gel momentané comme de la résistance. Quand le temps s'arrête 70 ms, il lit : cet objet avait de la masse, le coup avait un sens. Supprimez le gel et chaque attaque passe à travers l'ennemi, quelle que soit la qualité de votre animation ou de vos particules.

Deux choses que le gel vous offre :

  • Temps de perception. L'œil a une image pour enregistrer le contact et le hitflash avant que le mouvement reprenne.
  • Sécurité des inputs. Le hit stop gèle la simulation, pas la file d'inputs — une touche appuyée pendant le gel est enregistrée normalement dès sa fin (swordarcade.xyz).
Durée de hit stop recommandée selon le type de coup
Coup léger
ms35
Coup moyen
ms55
Coup lourd
ms70
Critique / parfait
ms90
Trop long — ressemble au lag
ms120
swordarcade.xyz
Moment figé au ralenti dans un jeu d'action
Moment figé au ralenti dans un jeu d'action — Photo: Skyler Ewing / Pexels

La recette

ParamètreValeur de départPlageCe que ça change
duration (léger)0,035 s0,02 – 0,05 sJab, tir à distance
duration (lourd)0,07 s0,05 – 0,10 sÉpée, marteau
duration (critique)0,09 s0,08 – 0,12 sFinisseur, contre-parade
scale0,050,0 – 0,150 = gel dur · 0,1 = ralenti pesant
Hitflash2–3 images1 – 5 imagesOverlay blanc/couleur sur la cible
Vibration±3 px horizontal±1 – 5 pxL'attaquant tremble pendant le gel

N'utilisez jamais scale = 0.0 avec un CharacterBody2D/3D sur une plateforme mobile. La physique de Godot divise par zéro et les nœuds peuvent se téléporter. Utilisez 0.02 comme plancher absolu.

Écoulement du temps perçu selon Engine.time_scale
Gel dur (0,02)
%2
Gel doux (0,05)
%5
Ralenti (0,10)
%10
Subtil (0,25)
%25
Normal (1,0)
%100
docs Godot 4
Attaque épée en pixel art avec des étincelles
Attaque épée en pixel art avec des étincelles — Photo: Artem Podrez / Pexels

Le code

Ajoutez HitStop.gd en Autoload (Projet → Paramètres du projet → Autoload).

# HitStop.gd — Autoload nommé "HitStop"
extends Node

## Gèle brièvement le jeu pour donner du poids à un coup.
## duration : secondes en temps réel (0.035 léger · 0.07 lourd · 0.09 critique)
## scale    : Engine.time_scale pendant le gel (0.05 = quasi-arrêt, 0.1 = ralenti)
func freeze(duration: float = 0.07, scale: float = 0.05) -> void:
	Engine.time_scale = maxf(scale, 0.02)   # jamais sous 0.02 (sécurité physique)

	# CRITIQUE : le 4e argument (ignore_time_scale = true) force le timer à tourner
	# en temps réel. Sans lui, votre gel de 0.07 s dure ~3.5 s à scale 0.02.
	await get_tree().create_timer(duration, true, false, true).timeout

	Engine.time_scale = 1.0

Appelez-le quand une attaque touche — typiquement dans le signal body_entered d'une hitbox :

# Dans votre nœud d'arme ou votre Area2D de hitbox
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)   # critique — gel quasi-total
	else:
		HitStop.freeze(0.07, 0.05)   # coup lourd normal
Développeur de jeu codant sur un écran la nuit
Développeur de jeu codant sur un écran la nuit — Photo: cottonbro studio / Pexels

Réglages fins & erreurs classiques

Scalez selon les dégâts, pas seulement le type. Si votre épée lourde inflige 10× plus de dégâts qu'un jab, son gel devrait sembler 2–3× plus long. Sakurai lie directement la durée du hit stop aux dégâts dans Smash Bros. — les coups à fort dégât obtiennent automatiquement plus de gel (sourcegaming.info, nov. 2015).

Raccourcissez pour les projectiles. Les balles et les flèches se lisent comme rapides et légères — donnez-leur 20–30 ms maximum, ou aucun gel. Un carreau d'arbalète qui se fige fait bizarre.

Combinez, ne remplacez pas. Le hit stop fonctionne mieux avec un hitflash (modulate blanc sur 2 images), un son à l'attaque franche et un screen shake. Chacun seul est subtil ; ensemble ils se cumulent en quelque chose que les joueurs ressentent.

Mise en garde multijoueur. Mettre Engine.time_scale en pause gèle tous les joueurs. En coop ou en versus c'est perçu comme injuste. Préférez un compteur hitstop_frames: int par nœud dans _physics_process.

Erreur classique — oublier ignore_time_scale. C'est le bug de hit stop le plus signalé sous Godot. La valeur par défaut est false, le timer tourne en temps scalé et le gel ne se termine jamais. Passez toujours true en 4e argument.

Borne d'arcade rétro illuminée la nuit
Borne d'arcade rétro illuminée la nuit — Photo: Dan Butler / Pexels

Exemples dans des jeux connus

Super Smash Bros. (Masahiro Sakurai) : Le hit stop est documenté directement par Sakurai dans sa colonne Famitsu (vol. 490, nov. 2015 — traduite par sourcegaming.info). Les choix de design : les dégâts scalent la durée ; la pointe de l'épée de Marth a plus de gel que la lame pour récompenser la précision ; Ryu a un gel extrêmement long pour recréer la sensation de Street Fighter II ; les attaques électriques obtiennent un bonus automatique. Attaquant et cible vibrent pendant le gel (horizontalement au sol, verticalement en l'air) pendant que leurs hurtboxes restent fixes.

Vlambeer (Nuclear Throne, Luftrausers) : La conférence de Jan Willem Nijman "The Art of Screenshake" (INDIGO Classes 2013) montre comment superposer gel, screenshake, muzzle flash et recul transforme un shooter quelconque en quelque chose qui semble tirer en retour. Le gel d'image est l'un des premiers effets ajoutés dans la démo.

Hollow Knight (Team Cherry) : La combinaison knockback + hitstop dans Hollow Knight est intentionnelle. Joueurs et ennemis se repoussent après le gel, donc l'instant de contact se lit d'abord comme impact, puis comme conséquence — une séquence délibérément choisie par Team Cherry.

Joystick arcade de jeu de combat
Joystick arcade de jeu de combat — Photo: mingche lee / Pexels

FAQ

Le hit stop fonctionne-t-il dans un RPG top-down, pas seulement dans les jeux de combat ?

Oui. Toute attaque en profite — coups d'épée, sorts, même une pelle qui frappe de la terre. Adaptez la durée au contexte : un sort peut valoir 60 ms, un critique au corps à corps 90 ms.

Le hit stop va-t-il provoquer des chutes de framerate ?

Non. Engine.time_scale ralentit la simulation, pas le rendu. Votre GPU continue à afficher des images à pleine vitesse ; seule la logique jeu tourne plus lentement quelques instants.

Peut-on faire du hit stop sans geler tout le jeu ?

Oui, avec un peu plus de code. Utilisez un compteur hitstop_frames: int sur chaque nœud. Dans _physics_process, si le compteur est > 0, décrementez-le et faites return sans exécuter la logique. La musique, les particules et l'UI tournent normalement — c'est l'approche des jeux d'action commerciaux.

Le hit stop ralentit-il les effets sonores ?

Seulement si vous touchez aussi à AudioServer.time_scale (pas modifié par défaut). La plupart des devs laissent l'audio à 1,0 et ne scalent que la simulation, donc les sons jouent à hauteur normale pendant le gel.


Le hit stop est la différence entre un coup qui se lit et un coup qui arrive. Ajoutez l'Autoload, connectez-le à votre première hitbox, et votre jeu sera plus lourd avant de changer une seule frame d'animation. Combinez-le avec le screen shake et un son percutant, puis parcourez le Game Feel Cookbook pour la prochaine couche.