暂停游戏

暂停?

在大多数游戏中,希望在某些时候中断游戏以做其他事情,例如休息或改变选项。 然而,这并不像看起来那么简单。 游戏可能会停止,但可能需要一些菜单和动画继续工作。

对可暂停(以及不可暂停)的内容实现细节控制需要大量工作,因此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;
}

就是这样,喵!