GML手册中文版_第1页
GML手册中文版_第2页
GML手册中文版_第3页
GML手册中文版_第4页
GML手册中文版_第5页
已阅读5页,还剩131页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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房间30房间过渡31分数32产生事件33复杂的变量和函数36用户互动37键盘37鼠标40手柄40游戏绘制41精灵和图片41背景42绘制精

2、灵和背景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对象72房间72改变资源72精灵73声音74背景75字体76路径76脚本77时间线77对象77房间78文件、注册和执行方式79文件79注册82ini文件83执行程序83数据结构84堆栈85队列85列表86配对87优化队列87栅格88创建粒子90简单效果90粒子类型91粒子系统

3、94发射器95吸引器96破坏器97偏转器97转换器98烟火例子99多人游戏100创建连接100创建和加入联机102玩家102共享数据103消息1033d绘制104进入3d模式105简单绘制105绘制3d多边形106绘制基本形状107世界视角108转变110雾111灯光112创建模型113结束语114附录:使用dll115game maker 语言 (gml)game maker内置一款编程语言。这个编程语言给你常规动作之外更多的自由度和控制力。这个语言我们把它简称为 gml (game maker language)。在这一章我们会向你详细介绍有关gml的使用方法,提供一个系统提供的所有函数(

4、接近1000个)和变量来控制你的游戏中所有方面.1.gml语言概述game maker内置一款编程语言。让你在标准动作之外获得更多的自由度和控制力。这个语言我们简称它为 gml (game maker language)。你可以在很多地方用这个语言编写代码。首先,当你定义脚本的时候。脚本就是一份gml程序。其次,当你在一个事件中添加新动作时。在编写代码动作时你也同样可以使用gml。第三,如果你想在一个动作中使用指定的一个值,你同样可以使用gml来表达。一段语句如下所说,并不是完整的程序,只是计算出结果的一段代码。 在本章中我们将向你描述gml的基本概念。当你希望学习使用gml时,这里有一些东西

5、你需要留意。首先,你的所有资源(精灵、对象、声音、等等)你必须使用一个以字母开头,全部由字母、数字或下划线组成的名称。不然的话你将无法在程序中正确的调用他们。确保所有资源都有不同的名字。同时也要注意不要将资源取名为 self、global或者其他保留字,因为这些字符在gml中有特殊含义(具体有哪些保留字将在后面详细论述). 一个程序 一个程序包括一套完整的指令,称为语句。一个程序必须以 开头,以 结尾。之间是 语句文本。每行语句必须以; 分号结尾。所以语句的通常形式应该是这样的 : ; ; .语句的样式可以有很多种,将在以下各章节论述 .变量 和其他语言一样,gml中也有变量。变量是存储信息的

6、一段内存空间。他们各有不同的名字 以便于你去调用他们。gml中的一个变量既可以存储一个真实数字,也可以存储一个字符串。 变量并不需要像其他语言一样需要预先声明。这里有大量内置的变量类型。一些相当常见比 如 mouse_x 和 mouse_y 定义鼠标当前位置。其他一些则定义我们扩展程序时使用的当前对 象例程。比如 x 和 y 定义当前例程的位置。一个变量的名称必须以字母打头,由字母、 数字或下划线组成(最长不超过64个字符)。当你在当前例程中使用新的变量时,在其他例 程的程序中是不可见的(即使是同一个对象的不同例程)。你仍然可以通过某种方法调用其 他例程里的变量,接着往下看.赋值语句 一段赋值

7、语句将一个值放入一个变量。形式如下 : = ;一个表达式可以是一个简单的数值,也可以是复杂的运算式。除了向一个变量赋值以外,同 样可以在当前变量值的基础上再次赋值,使用 +=的格式。当然,还有 -=,*= /= 或者更 加复杂的格式如 |=、&、=. 表达式表达式可以是数字(比如:4、3、5、6、等等),十六进制数字,或者是 $ 打头的标签( 比如 $00ffaa),单引号或双引号括起来的字符串(比如hello或hello)或者其他更复 杂的表达式。表达式中有下列双标识符(优先度较高 ): & | : 组合是否值 (& = 和, | = 或, = 异或) =: 比较,结果为 true (1)

