序列

序列通常使用 序列编辑器 在 IDE 中创建,但也可以使用代码创建和编辑。不过,在查看可用函数之前,了解 GameMaker 中定义序列的方式以及将使用的不同术语非常重要。

首先,在顶层,您有一个 序列元素 。这是您通过 房间编辑器 或使用适当的 层函数 在代码中放置在房间层上的内容。除了元素 ID 值之外,图层元素没有任何实际属性,但是需要此 ID 才能使用上述图层功能来更改序列播放或访问序列数据。

接下来,您有 序列对象序列实例 ,就像一般对象和实例一样。序列 对象 是您在 资源浏览器 中或使用函数 sequence_create 创建的基础资源,序列 实例 是 " 副本 " 该序列对象已作为图层上的元素放置在房间中。将序列对象视为蓝图,将序列实例视为根据这些蓝图进行的创建。序列对象和实例是 结构体 ,与常规对象不同,序列对象结构体可以在运行时进行编辑,当您将它们创建为元素时,这将影响该序列的所有其他实例 (以及对序列对象进行的任何编辑 ) 不会 通过使用 room_restartgame_restart 函数重新启动游戏或房间来重置)。序列实例结构包含一些用于控制播放和事物的参数 (下文将对此进行更详细的解释) 以及 序列数据 结构。

最后,如上所述,您拥有 序列数据 ,它是另一个结构体。该结构包含有关序列的 所有 数据。它包含的曲目、这些曲目具有的属性、播放速度等等。下面概述了该结构内容的具体细节,但基本上由 资产轨道 结构和 参数轨道 结构组成,它们使用 关键帧数据 在序列播放时实际执行操作。

序列元素使用房间 层函数 进行处理,但对于序列对象、实例和数据,我们有以下函数:

 

 

还有一个与实例关联的 内置变量 ,可用于确定实例是否已在序列中使用:

 

重要 如果您的序列中有任何实例,这些实例不应更改其 image_xscale/image_yscale/image_angle/x/y 变量,因为当序列开始播放后更新每个步骤时,它们将被覆盖。您可以检查 in_sequence,并且仅当该变量为 false 时才更新此类实例的属性。

 

在使用这些函数创建或编辑序列之前,我们建议您阅读下面给出的结构体属性的详细说明。如何创建新序列的一般概述是:

myseq = sequence_create();

myseq.length = 120;
myseq.loopmode = seqplay_pingpong

var mytracks = array_create(1);
mytracks[0] = sequence_track_new(seqtracktype_graphic);

// Create a new keyframe struct for a graphics asset track and add it to an array (as you can have multiple keys in a frame)
var graphickeys = array_create(1);
graphickeys[0] = sequence_keyframe_new(seqtracktype_graphic);
// Set the graphics keyframe top level data for the keyframe position and length, etc...
graphickeys[0].frame = 0;
graphickeys[0].length = 1;
graphickeys[0].stretch = true;
graphickeys[0].disabled = false;
// Create the channel data that will go into this keyframe (again an array, as each key can have multiple channels of keyframe data)
var graphickeydata = array_create(1);
graphickeydata[0] = sequence_keyframedata_new(seqtracktype_graphic);
graphickeydata[0].spriteIndex = spr_Platform;
graphickeydata[0].channel = 0;
// Add the keyframe data channels to the graphics track keyframe
graphickeys[0].channels = graphickeydata;
// Add the definied keyframes to the track
mytracks[0].name = "TestGraphicTrack";
mytracks[0].keyframes = graphickeys;

// Create a new parameter track struct for the position of the graphic
var paramtracks = array_create(1);
paramtracks[0] = sequence_track_new(seqtracktype_real);
paramtracks[0].name = "position";
paramtracks[0].interpolation = seqinterpolation_lerp;
// Create the keyframe struct to hold the parameter channel data and set the frame position for the keyframe
var paramkeys = array_create(2);
paramkeys[0] = sequence_keyframe_new(seqtracktype_real);
paramkeys[0].frame = 0;
paramkeys[1] = sequence_keyframe_new(seqtracktype_real);
paramkeys[1].frame = 120;
// Create the keyframe data structs
var paramkeydata1 = array_create(2);
paramkeydata1[0] = sequence_keyframedata_new(seqtracktype_real);
paramkeydata1[0].channel = 0; // Channel 0 for a position track is the X position
paramkeydata1[0].value = 0;
paramkeydata1[1] = sequence_keyframedata_new(seqtracktype_real);
paramkeydata1[1].channel = 1; // Channel 1 for a position track is the Y position
paramkeydata1[1].value = 0;
var paramkeydata2 = array_create(2);
paramkeydata2[0] = sequence_keyframedata_new(seqtracktype_real);
paramkeydata2[0].channel = 0;
paramkeydata2[0].value = room_width;
paramkeydata2[1] = sequence_keyframedata_new(seqtracktype_real);
paramkeydata2[1].channel = 1;
paramkeydata2[1].value = room_height;
// Assign the keyframe data structs to the channels for each key
paramkeys[0].channels = paramkeydata1;
paramkeys[1].channels = paramkeydata2;
// Assign the keys to the parameter track
paramtracks[0].keyframes = paramkeys;

mytracks[0].tracks = paramtracks;
myseq.tracks = mytracks;
layer_sequence_create("Assets_1", 0, 0, myseq);

上述指令创建了一个非常简单的序列对象,该对象在序列的 (0, 0) 位置 绘制一个精灵,然后将其移动到右下角并循环返回。如前所述,有很多地方需要访问不同的结构来提供或获取有关序列的数据,下面的部分列出了这些结构包含的所有不同属性:

 

最后,可以向序列添加代码,这些代码可以作为 事件时刻 或作为 广播消息 触发。下页对此进行了完整解释: