4、脚本(Scripts)
在GM中,脚本(Scripts)的实质是自定义的函数。一个脚本的形式一般为:
①首尾最好有花括号。其实没有也不会有什么问题。。。事实上也有人建议objects里的代码段也要前后各一个花括号。喜欢写就写,不喜欢写就不写。{
var _num1,_num2;
_num1 = argument0 + argument1;
_num2 = argument2;
return _num1 * _num2;
}
②第一行在var后写一遍脚本中用到的所有变量(代表这些变量是临时变量,脚本执行完毕后,变量将自动销毁),不同变量名用逗号隔开。最后必须以分号结尾,否则会报错。
③所使用的变量名以下划线开头,或者全部使用大写字母。(避免命名冲突)
④通过argument来传递参数。例如,一个脚本,名字叫做AddFourNumber,以sum = AddFourNumber(12,25,44,37);(自定义函数的用法和GM自带的函数一致)调用这个脚本时,Add的四个参数,12,25,44,37,我们在脚本里就得用argument来获取,第一个参数为argument0,第二个参数为argument1,以此类推。注意第一个参数是argument0,并且即使只有一个参数也要写argument0而不能写argument。
⑤通过return来返回一个值,这个值即是这个脚本的返回值。
⑥脚本中允许直接使用对象的变量,而不通过argument传递(使用的对象的变量不用写在var后),但是这样有很大的隐患,因为脚本可以被任何对象使用,但是并不能保证所有的对象都有这个变量。所以除非是专门给某个特定对象使用的脚本,不应当使用脚本外部的变量。
示例:
写一个脚本VectorValue,以VectorValue(x1,y1,x2,y2)的使用方法来计算并返回两个向量(x1,y1)和(x2,y2)的积。
如果这样写到:{
var _product_x, _product_y;
_product_x = argument0 * argument2;
_product_y = argument1 * argument3;
return _product_x + _product_y;
}
这里ans就会被赋予向量(5,6)和(7,2)的向量积47。xx = 5;
yy = 6;
ans = VectorValue(xx,yy,7,2);
当然其实只要一句话,写成{return argument0*argument2+argument1*argument3;}就可以实现的,在这里我只是为了写一个示范=w=
注意:return语句不仅代表返回一个值,也代表着函数的结束,只要执行到了return语句,不管return语句后面还有什么代码,都不会被执行。
一个脚本可以不接受参数,也可以没有return语句(即没有返回值)。
但是没有返回值的脚本不能用于赋值,或者运算。
脚本的命名规则一般以自身的用途为基准,如PlayerMove,SaveGame,InitializeGlobal之类的,遵循骆驼命名法。
5、简单的输入输出函数
本节对应GML汉化文档的67-68页。GM中要想给玩家提供信息,或者从玩家处获取信息,该使用什么函数呢?
show_message(str);
显示一个对话框以输出信息。参数为一个字符串。弹出窗口时游戏会自动暂停。
例如,在房间的RCC(Room's creation code,房间创建代码)里写上show_message("Here is first room");
然后运行游戏:
emmm,字好像有点小,但是没关系,我们可以设置字体大小。
message_text_font(name,size,color,style);
show_message(string(5));
a = 5;b = 4;show_message("a+b is " + string(a+b) + "!");
a = 5;
无论是show_message(string(a));
还是show_message(a);
都是可以通过编译的。
同理:
show_message("16");
show_message(16);
message_text_font("Arial",15,c_red,0);a = get_integer("Input first number.", 5);b = get_integer("Input second number.", 5);show_message("Their sum is " + string(a+b) + "!");
if(show_question("A question here")){xxxxx;//玩家点yes后执行的代码}else//可以没有else部分,如果要先判断玩家按no,则可以在show_question前加上逻辑非(!){xxxx;//玩家点no后执行的代码}
if(show_question("Exit game?")){game_end();//game_end()函数用于结束游戏}