GameMakerGML_第1页
GameMakerGML_第2页
GameMakerGML_第3页
GameMakerGML_第4页
GameMakerGML_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

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

文档简介

1、一、 gml语言概述game maker 内置一款编程语言。让你在标准动作之外取得更多的自由度和操纵力。那个语言咱们简称它为gml (game maker language) 。你能够在很多地址用那个语言编写代码。第一,当你概念脚本的时候。脚本确实是一份gml 程序。第二,当你在一个事件中添加新动作时。在编写代码动作时你也一样能够利用gml 。第三,若是你想在一个动作中利用指定的一个值,你一样能够利用gml 来表达。 一段语句如下所说,并非是完整的程序,只是计算出结果的一段代码。在本章中咱们将向你描述gml 的大体概念。当你希望学习利用gml 时,那个地址有一些东西你需要留意。第一,你的所有资

2、源(精灵、对象、声音、等等)你必需利用一个以字母开头, 全数由字母、 数字或下划线组成的名称。不然的话你将无法在程序中正确的挪用他们。确保所有资源都有不同的名字。同时也要注意不要将资源取名为self、global 或其他保留字,因为这些字符在gml 中有特殊含义(具体有哪些保留字将在后面详细论述). gml 的相关信息能够在以下页面找到: 一个程序变量赋值表达式扩展变量在其他实例中概念变量数组if 语句repeat 语句while 语句do 语句for 语句switch 语句break 语句continue 语句exit 语句函数脚本with 结构注释gml 中的函数和变量一个程序一个程序包括

3、一套完整的指令,称为语句。一个程序必需以 开头,以 结尾。之间是 语句文本。每行语句必需以;分号结尾。因此语句的通常形式应该是如此的: ; ; . 语句的样式能够有很多种,将在以下各章节论述。变量和其他语言一样,gml 中也有变量。变量是存储信息的一段内存空间。他们各有不同的名字以便于你去挪用他们。gml 中的一个变量既能够存储一个真实数字,也能够存储一个字符串。变量并非需要像其他语言一样需要预先声明。那个地址有大量内置的变量类型。一些相当常见比如 mouse_x 和 mouse_y 概念鼠标当前位置。其他一些那么概念咱们扩展程序时利用的当前对象例程。比如x 和 y 概念当前例程的位置。一个变

4、量的名称必需以字母打头, 由字母、 数字或下划线组成(最长不超过64 个字符)。当你在当前例程中利用新的变量时,在其他例程的程序中是不可见的(即便是同一个对象的不同例程)。你仍然能够通过某种方式挪用其他例程里的变量,接着往下看。赋值语句一段赋值语句将一个值放入一个变量。形式如下: = ; 一个表达式能够是一个简单的数值,也能够是复杂的运算式。除向一个变量赋值之外,同 样能够在当前变量值的基础上再次赋值,利用+=的格式。固然,还有-=,*= /= 或更加复杂的格式如|=、=. 表达式表达式能够是数字(比如:4、3、五、六、等等) ,十六进制数字,或是$ 打头的标签( 比如 $00ffaa ) ,

5、单引号或双引号括起来的字符串(比如hello 或hello)或其他更复杂的表达式。表达式中有以下双标识符(优先度较高): * & | : 组合是不是值(& = 和, | = 或, = 异或 ) * =: 比较 ,结果为true (1) or false (0) * | & : 二进制计算(| = 二进制或 , & = 二进制并 , = 二进制异或 ) * : 二进制加减( = shift right) * + -: 加减* * / div mod: 乘,除,整除,取模要注意, x div y 的值是x/y 后的结果中跟0 最接近的整数值。mod 操作符返回挪用者

6、的运算域。也确实是说,x mod y = x- (x div y) * y。同时还有以下几个运算符: * !: 否, true 转换为false 和 false 转换为true * -: 否定后面的数值* : 否定后面的数值进行二进制位取反(1 变 0,0 变 1)数值中你能够利用数字、变量、或返回一个值的函数。子程序能够在括号内书写。所有运算符都是为真实存在的值工作的。比较运算符一样能够对字符串进行操作,+ 能够连接字符串(在那个地址要注意,和其他语言不同,相加时参数和布尔变量老是会被计算,即便第一个参数已经决定了结果)。举例一个利用子程序的例子. x = 23; color = $ff a

7、a00; 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); 扩展变量你通过对一个变量赋值来创建新的变量(不需要事前进行声明)。若是你只是利用一个变量的名称, 它只会存储当前对象例程的内容。因此不用担忧它会包括其他对象的内容(或同一对象的另一个例程) 。你能够在另一个对象中设置和读取变量,通过在变量名前面添加对象名称和一个句点.。 . 要创建一个全局变量,确实是全数对象例程都能够挪用的变量,利用global.变量