8、or false (0) | & : 二进制计算 (| = 二进制或, & = 二进制并, = 二进制异或) : 二进制加减 ( = shift right) + -: 加减 * / div mod: 乘,除,整除,取模 要注意,x div y 的值是 x/y 后的结果中跟0最接近的整数值。 mod 操作符返回调用者的 运算域。也就是说,x mod y = x - (x div y) * y。同时还有以下几个运算符 : !: 否, true 转换为 false 和 false 转换为 true -: 否定后面的数值 : 否定后面的数值进行二进制位取反(1变0,0变1) 数值中你可以使用数字、变

9、量、或者返回一个值的函数。 子程序可以在括号内书写。所有运算符都是为真实存在的值工作的。比较运算符同样可以对 字符串进行操作, + 可以连接字符串(在这里要注意,和其他语言不同,相加时参数和布 尔变量总是会被计算,即使第一个参数已经决定了结果)。 举例 一个使用子程序的例子. x = 23; color = $ffaa00; str = hello world; y += 5; x *= y; x = y 2; x = 23*(2+4) / sin(y); str = hello + world; b = (x 5) & !(x=2 | x=4);扩展变量 你通过对一个变量赋值来创建新的变量(

10、不需要事先进行声明)。如果你只是使用一个变量 的名称,它只会存储当前对象例程的内容。所以不用担心它会包含其他对象的内容(或者同 一对象的另一个例程)。你可以在另一个对象中设置和读取变量,通过在变量名前面添加对 象名称和一个句点.。 . 要创建一个全局变量,就是全部对象例程都可以调用的变量,使用global.变量名的格式。 以下是一个示例: if (global.doit) / do something global.doit = false; 或者你能声明全局变量,形式如下. globalvar , . ;一旦这样的声明被执行, 变量将一直是全局形式不需要再加全局变量前缀“global.”了.

11、 而这仅仅只需要声明的代码块已被执行. 之后其他地方的这些变量就都会成为全局的. 有些时候你希望变量只在当前的代码段或者语句中使用。这种时候你必须避免浪费内存,并且确信这些变量名称不会带来混淆。同时这种变量也比全局变量速度更快。要使用这种变量 你必须在变量名前加入保留字 var和一个空格。这种声明看起来应该是这样的. var , . ;程序示例: var xx,yy; xx = x+10; yy = y+10; instance_create(xx,yy,ball);在其他例程中定位变量 如前所述,你可以在当前例程中使用如下语句设置变量 x = 3;但有些时候你希望在另一个例程中定义变量。比如

12、,你可能希望停止所有皮球的活动,或者 你可能想移动主要角色到一个指定的位置,又或者,在一次碰撞种,你可能希望牵涉进另一 个例程的精灵。这些都可以通过对象名.变量名的格式进行声明。例如,你可以这样书写 ball.speed = 0;这条语句将改变所有ball对象的移动速度为0。这里有几个比较特殊的“对象”。 self: 当前例程中正在执行动作的对象。 other: 其他例程中涉及碰撞事件的对象。 all: 所有例程。 noone: 不属于任何例程(听起来很诡异,但在后面迟早会用到它)。 global: 不属于某个例程,而是整个程序的全局变量。 举个例子,你可以用下面的方式进行变量定义 : oth

13、er.sprite_index = sprite5;all.speed = 0;global.message = a good result;global.x = ball.x;你会注意到最后一条语句是在有许多ball的情况下使用的。这样第一个ball.x的值就被新定 义的全局变量global.x取代了。 但如果你希望单独设置一个指定皮球的速度,而不是所有皮球呢?这稍微有点难度。每个例 程有一个独立的id。当你在编辑器里把例程放入一个房间后,这个例程的id就会在鼠标置于 例程之上的时候显示出来。这些id都是从100000开始增加的数字,同样可以用到句点的左边。 但要注意,句点可能会被辨认成小数

