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()。