我们可以将玩游戏类比为参观一所房子,一所房子有很多房间,而我们同一时间只能在一间房间里(即游戏窗口每次只能展现一个 Room),每个房间里面都有各种各样的家具(即每个 Room 里都有各种各样的 Objects),不同的房间有不同的家具,也可能有相同的家具(不同的 Rooms 里有不同的 Objects,但是也可以有相同的 Objects)。

房间(Rooms)对象(Objects)是依存关系,没有房间,对象无法将自己展现给玩家;没有对象,房间只是一个空壳。

设定(Settings)

Room Properties

设定里有以下内容:

名字(Name):房间在游戏工程里的名字,写代码时用以区分不同的房间。

房间名字(Caption):房间在实际游戏里的名字,游戏运行到这个房间时,显示在游戏窗口的标题栏的内容,即显示在下图位置。一般通过函数给游戏添加标题,所以不用填这个。

Caption

宽(Width)高(Height):此房间的大小,单位是像素(px),游戏窗口会自动适应房间大小。

速度(Steps per second):该房间的运行速度,单位是步/秒(或帧/秒)。这个值决定了该房间的帧率,帧率越高越流畅,同时代码的运行频率也更高,故一般帧率在 30~60 适中,且一个游戏应保持帧率始终固定。

保持(Persistant):如果你勾选了这个选项,当你离开这个房间时,房间内的所有对象的状态都会被记忆,之后你再返回这个房间时,会接着离开时的状态继续运行。

RCC(Room's Creation Code):写入 RCC 里的代码将会在进入房间的那一步执行一次,优先级高于 Objects 的事件。

背景图片(Backgrounds)

Background

背景图片是整个房间里深度最大的图片。

你可以添加最多8种不同的背景方案(Background0~Background7),你应当给其中一种勾选上“当房间开始时可见”,其他的不勾选。之后可以用代码来切换背景方案。

如果你使用纯色背景,可以勾选“使用背景颜色”,然后在该选项右下方的“颜色”选择背景颜色。

如果你使用背景图片,“前景图片”选项的下方有一个框,可以选择一个背景图片。注:“前景图片”一般不会勾选,因为会让背景图片变成深度最浅的图片,会遮挡住你所有的其他图片。前景图片一般多使用半透明的图片。

水平贴图(Horizontal position)垂直贴图(Vitical position):单位为像素(px),将你的背景图片向右或向下移动一定像素。填负数则向左或向上移动。

注意:GM8里的坐标系与常规数学坐标系不同,它是以左上角为原点,向右为x轴正方向,向下为y轴正方向。角度则与常规数学相同,向右为 0°,向上为 90°,向左为 180°,向下为 270°。

延伸(Stretch):如果你的背景图片大小和房间大小不一致,可以通过勾选延伸使背景图片伸缩到房间大小。

水平速度(Horizontal rolling speed)垂直速度(Vitical rolling speed):如果你的背景图片左右可以连接,或者上下可以连接,你可以给定一个水平速度或垂直速度,背景图片就会运动起来。

视野(Views)

View

一般而言,游戏运行时,整个房间都会被展现出来,房间有多大,窗口就有多大。

然而有时候你并不想要这样,这时候你就要用到视野。

使用视野,你需要勾选“激活视野使用”。与背景图片相同,你需要给其中一个视野方案勾选“当房间开始时可见”,其它不勾选,之后可以通过代码来改变视野方案。

房间视野指的是以 (X, Y) 为左上角坐标,以 W 为宽度,以 H 为高度的那一部分房间。

屏幕输出指的是将房间视野拉伸到宽为 W,高为 H 的大小,再把它放到放在窗口的 (X, Y) 位置。(窗口也以左上角为 (0, 0))

视野跟随:即房间视野始终跟随房间内某一个对象,而不是固定不动。Hbor 指当该对象离视野的左右边缘还有多少像素时开始跟随,Vbor 同理。Hsp 指视野在跟随对象时的水平最大移动速度,单位是像素/步,Vsp 则指垂直最大移动速度。一般 Hsp 和 Vsp 要大于跟随对象的速度。

贴图(Tiles)

贴图的使用因人而异,有人喜欢用贴图,而有人则从不使用贴图。

贴图使用的也是背景图片,与背景图片不同的是,背景图片的深度最高,不可逾越,而贴图深度为 1000000,并不是一个不可逾越的值,你可以给对象一个更大的深度(如 1000050)让这个对象被贴图遮挡。

在背景图片(Backgrounds)的设置中你可以将背景图片分解为很多小贴图(当然你也可以不勾选,将整个背景图片当做贴图使用),如图:

Tile

你在房间内选择该背景图片作为贴图时,就可以单独使用每一个小贴图:

Tile In Room

注意左下方的“删除底层”,指的是当两个贴图/对象重叠时是否删去之前放置的贴图/对象。


GM的房间操作:

  • 上方属性栏中的 SnapX 和 SnapY:网格大小,单位是像素,可以看到房间被黑色的线分为一个个区域,放置贴图/对象时,会强制对齐网格。
  • SnapX 和 SnapY 右边的两个按钮,分别是显示/隐藏网格(网格依然存在)、是否使用斜网格。
  • 鼠标左键:在该位置创建贴图/对象,按住左键不松,贴图/对象会自动跟随鼠标
  • 鼠标右键:删除鼠标位置的贴图/对象,一直按住鼠标右键移动鼠标,所有经过的贴图/对象都会被删除
  • shift + 鼠标左键:按住不松,将会为鼠标经过的每一个网格都放置一个贴图/对象
  • ctrl + 鼠标左键:移动贴图/对象
  • alt + 鼠标左键:无视网格地创建贴图、对象
  • ctrl + alt + 鼠标左键:无视网格地移动贴图/对象
  • ctrl + 鼠标右键:显示一些可执行的操作,如图:

    Menu

其中删除所有(Delete All)指删除当前位置的所有贴图/对象,而不是指整个房间的所有贴图/对象。贴图锁定(Lock)后不能被删除,不能被移动。

对象(Objects)

将对象放到房间内的操作和贴图(Tiles)同理。

注意对象对齐网格(Snap)时,是以自身精灵(Sprite)的原点为中心对齐的。

在对象上 ctrl + 右键出现下面的菜单:

Menu Object

创建时执行代码(Instance Creation Code, ICC):对象被创建时仅执行一次的代码。优先级低于 RCC,高于对象的 create 事件。

对象(Object)与实例(Instance)

对象指的是在 Objects 目录下的一种资源文件,而实例是指对象在游戏(房间)中的具体体现。

比如说,你在 Objects 目录下创建了一个对象,命名为 snow,然后你在某个房间内放置了 4 个 snow,或者用代码在游戏运行时创建了四个 snow,那么这四个 snow 都是单独的实例,即它们是四个不同的实例,但这四个实例是同一个对象 snow 的实例。也就是说,此时房间中有一个对象,四个实例。

当使用代码对 “snow” 发出指令时,四个 snow 实例都会执行这个指令。每一个 snow 实例都有一个独一无二的索引(ID,Index),如果你对某一个特定的索引(ID)发出指令,只有这个索引(ID)对应的那个 snow 才会执行指令,其余三个 snow 则不受影响。原则上来说,ID 是 identity 的缩写,但是在 GM8 的文档中大量出现的 id 实际上都指示索引,因此本教程也使用 ID 表示 index。

在 GML 中,对实例操作的函数以 instance_ 作为前缀,对对象操作的函数以 object_ 作为前缀。