14、点,为了避免这种事情发生,需要给id数字加上括号以 示区别。举个例子,假设这个皮球的id是100032,你就可以这么写 : (100032).speed = 0;如果你在程序中创建了一个例程,call语句会返回例程的id,所以一个完整的程序段应该是 这样的 nnn = instance_create(100,100,ball); nnn.speed = 8;这会创建一个皮球并设定好它的速度,要注意我们把例程的id赋值给了一个变量,并使用这 个变量加在句点前面构成定位符。这样的用法是完全正确的。让我们用更精确的用法。一个 句点就是一个分隔符。它的左边是一个数值,右面是一个变量(或者说变量的地址)

15、,然后 返回特定对象或者例程中的特定变量的具体地址。所有对象的名称,以及特殊对象都会有一 个简单的数字编号,可以和其他数值一样被处理。举个例子,以下的几个语句都是正确的 : obj0 = ball; obj1 = flag; obj0.alarm4 = 12; obj1.id.x = 12;最后一个语句比较特殊。我们使用id作为第一标签。这样在那个id的例程中的x就被赋值为 12了。 对象名称,特殊对象,以及例程的id都可以在一些函数中使用。他们实际上在程序中被当 作常量使用. 数组 你可以在gml中使用一维或二维数组。只需要使用方括号将数组索引号括起来即可,二维数 组则在两个索引号之间加上逗

16、号分隔。一旦你使用数组索引号,数组即被创建。每个数组 都从0开始编号。所以在建立超长的数组时要小心,因为内存占用会比较巨大。不要使用负 数索引号。系统最大支持到32000的索引,以及总共1000000个最大索引尺寸。举个例子先: a0 = 1; i = 1; while (i 10) ai = 2*ai-1; i += 1; b4,6 = 32;if 语句if 后紧跟如下格式 if () 或 if () else 语句同样可以是一整段语句,表达式会进行运算。如果括号内的结果 =0 (或者是false) ,else 后面的语句就会执行。除此之外(表达式为true的时候),另一个语句就会执行。 在

17、语句前后加上大括号是个很好的习惯。如下所示 if () else 示例一下一段程序可以让对象向屏幕中心移动. if (x200) x += 4 else x -= 4;repeat 语句一个 repeat 语句有如下格式 repeat () 这样语句会重复运行与括号内表达式的值相同的次数 。 示例以下一段程序会在随机位置创建5个皮球. repeat (5) instance_create(random(400),random(400),ball);while 语句while 语句有如下格式 while () 只要表达式的值为真(true),语句就会一直运行下去。要注意你的 while 循环。你

