暂停游戏

暂停?

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. However, this is not as simple as it seems. The game might be stopped, but it might be desirable that some menus and animations continue working.

对可暂停(以及不可暂停)的内容实现细节控制需要大量工作,因此Godot提供了一个简单的暂停框架。

如何暂停工作

要设置暂停模式,必须设置暂停状态。 这是通过为 :参考:`场景树.暂停<类_场景树_属性_暂停>` 成员变量赋予“真”值来完成的:

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

这样做会产生以下行为:

  • 2D和3D物理将被停止。
  • 将不再在节点中调用“_处理”和“_物理_处理”函数。
  • “_输入”和“_输入_事件”也不再被调用。

这有效地阻止了整个游戏。 默认情况下,从脚本调用此函数将导致不可恢复的状态(游戏永久暂停!)。

白名单节点

在启用暂停之前,请确保在暂停期间必须继续工作的节点已列入白名单。 这是通过编辑节点中的``暂停模式``属性来完成的:

../../_images/pausemode.png

You can achieve the same result in code:

func _ready():
    pause_mode = Node.PAUSE_MODE_PROCESS

默认情况下,所有节点的此属性都是``继承``状态。 这意味着,它们只会处理(或不处理),具体取决于父节点上设置的相同属性。 如果父项设置为``继承``,则将检查祖父项,依此类推。 最终,如果在任何祖父中找不到状态,则使用SceneTree中的暂停状态。 这意味着,默认情况下,当游戏暂停时,每个节点都将暂停。

节点的三种可能状态有:

  • 继承 : 进程取决于父,祖父节点等的状态。具有非继承状态的第一个父节点。
  • 停止 : 无论什么情况下,停止节点(以及继承模式下的子节点)。 当暂停时,此节点将不会被放入进程。
  • 进程 : 无论什么情况下, 处理节点(以及继承模式下的子节点)。 无论暂停或不暂停, 此节点仍会在进程中。

示例

一个示例是创建一个带有控件的弹出窗口或面板,并将其暂停模式设置为“进程”然后隐藏它:

../../_images/pause_popup.png

只需设置暂停弹出窗口的根节点项为``进程``,所有子孙都将继承该状态。 这样,场景树的这个分支将在暂停时继续工作。

最后,当按下暂停按钮(任何按钮都可以)时,启用暂停并显示暂停屏幕。

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();
}

要删除暂停,请在暂停屏幕关闭时执行相反操作:

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;
}

就是这样,喵!