MainLoop

继承: Object

派生: SceneTree

游戏主循环的抽象基类。

描述

MainLoop 是 Godot 项目中游戏循环的抽象基类。它被 SceneTree 继承,SceneTree 是 Godot 项目中使用的默认游戏循环的实现,不过也可以编写和使用自己的 MainLoop 子类,来代替场景树。

应用程序启动时必须向操作系统提供一个 MainLoop 实现;否则应用程序将退出。该过程是自动的(会创建 SceneTree),除非从命令行提供了 MainLoop Script(例如 godot -s my_loop.gd)或覆盖了 ProjectSettings.application/run/main_loop_type 项目设置。

以下是实现简单 MainLoop 的示例脚本:

class_name CustomMainLoop
extends MainLoop

var time_elapsed = 0

func _initialize():
    print("初始化:")
    print("  开始时间:%s" % str(time_elapsed))

func _process(delta):
    time_elapsed += delta
    # 返回 true 结束主循环。
    return Input.get_mouse_button_mask() != 0 || Input.is_key_pressed(KEY_ESCAPE)

func _finalize():
    print("完成:")
    print("  结束时间:%s" % str(time_elapsed))

方法

void

_finalize() virtual

void

_initialize() virtual

bool

_physics_process(delta: float) virtual

bool

_process(delta: float) virtual


信号

on_request_permissions_result(permission: String, granted: bool) 🔗

当用户对权限请求作出反应时发出。


常量

NOTIFICATION_OS_MEMORY_WARNING = 2009 🔗

当应用程序超过其分配的内存时,从操作系统收到的通知。

仅限 iOS 平台。

NOTIFICATION_TRANSLATION_CHANGED = 2010 🔗

当翻译可能发生变化时收到的通知。会在用户改变区域设置时触发。可以用来响应语言的变化,例如实时改变 UI 字符串。可配合内置的翻译支持使用,比如 Object.tr()

NOTIFICATION_WM_ABOUT = 2011 🔗

当发出“关于”信息请求时,从操作系统收到的通知。

仅限 macOS 平台。

NOTIFICATION_CRASH = 2012 🔗

当引擎即将崩溃时,从Godot的崩溃处理程序收到的通知。

如果崩溃处理程序被启用,这只会在桌面平台上实现。

NOTIFICATION_OS_IME_UPDATE = 2013 🔗

Notification received from the OS when an update of the Input Method Engine occurs (e.g. change of IME cursor position or composition string).

Implemented on desktop and web platforms.

NOTIFICATION_APPLICATION_RESUMED = 2014 🔗

当应用程序恢复时,从操作系统收到的通知。

具体针对 Android 和 iOS 平台。

NOTIFICATION_APPLICATION_PAUSED = 2015 🔗

应用程序暂停时从操作系统收到的通知。

特定于 Android 和 iOS 平台。

注意:在 iOS 上,你只有大约 5 秒时间来完成由该信号启动的任务。如果你超过了该分配,则 iOS 将终止该应用程序而不是暂停它。

NOTIFICATION_APPLICATION_FOCUS_IN = 2016 🔗

当应用程序获得焦点时从操作系统收到的通知,即焦点将从操作系统桌面或第三方应用程序更改为 Godot 实例的任何一个打开窗口时。

在桌面和移动平台上实现。

NOTIFICATION_APPLICATION_FOCUS_OUT = 2017 🔗

当应用程序失去焦点时从操作系统收到通知,即焦点将从 Godot 实例的任何一个打开窗口,更改为操作系统桌面或第三方应用程序时。

在桌面和移动平台上实现。

NOTIFICATION_TEXT_SERVER_CHANGED = 2018 🔗

文本服务器被更改时,收到的通知。


方法说明

void _finalize() virtual 🔗

在程序退出前调用。


void _initialize() virtual 🔗

在初始化时调用一次。


bool _physics_process(delta: float) virtual 🔗

每个物理周期调用一次。delta 是物理周期之间的逻辑时间,单位为秒,等于 Engine.time_scale / Engine.physics_ticks_per_second。等价于 Node._physics_process()

实现后,该方法必须返回布尔值。true 会终止主循环,而 false 则会允许其进入下一步。

注意:_physics_process() 每(空闲)帧最多只能调用 Engine.max_physics_steps_per_frame 次。引擎遭遇性能问题时可能触及该限制。

注意:delta 进行累加可能与现实世界的秒数存在偏差。


bool _process(delta: float) virtual 🔗

每个空闲帧调用一次,调用时机在渲染之前、所有物理帧处理完毕之后。delta 是帧与帧之间的时间,单位为秒。等价于 Node._process()

实现后,该方法必须返回布尔值。true 会终止主循环,而 false 则会允许其进入下一帧。

注意:引擎遭遇帧率下降时,delta 会增大。delta 增大时,最大值为 Engine.time_scale * Engine.max_physics_steps_per_frame / Engine.physics_ticks_per_second。因此,对 delta 进行累加可能与现实世界的秒数存在偏差。

注意:如果启用了 --fixed-fps 或者在 Movie Maker 模式下运行(见 MovieWriter),每帧的处理 delta 都相同,与该帧的渲染耗时无关。

注意:如果项目启用了 OS.delta_smoothing,则帧间隔可能经过后期处理。