18、很容 易会导致无限循环发生,那样的话你的游戏会永久挂起并失去任何用户输入的响应。 示例 以下一段程序会将对象置于随机的位置(这和把对象移动至随机位置的动作效果是一 样的). while (!place_free(x,y) x = random(room_width); y = random(room_height); do 语句do 语句有如下格式 do until()语句(当然也可以用大括号包裹一长段程序)会一直重复执行,直到表达式为真(true)。 语句至少会被执行一次。小心你的 do 循环。你可能会不小心弄出无限循环来,后果同 while 语句。 示例 以下一段程序会将当前对象移动到一个

19、随机的位置(效果同移动一个对象到一个随机 位置的动作): do x = random(room_width); y = random(room_height); until (place_free(x,y)for 语句for 语句有如下格式 for ( ; ;) 运行方式如下:首先语句1被执行。然后表达式进行运算。如果表达式为真,则语句3开始 执行,然后语句2和表达式进行重新运算。循环将一直执行至表达式为假。 听起来有点头晕你可以用这种方式去理解:语句1初始化 for 循环。表达式测试这个 循环是否要执行。语句2负责循环让循环进入下一轮。 最常见的用法就是进行某些事件的计数。 示例以下一段程序

20、会建立一个长度为10,内容为1到10的10个元素的数组. for (i=0; i=9; i+=1) listi = i+1;switch 语句有些时候你希望让你的行动由某些特定的值决定。你可以使用一串 if 语句来实现。但这里 有一种更加简单的方式, switch 语句。switch 语句有如下格式: switch () case : ; . ; break; case : ; . ; break; . default: ; .这段语句的效果如下:首先表达式进行运算。然后结果会同 case 后面的表达式的结果进行 比较。相同的结果就会执行后面相应的语句。如果没有一个相同,则执行 default

21、 后的语 句。当然, break 不是必须的。如果里面没有 break 语句,程序会简单的进入下一个 case 语句。 示例如下一段程序的效果是在不同的按键被按下后执行相应的动作. switch (keyboard_key) case vk_left: case vk_numpad4: x -= 4; break; case vk_right: case vk_numpad6: x += 4; break;break 语句the break 语句有如下格式 break如果在 for 循环、while 循环、repeat 循环、switch 循环、或者是 with 语句中使用, 它会停止这些循环

22、或语句。如果在一个语句外部使用则会停止执行当前程序(注意不是游戏本身). continue 语句continue 语句有如下格式 continue 如果在 for 循环、while 循环、repeat 循环、或者 with 语句中使用,它会继续让循环或 者 with 语句进入下一轮. exit 语句exit 语句有如下格式 exit这段语句会停止脚本或一段代码的执行。(这不会停止整个游戏的运行!要想这样你需要使 用 game_end(); 函数,后面会讲到)函数 函数的格式里要有个函数名,跟着是括号内的空参数或多个参数,用逗号分隔。如下 (,.) 有两种类型的函数。一种是大量的内建函数,控制你

23、的游戏中的各个方面,另一种是你自己 编写的脚本代码,作为函数在游戏中调用。 要记住,即使这个函数没有参数也不能漏掉后面的括号。有些函数会返回数值,可以在表达 式中使用。其他则只是简单的执行指令。 注意,函数不能出现在语句的左边。例如,你不能这样写 instance_nearest(x,y,obj).speed = 0 ,二要写成这个样子: (instance_nearest(x,y,obj).speed = 0.脚本 当你创建了一个脚本,你想给它加上参数(比如决定什么时候使用脚本动作,或者什么时候 将这段脚本作为函数进行调用,又或者是这段脚本自己。)这些参数将存储在变量参数0、 参数1、参数2

24、、。参数15。所以最多会有16个参数。(记住当在一个动作中调用脚本时 ,只能声明前5个参数。)当然你也可以使用 参数0 的方式。 脚本同样可以返回一个值,所以也可以用在表达式中。你可以使用如下格式 : return 脚本的运行会在 return 语句处停止! 示例这段代码会返回参数的平方值 : return (参数0*参数0);使用脚本就是使用函数一样.如,写下脚本名字并添加上所需要的参数(argument)传入.with 结构前面有提到,读取和改变其他例程的变量值是可以的。但很多时候你希望在其他例程中进行 多项操作。例如,假设你希望将所有皮球向下移动8个像素。你可能想以下面的语句执行这 一动

25、作 ball.y = ball.y + 8;但这并不正确。语句的右边是第一个皮球的纵坐标y值,现在加上8。下一次调用时所有皮球 的纵坐标y值就会和第一个球一样了。所以这就让所有皮球的纵坐标y值变成一样了。相当于 ball.y += 8;我们会得到同样的结果,只是前一个语句的缩写形式。那么怎样才能做到我们当初设想的动 作呢?你可以使用 with 语句,常用格式如下 with () 表达式指明一个或几个例程。你可以在这里放上例程id,对象的名称(在所有例程中的同一 对象),或者是一个特殊对象(all、self、other、noone)。语句会在每个指定的例程中 执行,跟当前例程一样。所以,为了移动

26、所有皮球向下移动8个像素,你应该这么写 with (ball) y += 8;如果你希望运行多行语句,加个大括号。举个例子,如果你希望将所有皮球移动至一个随机 位置,你可以这样用 with (ball) x = random(room_width); y = random(room_height);要注意,使用上面的语句后,指定例程就会变成 self 例程。而这个时候原先的 self 例程 就会变成 other 例程。所以举个例子,为了移动所有皮球到当前例程的位置,你可以这么 写 with (ball) x = other.x; y = other.y;with 语句的作用是非常强大的。让我们

27、举出更多的例子。要摧毁所有的皮球你可以这么写 with (ball) instance_destroy();如果一个炸弹爆炸了,然后你希望摧毁所有临近的例程你可以这么用 with (all) if (distance_to_object(other) 50) instance_destroy();注释 你可以在自己的程序代码中加入注释。同一行中/后的内容都不会被执行。你也可以放置 多行注释,前后分别放上/*和*/。(代码着色可能在这里工作不太正常!如果出现错误 请点击键盘f12重新进行代码着色.)gml中的函数和变量 gml包含许多数量的内建函数和变量。借助这些东西你可以控制游戏的所有方面。每

28、个动作 都会有对应的函数,所以实际上你如果你偏好编写代码的话你不需要用到任何现成的动作 (意思是完全可以自己编写动作代码)。但是这里也有更多的控制游戏各种方面的函数和变 量是无法用现成动作去完成的。所以如果你希望制作更加高级的游戏,可能的话你最好还是 阅读一遍以下各个章节的内容。要注意,这些函数和变量同样也可以用在动作数值上。所以 即使你不准备通过使用代码或者自己编写脚本,你仍然会得益于这项信息。 这里有一个语法约定,变量名前加上星号*表示只读,也就是说这些数值不会再变化了。 变量名后加上0.n表示是一个数组变量。索引号的有效长度前面已经提到过了. 2.数学运算单元 game maker包括很

29、多用来完成计算任务的函数。常数 以下几个系统中存在的常数 : true 等同于1.false 等同于 0.pi 等同于 3.1415. 实数函数 以下函数都是处理实数变量的. random(x)返回一个随机的实数,范围从 0 到 x 。数值总小于 x .random_set_seed(seed) 设置种子(整数)用于随机数生成。可以用来重复相同的随即序列(注:也可以是也些行动或者系统自身使用的随机数).random_get_seed() 返回当前种子.randomize() 设置种子到一个随机数.choose(val1,val2,val3,.)随机返回其中一个参数。最多可以有16个参数.abs

30、(x)返回 x 的绝对值.sign(x)返回 x 的符号(-1,0,或1)。 round(x)返回与 x 最接近的整数.floor(x)返回比 x 小的最大整数.ceil(x) 返回比 x 大的最小整数.frac(x)返回 x 的小数点以后的部分.sqrt(x)返回 x 的开方。 x 不能是负数.sqr(x)返回 x 的平方.power(x,n)返回 x 的 n 次方.exp(x)e的n次方.ln(x)返回 x 的自然对数.log2(x)返回 x 的2的对数.log10(x)返回 x 的10的对数.logn(n,x)返回 x 的 n 的对数.sin(x) 返回 x 的正弦(x 单位为弧度).

31、cos(x) 返回 x 的余弦(x 单位为弧度). tan(x) 返回 x 的正切(x 单位为弧度). arcsin(x) 返回 x 的反正弦. arccos(x) 返回 x 的反余弦. arctan(x) 返回 x 的反正切. arctan2(y,x) 计算 arctan( y / x ) ,然后返回结果在正确象限内的角度值.degtorad(x) 转换角度到弧度. radtodeg(x) 转换弧度到角度. min(val1,val2,val3,.) 返回参数中的最小值。最高支持16个参数。必须全部是实数或全 部是字符串. max(val1,val2,val3,.) 返回参数中的最大值。最高

32、支持16个参数。必须全部是实数或全 部是字符串. mean(val1,val2,val3,.) 返回所有参数的平均值。最高支持16个参数。必须全部是实数 数值.median(val1,val2,val3,.)返回参数的中间数(如果参数数目为偶数,则两个中间数中 最小的那个作为返回值)。最高支持16个参数。必须全部是实数数值 .point_distance(x1,y1,x2,y2)返回位置1(x1,y1)到位置2(x2,y2)的距离.point_direction(x1,y1,x2,y2)返回从位置1(x1,y1)到位置2(x2,y2)的方向角度.lengthdir_x(len,dir)返回指定

33、长度及方向的矢量线在 x 轴上的投影长度.lengthdir_y(len,dir)返回指定长度及方向的矢量线在 y 轴上的投影长度.is_real(x)返回 x 是否为真实数值(否则就是字符串).is_string(x)返回 x 是否是一个字符串(否则就是一个真实数值).字符串处理函数 以下都是负责字符及字符串处理的函数。 chr(val) 返回字符串中包含参数指定的 ascii码字符的字符串。 ord(str) 返回字符串中第一个字符的 ascii 码。 real(str) 将字符串转换为真实数值。字符串可包含负号,小数点甚至是指数部分。 string(val) 将真实数值转换为标准格式的字

34、符串(整数时没有小数点位置,否则在小数点 后留两位)。 string_format(val,tot,dec) 将 val 以你自己的格式转换为字符串:tot 指定总的数字位 置,dec 指定小数点后有几位数字。 string_length(str) 返回字符串中字符的个数。 string_pos(substr,str) 返回字符串 substr 在字符串 str 中的位置(0 代表完全不符)。 string_copy(str,index,count) 返回字符串 str 的一部分,从 index 指定的位置开始, 长度为 count 。 string_char_at(str,index) 返回

35、字符串 str 中索引为 index 的字符。 string_delete(str,index,count) 返回删除了部分内容的字符串 str,从 index 开始,长 度为 count 。 string_insert(substr,str,index) 返回在位置 index 处添加子串 substr 后的 字符串 str。 string_replace(str,substr,newstr) 返回字符串 str 的一份拷贝,为字符串中 子串 substr 第一次出现的地方开始被字符串 newstr 替换后的内容。 string_replace_all(str,substr,newstr)

36、返回字符串 str 的一份拷贝,为字符串中 子串 substr 所有出现的地方开始被字符串 newstr 替换后的内容。 string_count(substr,str) 返回子串 substr 在字符串 str中出现的次数。 string_lower(str) 返回小写格式的字符串 str。 string_upper(str) 返回大写格式的字符串 str。 string_repeat(str,count) 返回由 count 个字符串 str 组成的新 字符串 str。 string_letters(str) 返回只包含字母的字符串 str。 string_digits(str) 返回只包

37、含数字的字符串 str。 string_lettersdigits(str) 返回包含字母和数字的字符串 str。 以下为处理系统粘贴板内容的相关函数。 clipboard_has_text() 返回粘贴板中是否存在任何文本。 clipboard_get_text() 返回当前粘贴板内文本内容。 clipboard_set_text(str) 将字符串 str 送入粘贴板。日期及时间处理 在game maker中有许多函数是专门处理日期和时间的。一个日期-时间格式是一组实数。整 数部分代表日期,最早到12/30/1899。小数点后的部分代表一天之中的24小时。现有有以下 函数 : date_c

38、urrent_datetime() 返回当前系统日期-时间。 date_current_date() 返回当前系统日期(不包括时间)。 date_current_time() 返回当前系统时间(不包括日期)。 date_create_datetime(year,month,day,hour,minute,second) 建立一个指定的日期-时间 数据。 date_create_date(year,month,day) 建立一个指定的日期数据。 date_create_time(hour,minute,second) 建立一个指定的时间数据。 date_valid_datetime(year,m

39、onth,day,hour,minute,second) 返回给定的日期-时间是否正 确。 date_valid_date(year,month,day) 返回给定的日期是否正确。 date_valid_time(hour,minute,second) 返回给定的时间是否正确。 date_inc_year(date,amount) 返回指定日期后 amount 年的新日期。amount 必须为整数 date_inc_month(date,amount) 返回指定日期后 amount 月的新日期。amount 必须为整数。 date_inc_week(date,amount) 返回指定日期后 a

40、mount 星期的新日期。amount 必须为整数 date_inc_day(date,amount) 返回指定日期后 amount 天的新日期。amount 必须为整数。 date_inc_hour(date,amount) 返回指定日期后 amount 小时的新日期。amount 必须为整数。 date_inc_minute(date,amount) 返回指定日期后 amount 分钟的新日期。 amount 必须为 整数。 date_inc_second(date,amount) 返回指定日期后 amount 秒的新日期。amount 必须为整数。 date_get_year(date)

41、 返回 date 对应的年份。 date_get_month(date) 返回 date 对应的月份。 date_get_week(date) 返回 date 对应的星期。 date_get_day(date) 返回 date 对应的天数。 date_get_hour(date) 返回 date 对应的小时。 date_get_minute(date) 返回 date 对应的分钟。 date_get_second(date) 返回 date 对应的秒。 date_get_weekday(date) 返回 date 对应一星期的哪一天。 date_get_day_of_year(date) 返回

42、 date 对应一年中的哪一天。 date_get_hour_of_year(date) 返回 date 对应一年中的哪一小时。 date_get_minute_of_year(date) 返回 date 对应一年中的哪一分钟。 date_get_second_of_year(date) 返回 date 对应一年中的哪一秒。 date_year_span(date1,date2) 返回两个日期 date1 和 date2 之间相隔多少年。此函数只 报告年数片断。 date_month_span(date1,date2) 返回两个日期 date1 和 date2 之间相隔多少月。此函数 只报告月

43、份片断。 date_week_span(date1,date2) 返回两个日期 date1 和 date2 之间相隔多少星期。此函数 只报告星期片断。 date_day_span(date1,date2) 返回两个日期 date1 和 date2 之间相隔多少天。此函数只 报告天数片断。 date_hour_span(date1,date2) 返回两个日期 date1 和 date2 之间相隔多少小时。此函数 只报告小时片断。 date_minute_span(date1,date2) 返回两个日期 date1 和 date2 之间相隔多少分钟。此函 数只报告分钟片断。 date_second

44、_span(date1,date2) 返回两个日期 date1 和 date2 之间相隔多少秒。此函数 只报告秒数片断。 date_compare_datetime(date1,date2) 比较两个日期时间的大小,返回-1,0,1,分别代表 前者小于,等于,大于后者。 date_compare_date(date1,date2) 比较两个日期的大小,返回-1,0,1,分别代表前者小于, 等于,大于后者。 date_compare_time(date1,date2) 比较两个时间的大小,返回-1,0,1,分别代表前者小于, 等于,大于后者。 date_date_of(date) 返回指定日期-

45、时间数据的日期部分,时间部分设定成0。 date_time_of(date) 返回指定日期-时间数据的时间部分,日期部分设定成0。 date_datetime_string(date) 按照给定的数据,返回系统默认的字符串格式日期-时间。 date_date_string(date) 按照给定的数据,返回系统默认的字符串格式日期。 date_time_string(date) 按照给定的数据,返回系统默认的字符串格式时间。 date_days_in_month(date) 返回指定日期-时间所在月份的天数。 date_days_in_year(date) 返回指定日期-时间所在年份的天数。 d

46、ate_leap_year(date) 返回指定日期-时间所在年份是否为闰年。 date_is_today(date) 返回指定日期-时间是否为今天。3.游戏运行 你可以使用大量的变量和函数来定义游戏运行。 这些特别的函数可以改变运动和创建的实例,定时器,房间,还有事件的操作。移动 很明显,游戏的一个重要方面就是对象实例的四处移动。每个实例拥有两个内建的变量 x 和 y 用来指出实例的位置。(更精确的说,它们显示的位置是精灵原点摆放的位置。)( 0 , 0 )的位置在房间的最左上角。你可以通过改变实例 x 和 y 变量的值来改变实例的位置。你如果想要对象进行复杂运动,这是个可行的方法。把有关的

47、代码放在对象的并行( step )事件里。 如果对象以固定方向及恒速移动,实现起来就很简单。每个对象实例都有一个水平速度( hspeed )和一个垂直速度( vspeed )。两个速度都是以像素每步( pixels per step )为单位。一个正的水平速度就是向右的运动,负的水平速度意味着向左的运动。正的垂直速度是向下,负的垂直速度是向上。所以你必须给这些变量初始化(比如在创建事件里)使对象实例有一个恒速 。 自定义运动的方法和之前不同,使用了方向( direction )( 0-359 度),和速度( speed )(必须是非负数)。你可以设定并读取这些变量来自定义一个任意运动。(内部处

48、理实际上是把值转换成 hspeed 和 vspeed 。)当然还有阻力( friction )和重力( gravity )和重力方向( gravity dirction )供你使用。最后要说的是函数 motion_add(dir,speed) 用来给现有对象增加速度 。 完整来说,每个实例由以下变量和函数来处理它们的位置和运动: x 对象的 x 坐标 .y 对象的 y 坐标 .xprevious 对象以前的 x 坐标 .yprevious 对象以前的 y 坐标 .xstart 对象在房间里的初始 x 坐标 .ystart 对象在房间里的初始 y 坐标 .hspeed 速度的水平部分,即水平速度

49、 .vspeed 速度的垂直部分,即垂直速度 .direction 对象当前方向( 0-360 度,逆时针, 0 = 朝右) .speed 对象当前速度(像素每步) .friction 当前阻力(像素每步) .gravity 当前重力(像素每步) .gravity_direction 重力方向( 270 朝下) .motion_set(dir,speed) 以参数(方向,速度)设定运动 .motion_add(dir,speed) 以参数(方向,速度)对当前运动做改变 .这儿有大量可利用的函数帮助你定义你的运动 : place_free(x,y) 返回实例在( x , y )位置是否与固体实例

50、碰撞的值。这个函数用来在实际移动到新位置前检测。place_empty(x,y) 返回实例在( x , y )位置是否与任何东西碰撞的值。所以这个函数还把非固体实例加入计算范围。 place_meeting(x,y,obj) 返回实例在( x , y )位置是否与对象( obj )碰撞的值。与 obj 对象的实例遇到时,函数返回真( true )。也可以用实例名做 obj 参数,实例名都意味着是对象的一个实例。 place_snapped(hsnap,vsnap) 返回实例是否与网格对齐的值。 /hsnap 水平网格, vsnap 垂直网格 move_random(hsnap,vsnap) 移动实例到一个随机空闲并且是网格的位置,和其对应的动作效果一样。 move_snap(hsnap,vsnap) 将实例对齐网格,和其对应的动作效果一样。 move_wrap(hor,vert,margin) 离开房间到另一边时卷动实例。参数 hor 为是否水平卷动( 1 或 0 )参数 vert 为是否垂直卷动( 1 或 0 )。参数 margin 为卷动前离原点多远时实例必须离开房间。等于围绕房间的一圈留白。这个函数在离开事件( outside event )中使用非常具有代表性。 move_towards_point(x,y,sp) 以速度( sp

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论