异步事件

The Async Event

异步事件是指当GameMaker从外部源(可以是Web或运行游戏的设备)接收到回调时触发的事件。

基本上,你告诉GameMaker做一些事情-比如加载一个图像-它会开始这样做。作为一个例子,让我们假设你想从一个外部文件添加一个精灵。这可以同步异步完成。要同步完成这一点,你使用函数sprite_add

var _new_big_sprite = sprite_add("my_new_sprite_image.png", 1, false, true, 0, 0);

// A lot more code below this line that all needs to be executed on time to keep a steady FPS

但是这个函数有一个缺点,因为它会立即完全加载精灵。下一行代码只有在加载完成后才会执行!如果你只是添加一个小精灵,这可能不会被注意到,但是当加载一个大精灵或许多小精灵时,可能会冻结你的游戏。

GameMaker 也有 异步 工作的内置函数。使用这些函数,GameMaker 只会 开始 执行您要求的操作,但不会停止执行代码,直到完成。它会继续在后台处理您的 GameMaker 请求,并继续正常运行游戏的其余代码。当请求完成时,一个回调将被发送到 GameMaker,并且为该类型的回调定义的任何异步事件将被触发。

sprite_add的示例中,您可以使用其异步对应项sprite_add_ext开始加载sprite,然后触发一个sprite事件:

var _new_big_sprite = sprite_add_ext("my_new_sprite_image.png", 1, 0, 0, true);

// A lot more code below this line that will be executed almost instantly after the call to sprite_add_ext

异步图像加载事件

/// "The sprite you requested has finished loading"

还有其他一些情况,您不希望游戏等待可能需要大量时间才能完成的事情完成,例如向Web服务器发出HTTP请求。

您不必总是先自己调用函数才能接收异步事件形式的回调,例如,当游戏手柄连接或断开连接时,将触发异步 System 事件。 为此,您不必先调用函数。

请注意,异步事件会为 所有 具有它们的实例触发,这与键盘事件非常相似,因此您可以在一个实例中执行 http_get 调用,但在另一个实例中使用 异步 HTTP 事件 来处理回调。

注意您应该注意,由于浏览器中的XSS保护,从跨域加载资源的请求和尝试会被阻止,并且在使用以下任何事件时可能会返回空白结果。

有多种类型的事件与异步事件类别相关联,它们都在以下部分中进行了解释:

注意以下部分中提到的变量 async_load 仅在这些事件中有效,因为它指向的 DS map 在事件开始时创建,然后在结束时再次删除,并且该变量在所有其他时间都会重置为值 -1

 

如果你正在为不同的平台做扩展,你可能希望从你的扩展函数中回调一个或多个异步事件。为此,你可以找到下面的表格,列出每个内部事件名称常量和它们对应的ID值。

注意这些事件常量用于扩展!

 

异步事件常量
常量
EVENT_OTHER_WEB_IMAGE_LOAD 60
EVENT_OTHER_WEB_SOUND_LOAD 61
EVENT_OTHER_WEB_ASYNC 62
EVENT_OTHER_DIALOG_ASYNC 63
EVENT_OTHER_WEB_IAP 66
EVENT_OTHER_WEB_CLOUD 67
EVENT_OTHER_WEB_NETWORKING 68
EVENT_OTHER_WEB_STEAM 69
EVENT_OTHER_SOCIAL 70
EVENT_OTHER_PUSH_NOTIFICATION 71
EVENT_OTHER_ASYNC_SAVE_LOAD 72
EVENT_OTHER_AUDIO_RECORDING 73
EVENT_OTHER_AUDIO_PLAYBACK 74
EVENT_OTHER_SYSTEM_EVENT 75
EVENT_OTHER_MESSAGE_EVENT 76