pandemonium_engine_docs/03_usage/15_scripting/10_pausing_games.md

106 lines
3.4 KiB
Markdown
Raw Normal View History

2023-01-12 20:49:14 +01:00
2024-04-30 20:17:58 +02:00
# Pausing games and process mode
2024-04-30 20:17:58 +02:00
## Introduction
In most games it is desirable to, at some point, interrupt the
game to do something else, such as taking a break or changing options.
Implementing a fine-grained control for what can be paused (and what cannot)
is a lot of work, so a simple framework for pausing is provided in
2024-03-16 20:56:52 +01:00
Pandemonium.
2024-04-30 20:17:58 +02:00
## How pausing works
To pause the game the pause state must be set. This is done by assigning
2023-01-12 19:43:03 +01:00
`true` to the `SceneTree.paused` property:
2023-01-12 18:31:02 +01:00
gdscript GDScript
2023-01-12 18:31:02 +01:00
```
2024-05-04 14:08:00 +02:00
get_tree().paused = true
2023-01-12 18:31:02 +01:00
```
Doing this will cause two things. First, 2D and 3D physics will be stopped
for all nodes. Second, the behavior of certain nodes will stop or start
depending on their process mode.
2023-01-12 20:55:57 +01:00
Note:
The physics servers can be made active while the game is
2023-01-12 19:43:03 +01:00
paused by using their `set_active` methods.
2024-04-30 20:17:58 +02:00
## Process Modes
2024-03-16 20:56:52 +01:00
Each node in Pandemonium has a "Pause Mode" that defines when it processes. It can
2023-01-12 19:30:47 +01:00
be found and changed under a node's `Node` properties in the inspector.
2023-01-12 20:16:00 +01:00
![](img/pausemode.png)
You can also alter the property with code:
2023-01-12 18:31:02 +01:00
gdscript GDScript
2023-01-12 18:31:02 +01:00
```
2024-05-04 14:08:00 +02:00
func _ready():
pause_mode = Node.PAUSE_MODE_PROCESS
2023-01-12 18:31:02 +01:00
```
This is what each mode tells a node to do:
- **Inherit**: Process depending on the state of the parent,
grandparent, etc. The first parent that has a non-Inherit state.
- **Stop**: Stop the node no matter what (and children in Inherit
mode). When paused this node will not process.
- **Process**: Process the node no matter what (and children in Inherit
mode). Paused or not this node will process.
By default, all nodes have this property in the "Inherit" state. If the
parent is set to "Inherit", then the grandparent will be checked and so
on. 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. Several things happen when a node stops processing.
2023-01-12 20:57:31 +01:00
The `process`, `physics_process`, `input`, and `input_event` functions
will not be called. However signals still work and cause their connected function to
run, even if that function's script is attached to a node that has its pause
mode set to "Stop".
Animation nodes will pause their current animation, audio nodes
will pause their current audio stream, and particles will pause. These resume
automatically when the game is no longer paused.
It is important to note that even if a node is processing while the game is
paused physics will **NOT** work for it by default. As stated earlier this is
because the physics servers are turned off. The physics servers can be made
2023-01-12 19:43:03 +01:00
active while the game is paused by using their `set_active` methods.
2024-04-30 20:17:58 +02:00
## Pause Menu Example
Here is an example of a pause menu. Create a popup or panel with controls
inside, and set its pause mode to "Process" then hide it. By setting the
root of the pause popup to "Process", all children and grandchildren will
inherit that state. This way, this branch of the scene tree will continue
working when paused.
Finally, make it so when a pause button is pressed (any button will do),
enable the pause and show the pause screen.
2023-01-12 18:31:02 +01:00
gdscript GDScript
2023-01-12 18:31:02 +01:00
```
2024-05-04 14:08:00 +02:00
func _on_pause_button_pressed():
get_tree().paused = true
$pause_popup.show()
2023-01-12 18:31:02 +01:00
```
To unpause, do the opposite when the pause screen is
closed:
2023-01-12 18:31:02 +01:00
gdscript GDScript
2023-01-12 18:31:02 +01:00
```
2024-05-04 14:08:00 +02:00
func _on_pause_popup_close_pressed():
$pause_popup.hide()
get_tree().paused = false
2023-01-12 18:31:02 +01:00
```