1、1目录GML 语言概述5一个程序 5变量 6赋值语句 6表达式 6扩展变量 7在其他对象中定位变量 8数组 10If 语句 10Repeat 语句 11While 语句 11Do 语句 11For 语句 12Switch 语句 12Break 语句 13Continue 语句 13Exit 语句 14函数 14脚本 14With 结构 15注释 16GML 中的函数与变量 16数学运算单元16常数 16实数函数 16字符串处理函数 18日期及时间处理 19游戏运行20移动 21路径 22运动设计 23碰撞检测 26实例 27解散实例 28定时 29房间 302房间过渡 31分数 32产生事件
2、33复杂的变量和函数 36用户互动37键盘 37鼠标 40手柄 40游戏绘制41精灵和图片 41背景 42绘制精灵和背景 43绘制形状 45字体和文本 47高级绘图函数 48绘制表面 51贴图 53显示 55窗口 55视角 58重绘屏幕 59声音与音乐60基本声音函数 61声音效果 623D 音效 63CD 音乐 64信息窗口,最高分,以及弹出式窗口65溅射屏幕 65弹出信息和询问框 67最高分列表 68资源69精灵 69声音 70背景 70字体 70路径 71脚本 71时间线 72对象 723房间 72改变资源72精灵 73声音 74背景 75字体 76路径 76脚本 77时间线 77对象
3、77房间 78文件、注册和执行方式79文件 79注册 82INI 文件 83执行程序 83数据结构84堆栈 85队列 85列表 86配对 87优化队列 87栅格 88创建粒子90简单效果 90粒子类型 91粒子系统 94发射器 95吸引器 96破坏器 97偏转器 97转换器 98烟火例子 99多人游戏100创建连接 100创建和加入联机 102玩家 102共享数据 103消息 10343D 绘制104进入 3D 模式 105简单绘制 105绘制 3D 多边形 106绘制基本形状 107世界视角 108转变 110雾 111灯光 112创建模型 113结束语 114附录:使用DLL1155Gam
4、e Maker 语言 (GML)Game Maker 内置一款编程语言。这个编程语言给你常规动作之外更多的自由度和控制力。这个语言我们把它简称为 GML (Game Maker Language)。在这一章我们会向你详细介绍有关 GML 的使用方法,提供一个系统提供的所有函数(接近 1000个)和变量来控制你的游戏中所有方面.1.GML 语言概述Game Maker 内置一款编程语言。让你在标准动作之外获得更多的自由度和控制力。这个语言我们简称它为 GML (Game Maker Language)。你可以在很多地方用这个语言编写代码。首先,当你定义脚本的时候。脚本就是一份 GML 程序。其次
5、,当你在一个事件中添加新动作时。在编写代码动作时你也同样可以使用 GML。第三,如果你想在一个动作中使用指定的一个值,你同样可以使用 GML 来表达。一段语句如下所说,并不是完整的程序,只是计算出结果的一段代码。 在本章中我们将向你描述 GML 的基本概念。当你希望学习使用 GML 时,这里有一些东西你需要留意。首先,你的所有资源(精灵、对象、声音、等等)你必须使用一个以字母开头,全部由字母、数字或下划线组成的名称。不然的话你将无法在程序中正确的调用他们。确保所有资源都有不同的名字。同时也要注意不要将资源取名为 self、global 或者其他保留字,因为这些字符在 GML 中有特殊含义(具体
6、有哪些保留字将在后面详细论述). 一个程序 一个程序包括一套完整的指令,称为语句。一个程序必须以 开头,以 结尾。之间是 语句文本。每行语句必须以 ; 分号结尾。所以语句的通常形式应该是这样的 : ;.语句的样式可以有很多种,将在以下各章节论述 . 6变量 和其他语言一样,GML 中也有变量。变量是存储信息的一段内存空间。他们各有不同的名字 以便于你去调用他们。GML 中的一个变量既可以存储一个真实数字,也可以存储一个字符串。 变量并不需要像其他语言一样需要预先声明。这里有大量内置的变量类型。一些相当常见比 如 mouse_x 和 mouse_y 定义鼠标当前位置。其他一些则定义我们扩展程序时
7、使用的当前对 象例程。比如 x 和 y 定义当前例程的位置。一个变量的名称必须以字母打头,由字母、 数字或下划线组成(最长不超过 64 个字符)。当你在当前例程中使用新的变量时,在其他例 程的程序中是不可见的(即使是同一个对象的不同例程)。你仍然可以通过某种方法调用其 他例程里的变量,接着往下看.赋值语句 一段赋值语句将一个值放入一个变量。形式如下 : = ;一个表达式可以是一个简单的数值,也可以是复杂的运算式。除了向一个变量赋值以外,同 样可以在当前变量值的基础上再次赋值,使用 +=的格式。当然,还有 -=,*= /= 或者更 加复杂的格式如 |=、color = $FFAA00;str =
8、 hello world;y += 5;x *= y;x = y , . ;一旦这样的声明被执行, 变量将一直是全局形式不需要再加全局变量前缀“global.”了. 而这仅仅只需要声明的代码块已被执行. 之后其他地方的这些变量就都会成为全局的. 有些时候你希望变量只在当前的代码段或者语句中使用。这种时候你必须避免浪费内存,并且确信这些变量名称不会带来混淆。同时这种变量也比全局变量速度更快。要使用这种变量 你必须在变量名前加入保留字 var和一个空格。这种声明看起来应该是这样的. var , . ;程序示例: var xx,yy;xx = x+10;yy = y+10;instance_crea
9、te(xx,yy,ball);在其他例程中定位变量 如前所述,你可以在当前例程中使用如下语句设置变量 x = 3;但有些时候你希望在另一个例程中定义变量。比如,你可能希望停止所有皮球的活动,或者 你可能想移动主要角色到一个指定的位置,又或者,在一次碰撞种,你可能希望牵涉进另一 个例程的精灵。这些都可以通过“对象名.变量名“ 的格式进行声明。例如,你可以这样书写 ball.speed = 0;这条语句将改变所有 ball 对象的移动速度为 0。这里有几个比较特殊的“对象”。 self: 当前例程中正在执行动作的对象。 9other: 其他例程中涉及碰撞事件的对象。 all: 所有例程。 noon
10、e: 不属于任何例程(听起来很诡异,但在后面迟早会用到它) 。 global: 不属于某个例程,而是整个程序的全局变量。 举个例子,你可以用下面的方式进行变量定义 : other.sprite_index = sprite5;all.speed = 0;global.message = A good result;global.x = ball.x;你会注意到最后一条语句是在有许多 ball 的情况下使用的。这样第一个 ball.x 的值就被新定 义的全局变量 global.x 取代了。 但如果你希望单独设置一个指定皮球的速度,而不是所有皮球呢?这稍微有点难度。每个例 程有一个独立的 ID。当
11、你在编辑器里把例程放入一个房间后,这个例程的 ID 就会在鼠标置于 例程之上的时候显示出来。这些 ID 都是从 100000 开始增加的数字,同样可以用到句点的左边。 但要注意,句点可能会被辨认成小数点,为了避免这种事情发生,需要给 ID 数字加上括号以 示区别。举个例子,假设这个皮球的 ID 是 100032,你就可以这么写 : (100032).speed = 0;如果你在程序中创建了一个例程,call 语句会返回例程的 ID,所以一个完整的程序段应该是 这样的 nnn = instance_create(100,100,ball);nnn.speed = 8;这会创建一个皮球并设定好它的
12、速度,要注意我们把例程的 ID 赋值给了一个变量,并使用这 个变量加在句点前面构成定位符。这样的用法是完全正确的。让我们用更精确的用法。一个 句点就是一个分隔符。它的左边是一个数值,右面是一个变量(或者说变量的地址) ,然后 返回特定对象或者例程中的特定变量的具体地址。所有对象的名称,以及特殊对象都会有一 个简单的数字编号,可以和其他数值一样被处理。举个例子,以下的几个语句都是正确的 : obj0 = ball;obj1 = flag;obj0.alarm4 = 12;obj1.id.x = 12;10最后一个语句比较特殊。我们使用 id 作为第一标签。这样在那个 ID 的例程中的 x 就被赋
13、值为 12 了。 对象名称,特殊对象,以及例程的 ID 都可以在一些函数中使用。他们实际上在程序中被当 作常量使用. 数组 你可以在 GML 中使用一维或二维数组。只需要使用方括号将数组索引号括起来即可,二维数 组则在两个索引号之间加上逗号分隔。一旦你使用数组索引号,数组即被创建。每个数组 都从 0 开始编号。所以在建立超长的数组时要小心,因为内存占用会比较巨大。不要使用负 数索引号。系统最大支持到 32000 的索引,以及总共 1000000 个最大索引尺寸。举个例子先: a0 = 1;i = 1;while (i ) 或 if () else 语句同样可以是一整段语句,表达式会进行运算。如果括号内的结果 )else