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
public override void _Ready()
{
    PauseMode = Node.PauseModeEnum.Process;
}

By default, all nodes have this property in the "Inherit" state. This means, that they will only process (or not) depending on what this same property is set on the parent node. If the parent is set to "Inherit" , then the grandparent will be checked and so on. Ultimately, if a state can't be found in any of the grandparents, the pause state in SceneTree is used. This means that, by default, when the game is paused every node will be paused.

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 nœud 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 !