8、名 的格式。以下是一个例如: if ( global .doit) oit = false; 或你能声明全局变量,形式如下. globalvar , . ; 一旦如此的声明被执行, 变量将一直是全局形式不需要再加全局变量前缀“global.”了. 而这仅仅只需要声明的代码块已被执行.以后其他地址的这些变量就都会成为全局的. 有些时候你希望变量只在当前的代码段或语句中利用。这种时候你必需幸免浪费内存,而且确信这些变量名称可不能带来混淆。同时这种变量也比全局变量速度更快。要利用这种变量你必需在变量名前加入保留字var和一个空格。这种声明看起来应该是如此的. var , . ; 程序例如 : var

9、 xx,yy; xx = x+10; yy = y+10; instance_create(xx,yy,ball); 在其他例程中定位变量如前所述,你能够在当前例程中利用如下语句设置变量x = 3; 但有些时候你希望在另一个例程中概念变量。比如,你可能希望停止所有皮球的活动,或你可能想移动要紧角色到一个指定的位置,又或, 在一次碰撞种, 你可能希望牵涉进另一个例程的精灵。这些都能够通过对象名 .变量名 的格式进行声明。例如,你能够如此书写ball .speed = 0; 这条语句将改变所有ball 对象的移动速度为0。那个地址有几个比较特殊的“对象”。* self: 当前例程中正在执行动作的对

10、象。* other: 其他例程中涉及碰撞事件的对象。* all: 所有例程。* noone: 不属于任何例程(听起来很诡异,但在后面早晚会用到它)。* global: 不属于某个例程,而是整个程序的全局变量。举个例子,你能够用下面的方式进行变量概念: = sprite5; = 0; = a good result; = ; 你会注意到最后一条语句是在有许多ball 的情形下利用的。如此第一个的值就被新定义的全局变量取代了。但如果是你希望单独设置一个指定皮球的速度,而不是所有皮球呢?这略微有点难度。每一个例程有一个独立的id 。当你在编辑器里把例程放入一个房间后,那个例程的id 就会在鼠标置于例

11、程之上的时候显示出来。这些id 都是从100000 开始增加的数字,一样能够用到句点的左侧。但要注意,句点可能会被识别成小数点,为了幸免这种情形发生,需要给id数字加上括号以示区别。举个例子,假设那个皮球的id 是 100032,你就能够够这么写: (100032).speed = 0; 若是你在程序中创建了一个例程,call 语句会返回例程的id,因此一个完整的程序段应该是如此的 nnn = instance_create(100,100,ball); = 8; 这会创建一个皮球并设定好它的速度,要注意咱们把例程的id 赋值给了一个变量,并利用那个变量加在句点前面组成定位符。如此的用法是完全

12、正确的。让咱们用更精准的用法。一个句点确实是一个分隔符。它的左侧是一个数值,右面是一个变量(或说变量的地址),然后返回特定对象或例程中的特定变量的具体地址。所有对象的名称, 和特殊对象都会有一个简单的数字编号,能够和其他数值一样被处置。举个例子,以下的几个语句都是正确的: obj0 = ball; obj1 = flag; obj0.alarm4 = 12; obj1. = 12; 最后一个语句比较特殊。咱们利用id 作为第一标签。 如此在那个id 的例程中的x 就被赋值为12 了。对象名称,特殊对象,和例程的id 都能够在一些函数中利用。他们事实上在程序中被当 作常量利用 . 数组你能够在

13、gml 中利用一维或二维数组。只需要利用方括号将数组索引号括起来即可,二维数组那么在两个索引号之间加上逗号分隔。一旦你利用数组索引号,数组即被创建。 每一个数组都从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 (

14、或是false) ,else后面的语句就会执行。除此之外(表达式为true 的时候),另一个语句就会执行。在语句前后加上大括号是个专门好的适应。如下所示if () else 例如一下一段程序能够让对象向屏幕中心移动. if (x200) x += 4 else x -= 4; repeat 语句一个repeat 语句有如下格式repeat () 如此语句会重复运行与括号内表达式的值相同的次数。例如以下一段程序会在随机位置创建5 个皮球 . repeat (5) instance_create(random(400),random(400),ball); while 语句while 语句有如下格

