Attention: Here be dragons
This is the latest
(unstable) version of this documentation, which may document features
not available in or compatible with released stable versions of Godot.
Checking the stable version of the documentation...
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))
using Godot;
[GlobalClass]
public partial class CustomMainLoop : MainLoop
{
private double _timeElapsed = 0;
public override void _Initialize()
{
GD.Print("初始化:");
GD.Print($" 开始时间:{_timeElapsed}");
}
public override bool _Process(double delta)
{
_timeElapsed += delta;
// 返回 true 结束主循环。
return Input.GetMouseButtonMask() != 0 || Input.IsKeyPressed(Key.Escape);
}
private void _Finalize()
{
GD.Print("完成:");
GD.Print($" 结束时间:{_timeElapsed}");
}
}
方法
void |
_finalize() virtual |
void |
_initialize() virtual |
_physics_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
🔗
当输入法引擎发生更新时,从操作系统收到的通知(例如,IME 光标位置或组成字符串的变化)。
仅限 macOS 平台。
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
,单位为秒)。等价于 Node._physics_process()。
如果实现了该方法,则必须返回一个布尔值。返回 true
会结束主循环,而返回 false
则允许继续到下一帧。
注意:如果运行的帧率低于 Engine.physics_ticks_per_second / Engine.max_physics_steps_per_frame FPS,则 delta
将会比预期的要大。这是为了避免发生“死亡螺旋”的情况,此时每帧的物理步骤数量会不断增加,导致性能急剧下降。这种行为会影响 _process() 和 _physics_process()。因此,请避免根据 delta
来测量真实世界的秒数。请使用 Time 单例的方法来实现此目的,例如 Time.get_ticks_usec()。
bool _process(delta: float) virtual 🔗
每个处理(空闲)帧调用一次,调用时会传入自上一个处理帧以来的时间作为参数(delta
,单位为秒)。等价于 Node._process()。
如果实现了该方法,则必须返回一个布尔值。返回 true
会结束主循环,而返回 false
则允许继续到下一帧。
注意:如果运行的帧率低于 Engine.physics_ticks_per_second / Engine.max_physics_steps_per_frame FPS,则 delta
将会比预期的要大。这是为了避免发生“死亡螺旋”的情况,此时每帧的物理步骤数量会不断增加,导致性能急剧下降。这种行为会影响 _process() 和 _physics_process()。因此,请避免根据 delta
来测量真实世界的秒数。请使用 Time 单例的方法来实现此目的,例如 Time.get_ticks_usec()。