暂停游戏
暂停?
在大多数游戏中,最好是在某些时候中断游戏,做一些其他事情,比如休息一下或改变选项.然而,这并不像它看起来那么简单.游戏可能被停止,但可能希望一些菜单和动画继续工作.
对可暂停(以及不可暂停)的内容实现细节控制需要大量工作,因此Godot提供了一个简单的暂停框架.
如何暂停工作
要设置暂停模式,必须设置暂停状态. 这是通过为 :参考:`场景树.暂停<类_场景树_属性_暂停>` 成员变量赋予”真”值来完成的:
GDScript
C#
get_tree().paused = true
GetTree().Paused = true;
这样做会产生以下行为:
2D和3D物理将被停止.
将不再在节点中调用”_处理”和”_物理_处理”函数.
“_输入”和”_输入_事件”也不再被调用.
这有效地阻止了整个游戏. 默认情况下,从脚本调用此函数将导致不可恢复的状态(游戏永久暂停!).
白名单节点
在启用暂停之前,请确保在暂停期间必须继续工作的节点已列入白名单. 这是通过编辑节点中的``暂停模式``属性来完成的:
你可以在代码中实现同样的结果:
GDScript
func _ready():
pause_mode = Node.PAUSE_MODE_PROCESS
默认情况下,所有节点的此属性都是``继承``状态. 这意味着,它们只会处理(或不处理),具体取决于父节点上设置的相同属性. 如果父项设置为``继承``,则将检查祖父项,依此类推. 最终,如果在任何祖父中找不到状态,则使用SceneTree中的暂停状态. 这意味着,默认情况下,当游戏暂停时,每个节点都将暂停.
节点的三种可能状态有:
继承 : 进程取决于父,祖父节点等的状态.具有非继承状态的第一个父节点.
停止 : 无论什么情况下,停止节点(以及继承模式下的子节点). 当暂停时,此节点将不会被放入进程.
进程 : 无论什么情况下, 处理节点(以及继承模式下的子节点). 无论暂停或不暂停, 此节点仍会在进程中.
示例
一个示例是创建一个带有控件的弹出窗口或面板,并将其暂停模式设置为”进程”然后隐藏它:
只需设置暂停弹出窗口的根节点项为``进程``,所有子孙都将继承该状态. 这样,场景树的这个分支将在暂停时继续工作.
最后,当按下暂停按钮(任何按钮都可以)时,启用暂停并显示暂停屏幕.
GDScript
C#
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();
}
要删除暂停,请在暂停屏幕关闭时执行相反操作:
GDScript
C#
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;
}
就是这样,喵!