Up to date

This page is up to date for Godot 4.2. If you still find outdated information, please open an issue.

Traitement physique et traitement passif

Games run in a loop. Each frame, you need to update the state of your game world before drawing it on screen. Godot provides two virtual methods in the Node class to do so: Node._process() and Node._physics_process(). If you define either or both in a script, the engine will call them automatically.

Deux types de traitement sont à votre disposition :

  1. Le traitement passif vous permet d'exécuter un code qui met à jour un nœud à chaque trame, aussi souvent que possible.

  2. Le traitement physique se fait à un rythme fixe de 60 fois par seconde par défaut. Ce rythme est indépendant de la fréquence d'images réelle de votre jeu et permet un fonctionnement fluide de la physique. Vous devriez l'utiliser pour tout ce qui implique le moteur physique, comme le déplacement d'un corps qui entre en collision avec l'environnement.

Vous pouvez activer le traitement passif en définissant la méthode _process() dans un script. Vous pouvez le désactiver et le réactiver en appelant Node.set_process().

Le moteur de jeu appelle cette méthode à chaque fois il affiche la trame :

func _process(delta):
    # Do something...
    pass

Gardez à l'esprit que la fréquence à laquelle le moteur appelle _process() dépend du framerate de votre application, qui varie dans le temps et selon les appareils.

Le paramètre delta de la fonction est le temps écoulé en secondes depuis le précédent appel à _process(). Utilisez ce paramètre pour effectuer des calculs indépendants du taux de rafraîchissement. Par exemple, vous devez toujours multiplier une valeur de vitesse par delta pour animer un objet en mouvement.

Le traitement physique fonctionne avec une fonction virtuelle similaire : _physics_process(). Utilisez-la pour les calculs qui doivent se produire avant chaque étape physique, comme le déplacement d'un personnage qui entre en collision avec le monde du jeu. Comme mentionné ci-dessus, _physics_process() s'exécute à intervalles de temps fixes autant que possible pour garder les interactions physiques stables. Vous pouvez modifier l'intervalle entre les étapes de la physique dans les paramètres du projet, sous Physics -> Common -> Physics Fps. Par défaut, il est réglé pour s'exécuter 60 fois par seconde.

The engine calls this method before every physics step:

func _physics_process(delta):
    # Do something...
    pass

La fonction _process(), cependant, n'est pas synchronisée avec la physique. Son taux de rafraîchissement n'est pas constant et dépend de l'optimisation du hardware et du jeu. Son exécution se fait après le traitement de la physique sur les jeux mono-threadés.

Une façon simple de voir la fonction _process() au travail est de créer une scène avec un seul nœud Label, auquel est attaché le script suivant :

extends Label

var time = 0

func _process(delta):
    time += delta
    text = str(time) # 'text' is a built-in Label property.

Lorsque vous exécutez la scène, vous devriez voir un compteur augmenter à chaque image.