Skip to main content Link Menu Expand (external link) Document Search 复制 已复制

内置过渡方式

默认情况下,使用 room_goto() 函数切换房间时,GM8 是直接切换画面的。如果你觉得这种切换太生硬,GM8 提供房间过渡的功能。

  • transition_kind 默认为 0 的内置变量,用于改变切换房间时的过渡效果。注意,该设置是一次性设置,每次切换房间后该变量会自动归零。
  • transition_steps 设置房间过渡步数的内置变量,默认是 80 步,即 80 步完成过渡过程。

GM8 提供 21 种过渡方式(不计为 0 时的无过渡):

1
1 = 从左创造  2 = 从右创造  3 = 从上创造  4 = 从下创造  5 = 中心创造

以从左创造为例,其效果为:

Example

1
6 = 从左移动  7 = 从右移动  8 = 从上移动  9 = 从下移动

以从左移动为例,其效果为:

Example

1
10 = 从左隔行  11 = 从右隔行  12 = 从上隔行  13 = 从下隔行

以从左隔行为例,其效果为:

Example

1
14 = 从左推  15 = 从右推  16 = 从上推  17 = 从下推

以从左推为例,其效果为:

Example

1
18 = 左转动  19 = 右转动

以左转动为例,其效果为:

Example

1
20 = 混合房间

Example

1
21 = 淡入淡出

Example

自定义过渡方式

  • transition_define(kind, name) 注册一个新的房间过渡方式。参数 kind 是用来提供给 transition_kind 的值,重复定义可以覆盖掉原有效果。参数 name 是自定义过渡方式的脚本名,注意脚本名要使用双引号包起,以字符串方式传递。

我们将脚本名注册为房间过渡方式后,GM8 在使用我们的脚本时,会传递五个参数到脚本中,分别是上一个房间画面的表面下一个房间画面的表面表面宽表面高过渡的进程(0~1)。GM 所提供的 argument0 和 argument1 是分别绘制有上一个房间画面和下一个房间画面的表面的 id,我们需要利用这两个表面绘制到屏幕上。argument4 是过渡的进程,即当前步数/总步数,用来帮助我们绘制动态效果。GM8 会在每一步都调用一次该脚本,因此默认 transition_steps 为 80 的情况下,GM8 一共要调用 80 次脚本。值得注意的一点是,GM8 不会重绘 argument0 和 argument1 的表面,这意味着如果你在某一步的时候改变了某个表面内容,那么下一步读取到的表面也是被修改后的表面。因此如果你要改变表面上的内容,最好开辟自己的表面来修改。


为了更好地说明如何写脚本,我们就以实现内置的 14 号过渡方式从左推为例:

1
2
3
4
5
6
7
8
9
10
11
{
    var _surf1, _surf2, _width, _height, _percent;
    _surf1 = argument0;
    _surf2 = argument1;
    _width = argument2;
    _height = argument3;
    _percent = argument4;

    draw_surface(_surf1, _percent * _width, 0);
    draw_surface(_surf2, (_percent - 1) * _width, 0);
}

以上代码注册为房间过渡方式后,与内置的 14 号过渡方式是一模一样的。


再举一个非内置的例子:

Example

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
{
    var _surf1, _surf2, _width, _height, _percent;
    _surf1 = argument0;
    _surf2 = argument1;
    _width = argument2;
    _height = argument3;
    _percent = argument4;

    draw_clear(c_black);
    draw_surface_ext(_surf2, 0, 0, 1, 1, 0, c_white, sqr(_percent));
    draw_surface_part(_surf1, 0, 0, _width, _height / 2, 0, -_percent * _height / 2);
    draw_surface_part(_surf1, 0, _height / 2, _width, _height / 2, 0, (1 + _percent) * _height / 2);
}