GameMakerGML.docx
- 文档编号:29808075
- 上传时间:2023-07-27
- 格式:DOCX
- 页数:160
- 大小:103.29KB
GameMakerGML.docx
《GameMakerGML.docx》由会员分享,可在线阅读,更多相关《GameMakerGML.docx(160页珍藏版)》请在冰豆网上搜索。
GameMakerGML
一、GML语言概述
GameMaker内置一款编程语言。
让你在标准动作之外取得更多的自由度和操纵力。
那个语言咱们简称它为GML(GameMakerLanguage)。
你能够在很多地址用那个语言编写代码。
第一,当你概念脚本的时候。
脚本确实是一份GML程序。
第二,当你在一个事件中添加新动作时。
在编写代码动作时你也一样能够利用GML。
第三,若是你想在一个动作中利用指定的一个值,你一样能够利用GML来表达。
一段语句如下所说,并非是完整的程序,只是计算出结果的一段代码。
在本章中咱们将向你描述GML的大体概念。
当你希望学习利用GML时,那个地址有一些东西你需要留意。
第一,你的所有资源(精灵、对象、声音、等等)你必需利用一个以字母开头,全数由字母、数字或下划线组成的名称。
不然的话你将无法在程序中正确的挪用他们。
确保所有资源都有不同的名字。
同时也要注意不要将资源取名为self、global或其他保留字,因为这些字符在GML中有特殊含义(具体有哪些保留字将在后面详细论述).
GML的相关信息能够在以下页面找到:
一个程序
变量
赋值
表达式
扩展变量
在其他实例中概念变量
数组
If语句
Repeat语句
While语句
Do语句
For语句
Switch语句
Break语句
Continue语句
Exit语句
函数
脚本
With结构
注释
GML中的函数和变量
一个程序
一个程序包括一套完整的指令,称为语句。
一个程序必需以'{'开头,以'}'结尾。
之间是语句文本。
每行语句必需以';'分号结尾。
因此语句的通常形式应该是如此的:
{
...
}
语句的样式能够有很多种,将在以下各章节论述。
变量
和其他语言一样,GML中也有变量。
变量是存储信息的一段内存空间。
他们各有不同的名字以便于你去挪用他们。
GML中的一个变量既能够存储一个真实数字,也能够存储一个字符串。
变量并非需要像其他语言一样需要预先声明。
那个地址有大量内置的变量类型。
一些相当常见比如mouse_x和mouse_y概念鼠标当前位置。
其他一些那么概念咱们扩展程序时利用的当前对象例程。
比如x和y概念当前例程的位置。
一个变量的名称必需以字母打头,由字母、数字或下划线组成(最长不超过64个字符)。
当你在当前例程中利用新的变量时,在其他例程的程序中是不可见的(即便是同一个对象的不同例程)。
你仍然能够通过某种方式挪用其他例程里的变量,接着往下看。
赋值语句
一段赋值语句将一个值放入一个变量。
形式如下:
<变量名>=<表达式>;
一个表达式能够是一个简单的数值,也能够是复杂的运算式。
除向一个变量赋值之外,同样能够在当前变量值的基础上再次赋值,利用'+='的格式。
固然,还有-=,*=/=或更加复杂的格式如|=、&\、^=.
表达式
表达式能够是数字(比如:
4、3、五、六、等等),十六进制数字,或是$打头的标签(比如$00FFAA),单引号或双引号括起来的字符串(比如"Hello"或'hello')或其他更复杂的表达式。
表达式中有以下双标识符(优先度较高):
*&&||^^:
组合是不是值(&&=和,||=或,^^=异或)
*<<===!
=>>=:
比较,结果为true
(1)orfalse(0)
*|&^:
二进制计算(|=二进制或,&=二进制并,^=二进制异或)
*<<>>:
二进制加减(<<=shiftleft,>>=shiftright)
*+-:
加减
**/divmod:
乘,除,整除,取模
要注意,xdivy的值是x/y后的结果中跟0最接近的整数值。
mod操作符返回挪用者的运算域。
也确实是说,xmody=x-(xdivy)*y。
同时还有以下几个运算符:
*!
:
否,true转换为false和false转换为true
*-:
否定后面的数值
*~:
否定后面的数值进行二进制位取反(1变0,0变1)
数值中你能够利用数字、变量、或返回一个值的函数。
子程序能够在括号内书写。
所有运算符都是为真实存在的值工作的。
比较运算符一样能够对字符串进行操作,+能够连接字符串(在那个地址要注意,和其他语言不同,相加时参数和布尔变量老是会被计算,即便第一个参数已经决定了结果)。
举例
一个利用子程序的例子.
{
x=23;
color=$FFAA00;
str='helloworld';
y+=5;
x*=y;
x=y<<2;
x=23*((2+4)/sin(y));
str='hello'+"world";
b=(x<5)&&!
(x==2||x==4);
}
扩展变量
你通过对一个变量赋值来创建新的变量(不需要事前进行声明)。
若是你只是利用一个变量
的名称,它只会存储当前对象例程的内容。
因此不用担忧它会包括其他对象的内容(或同
一对象的另一个例程)。
你能够在另一个对象中设置和读取变量,通过在变量名前面添加对象名称和一个句点'.'。
.
要创建一个全局变量,确实是全数对象例程都能够挪用的变量,利用'global.变量名'的格式。
以下是一个例如:
{
if(global.doit)
{
oit=false;
}
}
或你能声明全局变量,形式如下.
globalvar
一旦如此的声明被执行,变量将一直是全局形式不需要再加全局变量前缀“global.”了.而这仅仅只需要声明的代码块已被执行.以后其他地址的这些变量就都会成为全局的.
有些时候你希望变量只在当前的代码段或语句中利用。
这种时候你必需幸免浪费内存,而且确信这些变量名称可不能带来混淆。
同时这种变量也比全局变量速度更快。
要利用这种变量
你必需在变量名前加入保留字'var'和一个空格。
这种声明看起来应该是如此的.
var
程序例如:
{
varxx,yy;
xx=x+10;
yy=y+10;
instance_create(xx,yy,ball);
}
在其他例程中定位变量
如前所述,你能够在当前例程中利用如下语句设置变量
x=3;
但有些时候你希望在另一个例程中概念变量。
比如,你可能希望停止所有皮球的活动,或你可能想移动要紧角色到一个指定的位置,又或,在一次碰撞种,你可能希望牵涉进另一个例程的精灵。
这些都能够通过"对象名.变量名"的格式进行声明。
例如,你能够如此书写
ball.speed=0;
这条语句将改变所有ball对象的移动速度为0。
那个地址有几个比较特殊的“对象”。
*self:
当前例程中正在执行动作的对象。
*other:
其他例程中涉及碰撞事件的对象。
*all:
所有例程。
*noone:
不属于任何例程(听起来很诡异,但在后面早晚会用到它)。
*global:
不属于某个例程,而是整个程序的全局变量。
举个例子,你能够用下面的方式进行变量概念:
=sprite5;
=0;
='Agoodresult';
=;
你会注意到最后一条语句是在有许多ball的情形下利用的。
如此第一个的值就被新定义的全局变量取代了。
但如果是你希望单独设置一个指定皮球的速度,而不是所有皮球呢?
这略微有点难度。
每一个例
程有一个独立的ID。
当你在编辑器里把例程放入一个房间后,那个例程的ID就会在鼠标置于例程之上的时候显示出来。
这些ID都是从100000开始增加的数字,一样能够用到句点的左侧。
但要注意,句点可能会被识别成小数点,为了幸免这种情形发生,需要给ID数字加上括号以示区别。
举个例子,假设那个皮球的ID是100032,你就能够够这么写:
(100032).speed=0;
若是你在程序中创建了一个例程,call语句会返回例程的ID,因此一个完整的程序段应该是如此的
{
nnn=instance_create(100,100,ball);
=8;
}
这会创建一个皮球并设定好它的速度,要注意咱们把例程的ID赋值给了一个变量,并利用那个变量加在句点前面组成定位符。
如此的用法是完全正确的。
让咱们用更精准的用法。
一个句点确实是一个分隔符。
它的左侧是一个数值,右面是一个变量(或说变量的地址),然后返回特定对象或例程中的特定变量的具体地址。
所有对象的名称,和特殊对象都会有一个简单的数字编号,能够和其他数值一样被处置。
举个例子,以下的几个语句都是正确的:
{
obj[0]=ball;
obj[1]=flag;
obj[0].alarm[4]=12;
obj[1].=12;
}
最后一个语句比较特殊。
咱们利用id作为第一标签。
如此在那个ID的例程中的x就被赋值为12了。
对象名称,特殊对象,和例程的ID都能够在一些函数中利用。
他们事实上在程序中被当作常量利用.
数组
你能够在GML中利用一维或二维数组。
只需要利用方括号将数组索引号括起来即可,二维数组那么在两个索引号之间加上逗号分隔。
一旦你利用数组索引号,数组即被创建。
每一个数组都从0开始编号。
因此在成立超长的数组时要警惕,因为内存占用会比较庞大。
不要利用负数索引号。
系统最大支持到32000的索引,和总共1000000个最大索引尺寸。
举个例子先:
{
a[0]=1;
i=1;
while(i<10){a[i]=2*a[i-1];i+=1;}
b[4,6]=32;
}
If语句
if后紧跟如下格式
if(
或
if(
语句一样能够是一整段语句,表达式会进行运算。
若是括号内的结果<=0(或是false),else后面的语句就会执行。
除此之外(表达式为true的时候),另一个语句就会执行。
在语句前后加上大括号是个专门好的适应。
如下所示
if(
{
}
else
{
}
例如
一下一段程序能够让对象向屏幕中心移动.
{
if(x<200){x+=4}else{x-=4};
}
Repeat语句
一个repeat语句有如下格式
repeat(<表达式>)<语句>
如此语句会重复运行与括号内表达式的值相同的次数。
例如
以下一段程序会在随机位置创建5个皮球.
{
repeat(5)instance_create(random(400),random(400),ball);
}
While语句
while语句有如下格式
while(<表达式>)<语句>
只要表达式的值为真(true),语句就会一直运行下去。
要注意你的while循环。
你很容易会致使无穷循环发生,那样的话你的游戏会永久挂起并失去任何用户输入的响应。
例如
以下一段程序会将对象置于随机的位置(这和把对象移动至随机位置的动作成效是一样的).
{
while(!
place_free(x,y))
{
x=random(room_width);
y=random(room_height);
}
}
Do语句
do语句有如下格式
do<语句>until(<表达式>)
语句(固然也能够用大括号包裹一长段程序)会一直重复执行,直到表达式为真(true)。
语句至少会被执行一次。
警惕你的do
循环。
你可能会不警惕弄出无穷循环来,后果同while语句。
例如
以下一段程序会将当前对象移动到一个随机的位置(成效同移动一个对象到一个随机位置的动作):
{
do{
x=random(room_width);
y=random(room_height);
}
until(place_free(x,y))
}
For语句
for语句有如下格式
for(<语句1>;<表达式>;<语句2>)<语句3>
运行方式如下:
第一语句1被执行。
然后表达式进行运算。
若是表达式为真,那么语句3开始执行,然后语句2和表达式进行从头运算。
循环将一直执行至表达式为假。
听起来有颔首晕~~你能够用这种方式去明白得:
语句1初始化for循环。
表达式测试那个循环是不是要执行。
语句2负责循环让循环进入下一轮。
最多见的用法确实是进行某些事件的计数。
例如
以下一段程序会成立一个长度为10,内容为1到10的10个元素的数组.
{
for(i=0;i<=9;i+=1)list[i]=i+1;
}
Switch语句
有些时候你希望让你的行动由某些特定的值决定。
你能够利用一串if语句来实现。
但那个地址有一种加倍简单的方式,switch语句。
switch语句有如下格式:
switch(<表达式>)
{
case<表达式1>:
<语句1>;...;break;
case<表达式2>:
<语句1>;...;break;
...
default:
<语句>;...
}
这段语句的成效如下:
第一表达式进行运算。
然后结果会同case后面的表达式的结果进行比较。
相同的结果就会执行后面相应的语句。
若是没有一个相同,那么执行default后的语句。
固然,break不是必需的。
若是里面没有break语句,程序会简单的进入下一个case语句。
例如
如下一段程序的成效是在不同的按键被按下后执行相应的动作.
switch(keyboard_key)
{
casevk_left:
casevk_numpad4:
x-=4;break;
casevk_right:
casevk_numpad6:
x+=4;break;
}
Break语句
Thebreak语句有如下格式
break
若是在for循环、while循环、repeat循环、switch循环、或是with语句中利用,
它会停止这些循环或语句。
若是在一个语句外部利用那么会停止执行当前程序(注意不是游戏本身).
Continue语句
continue语句有如下格式
continue
若是在for循环、while循环、repeat循环、或with语句中利用,它会继续让循环或者with语句进入下一轮.
Exit语句
exit语句有如下格式
exit
这段语句会停止脚本或一段代码的执行。
(这可不能停止整个游戏的运行!
要想如此你需要使用game_end();函数,后面会讲到)
函数
函数的格式里要有个函数名,随着是括号内的空参数或多个参数,用逗号分隔。
如下
<函数名>(<参数1>,<参数2>,...)
有两种类型的函数。
一种是大量的内建函数,操纵你的游戏中的方方面面,另一种是你自己编写的脚本代码,作为函数在游戏中挪用。
要记住,即便那个函数没有参数也不能漏掉后面的括号。
有些函数会返回数值,能够在表达式中利用。
其他那么只是简单的执行指令。
注意,函数不能出此刻语句的左侧。
例如,你不能如此写instance_nearest(x,y,obj).speed=0,二要写成那个样子:
(instance_nearest(x,y,obj)).speed=0.
脚本
当你创建了一个脚本,你想给它加上参数(比如决定何时利用脚本动作,或何时将这段脚本作为函数进行挪用,又或是这段脚本自己。
)这些参数将存储在变量参数0、参数一、参数二、。
。
。
参数15。
因此最多会有16个参数。
(记住当在一个动作中挪用脚本时,只能声明前5个参数。
)固然你也能够利用参数[0]的方式。
脚本一样能够返回一个值,因此也能够用在表达式中。
你能够利用如下格式:
return<表达式>
脚本的运行会在return语句处停止!
例如
这段代码会返回参数的平方值:
{
return(参数0*参数0);
}
利用脚本确实是利用函数一样.如,写下脚本名字并添加上所需要的参数(argument)传入.
With结构
前面有提到,读取和改变其他例程的变量值是能够的。
但很多时候你希望在其他例程中进行多项操作。
例如,假设你希望将所有皮球向下移动8个像素。
你可能想以下面的语句执行这一动作
=+8;
但这并非正确。
语句的右边是第一个皮球的纵坐标y值,此刻加上8。
下一次调历时所有皮球的纵坐标y值就会和第一个球一样了。
因此这就让所有皮球的纵坐标y值变成一样了。
相当于
+=8;
咱们会取得一样的结果,只是前一个语句的缩写形式。
那么如何才能做到咱们当初假想的动作呢?
你能够利用with语句,经常使用格式如下
with(<表达式>)<语句>
表达式指明一个或几个例程。
你能够在那个地址放上例程ID,对象的名称(在所有例程中的同一对象),或是一个特殊对象(all、self、other、noone)。
语句会在每一个指定的例程中执行,跟当前例程一样。
因此,为了移动所有皮球向下移动8个像素,你应该这么写
with(ball)y+=8;
若是你希望运行多行语句,加个大括号。
举个例子,若是你希望将所有皮球移动至一个随机位置,你能够如此用
with(ball)
{
x=random(room_width);
y=random(room_height);
}
要注意,利用上面的语句后,指定例程就会变成self例程。
而那个时候原先的self例程就会变成other例程。
因此举个例子,为了移动所有皮球到当前例程的位置,你能够这么写
with(ball)
{
x=;
y=;
}
with语句的作用是超级壮大的。
让咱们举出更多的例子。
要摧毁所有的皮球你能够这么写
with(ball)instance_destroy();
若是一个炸弹爆炸了,然后你希望摧毁所有临近的例程你能够这么用
with(all)
{
if(distance_to_object(other)<50)instance_destroy();
}
注释
你能够在自己的程序代码中加入注释。
同一行中'
GML中的函数和变量
GML包括许多数量的内建函数和变量。
借助这些东西你能够操纵游戏的所有方面。
每一个动作都会有对应的函数,因此事实上你若是你偏好编写代码的话你不需要用到任何现成的动作(意思是完全能够自己编写动作代码)。
可是那个地址也有更多的操纵游戏各类方面的函数和变量是无法用现成动作去完成的。
因此若是你希望制作加倍高级的游戏,可能的话你最好仍是阅读一遍以下各个章节的内容。
要注意,这些函数和变量一样也能够用在动作数值上。
因此即便你不预备通过利用代码或自己编写脚本,你仍然会得益于这项信息。
那个地址有一个语法约定,变量名前加上星号'*'表示只读,也确实是说这些数值可不能再转变了。
变量名后加上'[0..n]'表示是一个数组变量。
索引号的有效长度前面已经提到过了.
二、数学运算单元
GameMaker包括很多用来完成计算任务的函数。
这儿是完整目录.
GML语言相关的信息在以下几页:
常数
实数函数
字符处置函数
日期及时刻处置
常数
以下几个系统中存在的常数:
true等同于1.
false等同于0.
pi等同于...
实数函数
以下函数都是处置实数变量的.
random(x)返回一个随机的实数,范围从0到x。
数值总小于x.
random_set_seed(seed)设置种子(整数)用于随机数生成。
能够用来重复相同的随即序列(注:
也能够是也些行动或系统自身利用的随机数).
random_get_seed()返回当前种子.
randomize()设置种子到一个随机数.
choose(val1,val2,val3,...)随机返回其中一个参数。
最多能够有16个参数.
abs(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单位为弧度).
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,...)返回参数中的最大值。
最高支持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)返回指定长度及方向的矢量线在x轴上的投影长度.
lengthdir_y(len,dir)返回指定长度及方向的矢量线在y轴上的投影长度.
is_real(x)返回x是不是为真实数值(不然确实是字符串).
is_string(x)返回x是不是是一个字符串(不然确实是一个真实数值).
字符串处置函数
以下都是负责字符及字符串处置的函数。
chr(val)返回字符串中包括参数指定的ASCII码字符的字符串。
ord(str)返回字符串中第一个字符的ASCII码。
real(str)将字符串转换为真实数值。
字符串可包括负号,小数点乃至是指
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- GameMakerGML
![提示](https://static.bdocx.com/images/bang_tan.gif)