序列和精灵可以在其长度的任何点生成所谓的广播消息。这些消息是简单的字符串,添加到动画时间线的特定帧中,当到达时间线中的那个点时,该字符串将广播给所有侦听它的实例。任何具有广播消息事件的实例(在"其他"事件类别中找到)将在时间线中到达消息字符串时接收该消息字符串,此时,您需要有一些代码来解析它并做出相应的反应。还要注意,序列也可以侦听广播消息,但这需要您首先使用代码设置侦听器方法(有关详细信息,请参阅GML中的序列事件和时刻一节)。
注意 将实例的 image_index 直接设置为帧将不触发对象精灵的该帧上可能存在的任何广播消息。
添加广播消息到序列或精灵时间线,只需单击按钮这一点将打开一个对话框,您可以在其中添加要广播的消息:
添加后,消息将显示在"关键帧表"(或精灵帧视图)中。要编辑它,您必须单击鼠标右键在消息图标上打开与帧重叠的所有消息的列表(一个帧上只能有一条消息,但将多条消息放置在连续帧上会导致它们在视觉上重叠,从而使您更难选择所需的消息,您也可以在同一帧上看到一条消息和一个时刻),然后从列表中选择一个将打开消息对话框,您可以在其中编辑或删除它。
当触发广播消息事件时,将有一个特殊的DS映射创建并存储在内置变量event_data中。此变量ID是一个内置的全局范围变量,但仅在触发它的事件中包含DS映射数据-在这种情况下,广播消息事件将在所有其他时间返回-1。事件将具有的键如下:
消息事件结构 | ||
---|---|---|
变量 | 类型 | 描述 |
event_type | String | 对于从序列发送的消息,这将是字符串"sequence event",对于从精灵发送的消息则是字符串"sprite event"。 |
message | String | 这包含已接收的消息字符串。 |
element_id | Layer Element ID | 这包含触发消息的层元素(序列 / 精灵 / 实例)的 ID。然后,您可以使用此 ID 值来确定使用函数 layer_get_element_type() 生成消息的元素类型并根据需要使用其他相关功能来瞄准它,或执行诸如播放声音之类的动作。 |
注意,实例的广播消息事件将在每次发送广播消息时接收多个字符串。您不需要对所有广播进行操作,并且可以让不同的实例监听不同的广播字符串。但是,您可能有一个实例正在侦听可能同时收到的消息 当发生这种情况时,事件将被多次触发-每个消息字符串一次。
以下是如何检查此事件的简单示例:
if event_data[? "event_type"] == "sequence event" // or you can check "sprite event"
{
switch (event_data[? "message"])
{
case "hit":
audio_play_sound(snd_hit, 0, false);
break;
case "destroy":
sequence_destroy(event_data[? "element_id"]);
break;
}
}