暂停游戏

暂停?

在大多数游戏中,最好是在某些时候中断游戏,做一些其他事情,比如休息一下或改变选项.然而,这并不像它看起来那么简单.游戏可能被停止,但可能希望一些菜单和动画继续工作.

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

如何暂停工作

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

GDScript

C#

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

这样做会产生以下行为:

  • 2D和3D物理将被停止.

  • 将不再在节点中调用”_处理”和”_物理_处理”函数.

  • “_输入”和”_输入_事件”也不再被调用.

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

白名单节点

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

../../_images/pausemode.png

你可以在代码中实现同样的结果:

GDScript

  1. func _ready():
  2. pause_mode = Node.PAUSE_MODE_PROCESS

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

节点的三种可能状态有:

  • 继承 : 进程取决于父,祖父节点等的状态.具有非继承状态的第一个父节点.

  • 停止 : 无论什么情况下,停止节点(以及继承模式下的子节点). 当暂停时,此节点将不会被放入进程.

  • 进程 : 无论什么情况下, 处理节点(以及继承模式下的子节点). 无论暂停或不暂停, 此节点仍会在进程中.

示例

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

../../_images/pause_popup.png

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

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

GDScript

C#

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

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

GDScript

C#

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

就是这样,喵!