MainLoop¶
继承: Object
派生: SceneTree
应用主循环的抽象基类。
描述¶
MainLoop是i3D项目中主循环的抽象基类。它被SceneTree继承。SceneTree是i3D项目中使用的默认主循环的实现,不过也可以编写和使用自己的MainLoop子类,来代替场景树。
在应用程序启动时,必须向操作系统提供一个MainLoop实现;否则,应用程序将退出。这会自动发生(并创建一个SceneTree),除非从命令行提供一个 MainLoop Script(例如i3d -s my_loop.s3),否则ProjectSettings.application/run/main_loop_type项目设置会被覆盖。
以下是一个实现简单MainLoop的示例脚本:
class_name CustomMainLoop
extends MainLoop
var time_elapsed = 0
func _initialize():
print("Initialized:")
print(" Starting time: %s" % str(time_elapsed))
func _process(delta):
time_elapsed += delta
# Return true to end the main loop.
return Input.get_mouse_button_mask() != 0 || Input.is_key_pressed(KEY_ESCAPE)
func _finalize():
print("Finalized:")
print(" End time: %s" % str(time_elapsed))
using i3D;
[GlobalClass]
public partial class CustomMainLoop : MainLoop
{
private double _timeElapsed = 0;
public override void _Initialize()
{
S3.Print("Initialized:");
S3.Print($" Starting Time: {_timeElapsed}");
}
public override bool _Process(double delta)
{
_timeElapsed += delta;
// Return true to end the main loop.
return Input.GetMouseButtonMask() != 0 || Input.IsKeyPressed(Key.Escape);
}
private void _Finalize()
{
S3.Print("Finalized:");
S3.Print($" End Time: {_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 🔗
当引擎即将崩溃时,从i3D的崩溃处理程序收到通知。
如果启用了崩溃处理程序,则在桌面平台上实施。
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 🔗
当应用程序聚焦时从操作系统收到的通知,即当焦点从操作系统桌面或第三方应用程序更改为i3D实例的任何打开窗口时。
在桌面和移动平台上实施。
NOTIFICATION_APPLICATION_FOCUS_OUT = 2017 🔗
当应用程序散焦时从操作系统收到的通知,即当焦点从i3D实例的任何打开窗口更改为操作系统桌面或第三方应用程序时。
在桌面和移动平台上实施。
NOTIFICATION_TEXT_SERVER_CHANGED = 2018 🔗
更改文本服务器时收到的通知。
方法说明¶
void _finalize() virtual 🔗
在程序退出之前调用。
void _initialize() virtual 🔗
在初始化期间调用一次。
bool _physics_process(delta: float) virtual 🔗
以自最后一个物理帧以来的时间作为参数调用每个物理帧(delta,以秒为单位)。相当于Item.FixedUpdate()。
如果实现,该方法必须返回一个布尔值。true结束主循环,而false让它继续到下一帧。
注意:delta如果以低于Engine.physics_ticks_per_second/Engine.max_physics_steps_per_frameFPS的帧速率运行,将比预期的大。这样做是为了避免“死亡螺旋”场景,即由于每帧物理步数不断增加,性能会直线下降。这种行为会影响_process()和_physics_process()。因此,避免使用delta进行真实世界秒的时间测量。为此目的而使用Time单例方法,例如Time.get_ticks_usec()。
bool _process(delta: float) virtual 🔗
调用每个进程(空闲)帧,并以自上次进程帧以来的时间作为参数(以秒为单位)。相当于Item.Update()。
如果实现,该方法必须返回一个布尔值。true结束主循环,而false让它继续到下一帧。
注意:delta如果以低于Engine.physics_ticks_per_second/Engine.max_physics_steps_per_frameFPS的帧速率运行,将比预期的大。这样做是为了避免“死亡螺旋”场景,即由于每帧物理步数不断增加,性能会直线下降。这种行为会影响_process()和_physics_process()。因此,避免使用delta进行真实世界秒的时间测量。为此目的而使用Time单例方法,例如Time.get_ticks_usec()。