Godot-StartUP

创建于:2018-07-28

创建人: Justus

44 信息 140 成员
讨论基于Godot以及Unity引擎的游戏开发经验,理论和最佳实践。共享一些通用思路以启发另一种生产工具中的实践。独立开发群QQ: 122017359

godot游戏引擎实现窗口失去焦点后暂停

人类的大敌 2020-11-25

学习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


效果示范

下图为演示效果(图中“已暂停,继续”的菜单表示暂停菜单):

用鼠标在窗口之间切换


代码参考

下图为实现上图效果的代码:

窗口失去焦点暂停代码例子

(转发自:原日志地址

近期喜欢的会员

 
Erufu 2020-11-25

感谢技术分析

 

加入 indienova

  • 建立个人/工作室档案
  • 建立开发中的游戏档案
  • 关注个人/工作室动态
  • 寻找合作伙伴共同开发
  • 寻求线上发行
  • 更多服务……
登录/注册