godot游戏引擎实现窗口失去焦点后暂停
学习godot游戏引擎也有一段时间了,这的确是对2D游戏支持比较友好的游戏引擎。封装了许多好用的函数。
在大部分主流桌面操作系统,都拥有“窗口”的概念。因此,运行在电脑上的游戏,也许要考虑窗口的影响。因为对于运行在手机上的游戏来说,几乎所有手机都是全屏运行的,因此不会考虑这个问题。
窗口失去焦点后暂停,是对运行在电脑上的单机游戏的一个可选功能,也仅限单机游戏,因为网游一般没有游戏暂停功能。
而这个功能我刚好要用到,就学习了一下。可以在在玩家切换窗口时,或者受到弹窗影响时,游戏会自动暂停。
游戏暂停
首先,实现游戏暂停。在godot游戏引擎中实现游戏暂停非常简单,在任何一个继承Node类或者是Node类的子类的脚本中输入一句代码就可以实现:
#暂停 get_tree().paused = true
(这些代码是godot游戏引擎内置的脚本语言:GDScript)
运行这句代码后,游戏就会卡住,玩家无法对游戏进行任何操作。
当然,我肯定还是希望玩家能够返回游戏的,所以在暂停之前,先显示一个取消暂停的菜单。
制作暂停菜单是话题之外的内容,如果解释得太详细会写得很长……
因此暂停菜单我用一个注释来表示,GDScript的注释用井号#
#暂停前显示一个暂停菜单 #暂停 get_tree().paused = true
不过这个菜单也会受到暂停的影响而失效,因此要让这个菜单不受到暂停影响。
在属性面板中,将这个菜单的暂停属性改成Process,这样子,这个菜单就不会受到暂停影响了。
此时,游戏暂停就做好了。接下来,做个窗口失去焦点的判断就行了。
窗口失焦判断
要知道窗口是否失去焦点,需要覆盖一个叫做_notification()的函数。这个函数会被引擎调用,并且传入一个参数,这个参数就是游戏运行的状态。只要判断这个状态就可以了:
#重写_notification()函数,what参数是引擎的状态 #判断:如果窗口失去焦点 #暂停 func _notification(what): if what == MainLoop.NOTIFICATION_WM_FOCUS_OUT: get_tree().paused = true
可以看到,godot实现窗口失焦暂停还是很简单的,3句代码就搞定了。因为制作暂停菜单是额外的代码。
如果需要了解怎么解除暂停,只需要将paused变量设置为false就可以了:
#解除暂停 get_tree().paused = false
效果示范
下图为演示效果(图中“已暂停,继续”的菜单表示暂停菜单):
代码参考
下图为实现上图效果的代码:
感谢技术分析