15、式while () 只要表达式的值为真(true) ,语句就会一直运行下去。要注意你的while 循环。你很容易会致使无穷循环发生,那样的话你的游戏会永久挂起并失去任何用户输入的响应。例如以下一段程序会将对象置于随机的位置(这和把对象移动至随机位置的动作成效是一样的 ). while (!place_free(x,y) x = random(room_width); y = random(room_height); do 语句do 语句有如下格式do until () 语句(固然也能够用大括号包裹一长段程序)会一直重复执行,直到表达式为真 (true) 。语句至少会被执行一次。警惕你的do 循

16、环。你可能会不警惕弄出无穷循环来,后果同while 语句。例如以下一段程序会将当前对象移动到一个随机的位置(成效同移动一个对象到一个随机位置的动作) : do x = random(room_width); y = random(room_height); until (place_free(x,y) for 语句for 语句有如下格式for ( ; ;) 运行方式如下:第一语句 1 被执行。 然后表达式进行运算。若是表达式为真,那么语句3 开始执行,然后语句2 和表达式进行从头运算。循环将一直执行至表达式为假。听起来有颔首晕你能够用这种方式去明白得:语句1 初始化for 循环。表达式测试那个

17、循环是不是要执行。语句2 负责循环让循环进入下一轮。最多见的用法确实是进行某些事件的计数。例如以下一段程序会成立一个长度为10,内容为1 到 10 的 10 个元素的数组 . for (i=0; i=9; i+=1) listi = i+1; switch 语句有些时候你希望让你的行动由某些特定的值决定。你能够利用一串if 语句来实现。但那个地址有一种加倍简单的方式,switch 语句。 switch 语句有如下格式:switch () case : ; . ; break ; case : ; . ; break ; . default : ; . 这段语句的成效如下:第一表达式进行运算。然

18、后结果会同case 后面的表达式的结果进行比较。相同的结果就会执行后面相应的语句。若是没有一个相同,那么执行default 后的语句。固然,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 若是在fo

19、r 循环、 while 循环、 repeat 循环、 switch 循环、或是with 语句中利用,它会停止这些循环或语句。若是在一个语句外部利用那么会停止执行当前程序(注意不是游戏本身 ). continue 语句continue 语句有如下格式continue 若是在for 循环、 while 循环、 repeat 循环、或with 语句中利用,它会继续让循环或者 with 语句进入下一轮. exit 语句exit 语句有如下格式exit 这段语句会停止脚本或一段代码的执行。(这可不能停止整个游戏的运行!要想如此你需要使用 game_end(); 函数,后面会讲到)函数函数的格式里要有个函

20、数名,随着是括号内的空参数或多个参数,用逗号分隔。如下(,.) 有两种类型的函数。一种是大量的内建函数,操纵你的游戏中的方方面面,另一种是你自己编写的脚本代码,作为函数在游戏中挪用。要记住, 即便那个函数没有参数也不能漏掉后面的括号。有些函数会返回数值,能够在表达式中利用。其他那么只是简单的执行指令。注意, 函数不能出此刻语句的左侧。例如, 你不能如此写instance_nearest(x,y,obj).speed = 0,二要写成那个样子:(instance_nearest(x,y,obj).speed = 0. 脚本当你创建了一个脚本,你想给它加上参数(比如决定何时利用脚本动作,或何时将这

21、段脚本作为函数进行挪用,又或是这段脚本自己。)这些参数将存储在变量参数0、参数一、参数二、。 。 。参数15。因此最多会有16 个参数。(记住当在一个动作中挪用脚本时,只能声明前 5 个参数。)固然你也能够利用参数 0的方式。脚本一样能够返回一个值,因此也能够用在表达式中。你能够利用如下格式: return 脚本的运行会在return 语句处停止!例如这段代码会返回参数的平方值: return (参数0*参数0); 利用脚本确实是利用函数一样.如,写下脚本名字并添加上所需要的参数(argument)传入. with 结构前面有提到, 读取和改变其他例程的变量值是能够的。但很多时候你希望在其他例

22、程中进行多项操作。 例如,假设你希望将所有皮球向下移动8 个像素。 你可能想以下面的语句执行这一动作= + 8; 但这并非正确。语句的右边是第一个皮球的纵坐标y 值,此刻加上8。下一次调历时所有皮球的纵坐标y 值就会和第一个球一样了。因此这就让所有皮球的纵坐标y 值变成一样了。相当于+= 8; 咱们会取得一样的结果,只是前一个语句的缩写形式。那么如何才能做到咱们当初假想的动作呢?你能够利用with 语句,经常使用格式如下with () 表达式指明一个或几个例程。你能够在那个地址放上例程id ,对象的名称(在所有例程中的同一对象) ,或是一个特殊对象(all、self、other、noone)

23、。语句会在每一个指定的例程中执行,跟当前例程一样。因此,为了移动所有皮球向下移动8 个像素,你应该这么写with (ball) y += 8; 若是你希望运行多行语句,加个大括号。 举个例子, 若是你希望将所有皮球移动至一个随机位置,你能够如此用with (ball) x = random(room_width); y = random(room_height); 要注意,利用上面的语句后,指定例程就会变成self 例程。 而那个时候原先的self 例程 就会变成other 例程。因此举个例子,为了移动所有皮球到当前例程的位置,你能够这么写with (ball) x = ; y = ; wit

24、h 语句的作用是超级壮大的。让咱们举出更多的例子。要摧毁所有的皮球你能够这么写with (ball) instance_destroy(); 若是一个炸弹爆炸了,然后你希望摧毁所有临近的例程你能够这么用with (all) if (distance_to_object(other) = 100000 ) 。 (注意,概念房间时,鼠标指定的实例id 名总会显示出来。)mask_index 遮照精灵的索引,用来碰撞检测。值为-1 时成效和sprite_index 一样。solid 实例是不是为固体。能够在游戏进行中改变。persistent 实例是不是持久显示而且移动到另一房间时再现。某些时候常常

25、需要把持久的成效关掉。(举例来讲,要回到第一个房间的时候)处置实例时有个问题。分辨单个的实例不是很容易。他们没出名字。 只有某特点对象的某个实例时你能够利用对象名,不然需要实例的id 名。实例有一个统一的标识符。你能够在with 语句中当做对象标识符利用。幸运的是有大量的变量及程序帮忙你定位实例id 名。instance_count* 房间中现存实例的数量。instance_id0.n-1* 特定实例的id 名。那个地址的n 为实例的编号。注意,实例对实例id 名的分派每一步都改变,因此你不能利用上一步的值。我来举个例子。 假想你游戏中的每一个单位都有专门有力量,你想找到最强壮的那个,能够利用

26、以下代码 : maxid = -1; maxpower = 0; for (i=0; i maxpower) maxid = iii; maxpower = ; 做完循环后,maxid 确实是那个最强的单位了。(循环时不要销毁实例,因为他们会自动从数组中移除)instance_find(obj,n) 返回值为参数obj 的第(n+1) 个实例id 名。参数obj 能够是某对象或是关键字all 。若是不存在,返回特殊对象noone 。注意,实例对实例id 名的分派每一步都改变,因此你不能利用上一步的值。instance_exists(obj) 返回值为obj 的实例是不是存在。参数obj 能够是

27、某对象,实例id 名或是关键字all 。instance_number(obj) 返回obj 实例的编号。参数obj 能够是某对象或是关键字all 。instance_position(x,y,obj) 返回值为obj 在(x , y )位置上实例的id 名。同一名置有多个实例时,返回第一个实例。参数obj 能够是某对象或是关键字all 。若是不存在,返回特殊对象noone 。instance_nearest(x,y,obj) 返回值为最接近(x , y )位置的obj 的实例id 名。参数obj能够是某对象或是关键字all 。instance_furthest(x,y,obj) 返回值为离(

28、x , y )位置最远的obj 的实例id 名。参数obj能够是某对象或是关键字all 。instance_place(x,y,obj) 返回值为碰到当前(x , y )位置上实例的obj 的实例id 名。参数obj 能够是某对象或是关键字all 。若是不存在,返回特殊对象noone 。下面的函数用于创建销毁实例.。instance_create(x,y,obj) 在(x , y )位置创建obj 的实例。函数返回新实例的id 名。instance_copy(performevent) 创建当前实例的复制品。参数performevent 为复制品的创建事件是不是必需执行。函数返回新复制品的id

29、 名。instance_destroy() 销毁当前实例。instance_change(obj,perf) 改变obj 的实例。参数perf 为是不是执行销毁和创建事件。position_destroy(x,y) 销毁所有包括(x , y )位置精灵的实例。position_change(x,y,obj,perf) 在( x , y )位置改变所有obj 的实例。参数perf 为是不是执行销毁和创建事件。解散实例当你创建大房间时,比如在平台游戏中,在一个小视野里,很多实例在视野的外面。这些实例仍然是激活状态而且会执行他们的事件。一样,计算碰撞检测时这些实例也会加入计算。如此会浪费大量的时刻,

30、通常也没有必要。(举例来讲,视野外的实例移动一点都不重要。 )为了解决那个问题,game maker 内含了一些函数来解散和激活实例。利用前你必需清楚地明白他们是如何运作的。解散实例时,它们会被判定为从游戏中移除。他们再也不可见也可不能执行任何事件。因此对大部份动作库和函数来讲,它们再也不存在。如此节省了大量的时刻,但利历时要超级警惕。举例来讲,当你删除某专门类型的所有实例,已解散实例没有被删除(因为它们不存在) 。因此不要以为一串角色捡到的钥匙能够用来打开一个已解散的门。最容易犯的错误是解除一个激活的实例。为了幸免下面的一些程序,要求你强调被挪用的实例可不能解除它本身这儿有些可用的程序: i

31、nstance_deactivate_all(notme) 解除房间内的所有实例。若是参数notme 为 true ( 1)正在挪用的实例可不能解除(一般是你想要的成效)。instance_deactivate_object(obj) 解除房间内的所有obj 的实例。你也能够参数obj 改成all来使所有的实例解除或指定实例id 名解除一单个的实例。instance_deactivate_region(left,top,width,height,inside,notme)解除指定区域内的所有实例(那些碰撞盒部份在区域内的也算)。若是参数inside 为 false ( 0) ,完全露在区域外的

32、实例会被解除。若是参数notme 为 true ( 1 )正在挪用的实例可不能解除(一般是你想要的成效)。instance_activate_all() 激活房间内的所有实例。instance_activate_object(obj) 激活房间内的所有obj 的实例。你也能够参数obj 改成all 来使所有的实例激活或指定实例id 名激活一单个的实例。instance_activate_region(left,top,width,height,inside)激活指定区域内的所有实例。若是参数inside 为 false ( 0 ) ,完全露在区域外的实例会被激活。举例来讲, 视野外的实例都解除

33、,视野内的实例全激活,你能够将下面的代码放到移动角色的步事件中: instance_activate_all(); instance_deactivate_region(view_xview0,view_yview0, view_wview0,view_hview0,false,true); 专门注意,你可能需要让区域比视野略微大一些. 按时一个好的游戏要求精准的时刻操纵。幸运的是game maker 有许多时刻方面的函数。使事物恒速(rate )发生。那个速度(rate)在概念房间的时候设置。你能够用全局变量room_speed 来改变它。 举例来讲, 通过每一步对room_speed增加一

34、个很小的量(比如) ,你能够缓慢增加游戏的速度,使它难度更高。若是你的电脑很慢,游戏速度可能不能达到。能够利用变量fps 来不断监测实际每秒的帧数。最后,一些高级按时利历时能够用变量current_time,电脑开始时的毫秒数。这儿是所有可用的变量(只有第一个能够改变): room_speed 当前房间的游戏速度(单位为步每秒)。fps* 实际每秒的帧数。current_time* 系统开始时通过的毫秒数。current_year* 当前年。current_month* 当前月。current_day* 当前日。current_weekday* 当前礼拜几(1 为礼拜日,,7 为礼拜六)。cu

35、rrent_hour* 当前小时。current_minute* 当前分钟。current_second* 当前秒。有时候你需要将游戏停止一小会儿。利用sleep 函数。sleep(numb) 睡眠(numb )毫秒如你所知, 每一个实例有12 个不同的按时器能够设置。利用下面的变量改变(或获取)不同按时器的值: alarm0.11 指定按时器的值。 (注意只有在对象的按时器事件包括动作时,按时器才会更新! )复杂的时刻问题能够利历时刻轴资源。每一个实例都有一个时刻轴资源关联。下面的函数是处置时刻轴的: timeline_index 实例关联时刻轴的索引。能够设定为一个特定的时刻线然后利用它。

36、设为-1 时停止利历时刻轴。timeline_position 当前时刻轴位置。能够改变它的值来跳过部份内容或是重复部份内容。timeline_speed 一样来讲,时刻轴上的位置每步都增加1。能够改变成不同的值。你能够用一个实数比如。 若是值比1 大,一样的时刻步内会发生更多的事件。他们会依照正确的命令许诺,因此可不能跳过任何动作。房间游戏是在房间中运行的。每一个房间都有一个索引名。当前房间保留在变量room 中。你不要将房间想象成持续的。因此不要增加或减少room 变量的值。 而应该利用下面的函数和变量。你能够利用下面一行典型的代码: if (room != room_last) room

37、_goto_next(); else game_end(); the following variables and functions exist that deal with rooms. 下面变量和函数用来处置房间. room 当前房间的索引。不能通过改变就进入一个不同的房间,要用下面的函数。room_first* 游戏中第一个房间的索引。room_last* 游戏中最后一个房间的索引。room_goto(numb) 进入索引为numb 的房间。room_goto_previous() 进入先前的房间。room_goto_next() 进入下一个房间。room_restart() 当前房

38、间从头开始。room_previous(numb) 返回先前房间的索引numb ( -1 为空) ,可是不能去那里。room_next(numb) 返回下一个房间的索引numb 。game_end() 终止游戏。game_restart() 游戏从头开始。挪用下面的函数来改变房间或终止或从头开始游戏时,请熟悉到房间的改变可不能立刻实现。 当前的动作全数执行完才开始改变。因此剩下的脚本仍然会执行,一样的应用可能挪用脚本。房间有这些附加属性: room_width* 房间的宽度。 (单位为像素)room_height* 房间的高度。 (单位为像素)room_caption 显示在窗口的房间名。ro

39、om_persistent 当前房间是不是持久显示。很多游戏要求玩家保留游戏和读取游戏。game maker 中 f5 保留游戏f6 读取游戏。也能够用一行代码保留和读取游戏(注意,读取只在当前步的最后发生)。game_save(string) 保留游戏为文件名string 。game_load(string) 读取文件名为string 的游戏。请熟悉到, 只是最大体的游戏数据被保留。若是播放一段音乐,在音乐的精准位置是不能保留的。 一样改变过的资源也不能保留。另外未保留的是数据结构内容,粒子, 还有多人设置。过渡当你从一个房间跳转到另外一个房间时你能选择过渡的模式,设定过渡到下一帧你必需设定

40、变量transition_kind. 若是你给予一个大于0 的值会改变下次改变房间的过渡模式,仅仅阻碍下次过渡,以后又会恢复成0,表示无过渡模式。transition_kind 显示下次房间过渡,你能利用这些内置变量。0 = 无阻碍1 = 从左制造2 = 从右制造3 = 从上制造4 = 从下制造5 = 中心制造6 = 从左移动7 = 从右移动8 = 从上移动9 = 从下移动10 = 从左隔行11 = 从右隔行12 = 从上隔行13 = 从下隔行14 = 从左推15 = 从右推16 = 从上推17 = 从下推18 = 左转动19 = 右转动20 = 混合房间21 = 淡入淡出transition

41、_steps 显示过渡的步数。步数越多,过渡花费时刻越长,默许是80。transition_define(kind,name) 你能够制造自概念的过渡。为此你必需概念一个脚本(可能在扩展包中)执行过渡。你能利用那个函数把过渡脚本增加到系统中。kind 是过渡的id (新的或是已存在的). name 是脚本的名字.注意脚本的名字是一个字符串!因此必需加上引号。注意那个是真正的高级函数。脚本必需是五个参数:上一个房间画面的表面,下一个房间画面的表面,表面宽,表面高,过渡的分数(0 到 1) 。它必需绘制画面到两个表面。transition_exists(kind) 返回过渡类型是不是存在。请注意在

42、利用3d 绘制的时候过渡可不能工作。另外房间过渡通常不能正常工作是因为房间尺寸(或是更精准的屏幕区域)不一致。分数很多游戏的另一个重要方面是得分,生命值,和生命。game maker 保留得分为全局变量score , 生命为全局变量lives。 生命值和生命一样如此。所有的实例若是生命大于0 ,而且要小于等于0 ,没有生命事件 ( no-more-lives event )就会执行。若是你不想在题目上显示得分和生命,设置show_score 为 false 。一样也能够改变题目。更复杂的游戏最好自己显示得分。score 当前得分。lives 生命数量。health 当前生命值(0-100 )

43、。show_score 是不是在窗口题目中显示得分。show_lives 是不是在窗口题目中显示生命数量。show_health 是不是在窗口题目中显示生命值。caption_score 用于得分的题目。caption_lives 用于生命数量的题目。caption_health 用于生命值得题目。产生事件如你所知,game maker 是完全事件驱动的。所有的动作都在事件中发生。有大量不同的事件。创建和销毁事件发生在实例创建或是销毁时。每一步中,系统第一运行闹钟事件。接下来运行键盘和鼠标事件,然后运行并行事件。再然后是碰撞事件,实例碰撞后设置到新的位置。最后绘制事件用来绘制实例(注意有多重视

44、野时绘制事件在每步中挪用多次)。你也能够通过代码对当前实例利用事件。下面是可用的函数: event_perform(type,numb) 当前实例执行指定类型事件的numb 号码。有以下事件类型能够指定: ev_create 创建事件ev_destroy 销毁事件ev_step 并行事件ev_alarm 闹钟事件ev_keyboard 键盘事件ev_mouse 鼠标事件ev_collision 碰撞事件ev_other 其他事件ev_draw 绘制事件ev_keypress 键盘按下事件ev_keyrelease 键盘松开事件有多个事件类型时,参数numb 能够用来指定精准的事件。比如闹钟事件

45、numb 能够设范围0 到 11 。键盘事件能够利用参数keycode 。鼠标事件能够利用下面的常量: ev_left_button 左键ev_right_button 右键ev_middle_button 中键ev_no_button 没有按键ev_left_press 按下左键ev_right_press 按下右键ev_middle_press 按下中键ev_left_release 放开左键ev_right_release 放开右键ev_middle_release 放开中键ev_mouse_enter 移入鼠标ev_mouse_leave 移开鼠标ev_mouse_wheel_up 滚

46、轮向上ev_mouse_wheel_down 滚轮向下ev_global_left_button 全局左键ev_global_right_button 全局右键ev_global_middle_button 全局中键ev_global_left_press 全局按下左键ev_global_right_press 全局按下右键ev_global_middle_press 全局按下中键ev_global_left_release 全局放开左键ev_global_right_release 全局放开右键ev_global_middle_release 全局放开中键ev_joystick1_left

47、一号手柄左ev_joystick1_right 一号手柄右ev_joystick1_up 一号手柄上ev_joystick1_down 一号手柄下ev_joystick1_button1 一号手柄按钮1 ev_joystick1_button2 一号手柄按钮2 ev_joystick1_button3 一号手柄按钮3 ev_joystick1_button4 一号手柄按钮4 ev_joystick1_button5 一号手柄按钮5 ev_joystick1_button6 一号手柄按钮6 ev_joystick1_button7 一号手柄按钮7 ev_joystick1_button8 一号手

48、柄按钮8 ev_joystick2_left 一号手柄左ev_joystick2_right 一号手柄右ev_joystick2_up 一号手柄上ev_joystick2_down 一号手柄下ev_joystick2_button1 一号手柄按钮1 ev_joystick2_button2 一号手柄按钮2 ev_joystick2_button3 一号手柄按钮3 ev_joystick2_button4 一号手柄按钮4 ev_joystick2_button5 一号手柄按钮5 ev_joystick2_button6 一号手柄按钮6 ev_joystick2_button7 一号手柄按钮7 e

49、v_joystick2_button8 一号手柄按钮8 碰撞事件中要给出另一对象的索引。最后,其他事件中利用以下常量: ev_outside 出房间ev_boundary 边界ev_game_start 游戏开始ev_game_end 游戏终止ev_room_start 房间开始ev_room_end 房间终止ev_no_more_lives 没有生命ev_no_more_health 没有生命值ev_animation_end 终止动画ev_end_of_path 终止途径ev_close_button 终止按钮ev_user0 自概念0 ev_user1 自概念1 ev_user2 自概念

50、2 ev_user3 自概念3 ev_user4 自概念4 ev_user5 自概念5 ev_user6 自概念6 ev_user7 自概念7 ev_user8 自概念8 ev_user9 自概念9 ev_user10 自概念10 ev_user11 自概念11 ev_user12 自概念12 ev_user13 自概念13 ev_user14 自概念14 ev_user15 自概念15 并行事件中利用以下常量: ev_step_normal 正常步ev_step_begin 步开始ev_step_end 步终止event_perform_object(obj,type,numb) 那个函数和

51、上面的函数相同除这次能够指定事件给另一个对象。注意,在这些事件里的动作是当前实例的,不是给对象实例的。event_user(numb) 在其他事件(other events )中能够概念16 个用户事件。只有当你挪用那个函数是运行。参数numb 必需在0 到 15 的范围内。event_inherited() 执行继承事件。只有实例拥有父对象是才有效。利用下面的只读变量能够获取当前事件执行的信息: event_type* 当前开始执行的事件类型。event_number* 当前开始执行的事件号码。event_object* 当前执行的事件的对象索引。event_action* 当前执行的事件的

52、动作索引。( 0 为事件中第一个执行的,依次类推)。复杂的变量和函数那个地址有一些处置犯错的变量和函数。error_occurred 显示是不是有错误发生。error_last 用字符串显示最后犯错的信息。show_debug_message(str) debug 模式中显示字符串下面的函数用来监测是不是确信变量的存在和如何设置变量及获取他们的值。所有这些函数的变量名都是用字符串传递。variable_global_exists(name) 返回值为名为参数name (字符串)的全局变量是不是存在。variable_local_exists(name) 返回值为当前实例的名为参数name (字

53、符串) 的局部变量是不是存在。variable_global_get(name) 返回值为给出参数name (字符串)的全局变量的值。variable_global_array_get(name,ind) 返回值为给出参数name (字符串)的全局数组的参数ind 的索引值。variable_global_array2_get(name,ind1,ind2) 返回值为给出参数name (字符串) 的全局二维数组变量的参数ind1 , ind2 的索引值。variable_local_get(name) 返回值为给出参数name (字符串)的局部变量的值。variable_local_array

54、_get(name,ind) 返回值为给出参数name (字符串)的局部数组的参数ind 的索引值。variable_local_array2_get(name,ind1,ind2) 返回值为给出参数name (字符串)的局部二维数组变量的参数ind1 , ind2 的索引值。variable_global_set(name,value) 设置给出参数name (字符串)的全局变量的值。variable_global_array_set(name,ind,value) 设置给出参数name(字符串)的全局数组的参数ind 的索引值。variable_global_array2_set(name

55、,ind1,ind2,value) 设置给出参数name(字符串)的全局二维数组变量的参数ind1 , ind2 的索引值。variable_local_set(name,value) 设置给出参数name (字符串)的局部变量的值variable_local_array_set(name,ind,value) 设置给出参数name (字符串)的局部数组的参数ind 的索引值。variable_local_array2_set(name,ind1,ind2,value) 设置给出参数name (字符串) 的局部二维数组变量的参数ind1 , ind2 的索引值。举例来讲,你能够如此写: if

56、variable_global_exists(ammunition) global .ammunition += 1 else global .ammunition = 0 你能够利用这些函数通过一种参数传递的方式给脚本传递变量,通过传递它们的字符名和利用函数来改变它们你能够利用下面的函数改变程序的优先级: set_program_priority(priority) 设置程序的优先级。能够指定-3 到 +3 之间的值。值为-3时意味着程序只会在如下情形运行,电脑没有其他程序要处置时,或是所有其他的程序都空闲时。值为-2 或 -1 时在正常线下,其他程序会有优先权。值为0 时是正常的值。值为

57、+1 或 +2 为较高的优先级,可能会致使较高的速度和较滑腻的游戏流程。但其他程序会取得很少的处置时刻。值为+3 时为实时模式。 在实时模式中大体上所有的时刻都分派到游戏当中去了。如此会致使电脑正在运行的其他应用程序发生严峻的问题。固然键盘事件再也不被电脑记录下来。因此只有当你想要所有的处置时刻时才利用那个函数。一样要注意最好利用前认真的检查一下而且运行前保留游戏。四、用户互动不存在不和玩家发生互动的游戏。在game maker 中进行互动,标准的途径是利用键盘或鼠标动作。 但有些时候你需要更多的操纵。利用一些代码你就能够够检查某些键盘按键是不是被按下, 当前鼠标的位置和鼠标哪个键被按劣等等功

58、能。通常你会在某些手柄对象的步幅事件中利用到他们,并做出相应的动作。在接下来的几页能够找到用户互动的资料: 键盘鼠标手柄键盘键盘互动中,存在以下几个变量和函数: keyboard_lastkey 最后一个按下的按键代码。请看后面的按键代码手册。你能够改变它,例如设定成0,若是你情愿的话。keyboard_key 当前按下的按键代码(看后面;若是是0 那么表示没有按键) 。keyboard_lastchar 最后一个按下的字符(返回字符串格式)。keyboard_string 返回最后一批被按下的字符,最多1024 个。字符串将只包括可打印字符。有些时候将某个按键映射成另一个按键相当有效。例如,

59、你可能想许诺玩家同时利用方向键和数字小键盘。 除简单复制动作之外,你还能够通过映射小键盘到方向键来完成。或你想弄一个操纵选项让玩家自己去设置按键。那么以下几个函数就会相当有效: keyboard_set_map(key1,key2) 映射按键代码key1 到 key2 。keyboard_get_map(key) 返回当前key 的映射代码。keyboard_unset_map() 重置所有被映射的按键到原始状态。要检查某个按键或鼠标键是不是被按下,你能够利用如下函数。这在需要设置多重按键的时候 会用到。keyboard_check(key) 返回指定的key 是不是正处于被按下的状态。key

60、board_check_pressed(key) 返回指定的按键key 是不是在上一步以后被按下。keyboard_check_released(key) 返回指定的按键key 是不是在上一步以后被放开。keyboard_check_direct(key) 直接通过硬件返回指定按键key 是不是被按下。结果取决于程序专注的方向,它许诺利用更多的按键检查。尤其是它能够检查vk_lshift,vk_lcontrol, vk_lalt,vk_rshift,vk_rcontrol和 vk_ralt 如此的按键代码来检测左侧或右边的shift,control 或alt 键被按下。以下几个函数用来处置键盘的状态: keyboard_get_

温馨提示

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

评论

0/150

提交评论