Mettre les jeux en pause

Pause ?

Dans la plupart des jeux, il est souhaitable, à un moment donné, d’interrompre le jeu pour faire autre chose, par exemple faire une pause ou changer les options. Cependant, ce n’est pas aussi simple qu’il n’y paraît. Le jeu peut être interrompu, mais il peut être souhaitable que certains menus et animations continuent à fonctionner.

La mise en place d’un contrôle fin de ce qui peut être mis en pause (et de ce qui ne peut pas l’être) représente beaucoup de travail, c’est pourquoi Godot fournit un framework simple pour la mise en pause.

Comment fonctionne la pause

Pour activer le mode pause, l’état de pause doit être défini. Cela se fait en assignant true à la propriété SceneTree.paused :

get_tree().paused = true
GetTree().Paused = true;

Cela aura le comportement suivant :

  • Les physiques 2D et 3D seront arrêtées.
  • _process et le _physics_process ne seront plus appelés dans les nœuds.
  • _input et _input_event ne seront plus appelés non plus.

Cela stop effectivement tout le jeu. L’appel de cette fonction à partir d’un script, par défaut, entraînera un état irrécupérable (plus rien ne fonctionnera !).

Mettre des nœuds sur liste blanche

Avant d’activer la pause, assurez-vous que les nœuds qui doivent continuer à fonctionner pendant la pause sont sur liste blanche. Cela se fait en modifiant la propriété « Mode Pause » dans un nœud :

../../_images/pausemode.png

Vous pouvez obtenir le même résultat dans le code :

func _ready():
    pause_mode = Node.PAUSE_MODE_PROCESS

Par défaut, tous les nœuds ont cette propriété avec l’état « Inherit ». Cela signifie qu’ils ne s’exécuteront (ou non) qu’en fonction de cette même propriété définie dans le nœud parent. Si le parent est défini sur « Inherit », alors le grand-parent sera vérifié, et ainsi de suite. En fin de compte, si un état ne peut être trouvé dans aucun des grands-parents, l’état de pause dans SceneTree est utilisé. Cela signifie que, par défaut, lorsque le jeu est mis en pause, chaque nœud sera mis en pause.

Ainsi, les trois états possibles pour un nœud sont :

  • Inherit : L’exécution dépend de l’état du parent, du grand-parent, etc. Le premier parent qui a un état n’étant pas Inherit.
  • Stop : Arrête le nœud quoi qu’il arrive (et ses enfants en mode Inherit). Lorsqu’il est en pause, ce noeud n’est pas exécuté.
  • Processus : Exécute le nœud quoi qu’il arrive (et ses enfants en mode Inherit). En pause ou non, ce nœud sera exécuté.

Exemple

Un exemple de cela est la création d’un popup ou d’un panneau avec des contrôles à l’intérieur, et de régler son mode de pause sur « Process » puis de le cacher :

../../_images/pause_popup.png

Il suffit de régler la racine du popup de pause sur « Process » pour que tous ses enfants et petits-enfants héritent de cet état. Ainsi, cette branche de l’arbre des scènes continuera à fonctionner lorsqu’elle sera en pause.

Enfin, assurez-vous que lorsqu’un bouton de pause est pressé (n’importe quel bouton fera l’affaire), activez la pause et affichez l’écran de pause.

func _on_pause_button_pressed():
    get_tree().paused = true
    $pause_popup.show()
public void _on_pause_button_pressed()
{
    GetTree().Paused = true;
    GetNode<Control>("pause_popup").Show();
}

Pour arrêter la pause, faites le contraire lorsque l’écran de pause est fermé :

func _on_pause_popup_close_pressed():
    $pause_popup.hide()
    get_tree().paused = false
public void _on_pause_popup_close_pressed()
{
    GetNode<Control>("pause_popup").Hide();
    GetTree().Paused = false;
}

Et ce devrait être tout !