欢迎光临散文网 会员登陆 & 注册

UndertaleModTool介绍&使用 #3 (代码篇)

2021-06-09 20:23 作者:真是滑稽了啊  | 我要投稿

“工欲善其事,必先利其器”

    作为修改游戏之基,学习代码编写益处颇多,这可以让我们避免只能复制粘贴他人现成的代码,而可以创造自己想要的效果。介于本教程宗旨并不在此,这里只会介绍简单的代码编写(基于gm8),而且会与修改游戏捆绑。

一.数据

    在gm中,我们能见到这种数字“0” “1241” “3.14”,也会有 "你好" "Hellp"这种文本,前者就是个数字,后者我们叫它字符串,一个字符串应该是 "xxx" 这种形式。我们可以用string(一个数字)把数字转化为字符串,也可以用real(一个字符串)把字符串转化为数字,例如string(1)得到的结果是字符串"1",real("1239.2")得到的是数字1239.2

    特别的 true 等同于1 ; false 等同于 0 ; pi 等同于 3.1415...

    往变量名前面加 global. 就是全局变量,整个游戏里,不管哪个房间,哪个obj都能访问到

    我们可以用字母(不仅仅是字母)表示数字(像if这种关键字也是不行的),例如a,b,eee,iloveut,这四个都被称作变量,变量使用的要求是被赋予一个数值,不像大多数语言,我们不需要声明一个变量(不存在这样的声明语句)

一个基本的赋值语句是 a = 数字(也可以是另一个变量)

如 a = 2 此时,我们就建立了一个对应关系,即 a是2,把2这个值赋予a,从此a就是2了,比如这样

形同i[x],x=0,1,2,3......的数叫做数组,你可以写i[2]=5,show_message(i[2])显示的结果就是5

对于一个object,其create事件里的代码先执行,所以大多数时候我们在Create里赋值一次,来说明这个变量存在

我们把它写到一个object的create事件里,再把这个object放到一个房间中,如果我们打开游戏进入这个房间,就会有弹窗显示“1”。

如果我们不先赋值这个a,那么就会报错“Unknown variable a”,因为show_message这个函数不知道a是什么东西

二.代码执行方面以及作用域

    1.代码由上到下执行,过程是瞬间完成的,如下,得到的结果是弹窗显示数字2

    2.step里的代码每秒执行room_speed次(粗略来说),以下摘自gm8说明手册:

步开始事件在每一步开始时被执行,在任何其他事件之前发生;正常的歩事件在实例被放到新的位置之前执行;步结束事件在一步的最后,仅仅是绘制事件之前执行。

    3.draw事件里通俗来说,你可以用draw_xxxxxxx系列的函数,当然,别的也行。执行类似step事件

    4.var的使用:你可以用var定义一个临时变量,在gm8中你可以这么写,var定义的东西只在当前事件里有用,比如create里var一个a,你在step写个show_message(a)就会报错

    5.{}圈起来的代码是一个整体,如果{}里面只有一条,可以不写{}

    6.不同的代码之间如果硬要写一行,或者乱七八糟,就要加 ; 隔开不同的代码段

三.逻辑,判断

    1.常用符运算(最常用)

    < <= > >= :这四个你就当是不等号,比如 3 < 4 结果是 true ;4>=4 结果也是true

    ==:判断两边是否一样,一样就得出结果(返回)true,否则则是false。例如1 == 0的结果为false

    or / || :意思是“或”,如果两边有一个是true就返回true。例如 (2 == 2) or (2 == 0)结果是true

    and / && :意思是“和”,两边都是true才行。例如 (312 == 312) and (312 == 311)结果是 false

    *:乘号  /:除号 mod:取余数

    !:!false = true ;!true = false。例如show_message(!0),显示的是1

    -:你就当这玩意是个负号

    2.一个if语句实例:a+=1意思是a=a+1,就是把a加上1再赋值给a,实现a的自增。不确定运算顺序时建议加括号(半角),避免逻辑和你想的不一样的问题。if的意思是判断后面的数是不是true,是就执行{}里面的内容,在此建议养成多用tab键的好习惯,让代码看起来更舒服。像这个例子,room_speed=30,写在Step里,效果就是每隔2秒就弹窗显示“0”

    换一个例子。else里的代码会在if判断<=0时执行。把这段代码写在draw事件里,游戏界面左上角就会绘制一段文本。在gm里,房间的坐标以房间左上为(0,0)点,向右为x轴正轴,向下为y轴正轴。irandom是个内置函数,随机返回60以内(包括60)的整数。在这个例子中,左上角显示的数字要么是30-60之间,要么是100到129之间

四.几个特殊语句

    1.for循环

       基本结构为:for (<语句1> ; <表达式> ;<语句2>) {xxxx}。首先执行语句1。之后运算表达式。如果表达式为true,则{xxxx}执行,然后语句2和表达式重新进行运算。循环将一直执行至表达式为false。

        举个例子:这段代码一瞬间会被执行完毕,其结果是产生数组i[0-9],其中i[0]=1;i[1]=2 ...i[9]=10

    2.while循环

        例如这段代码写在create里,当i<10时,让ii自增1,再把ii赋值给i,最后显示的数字为ii的值,ii为10

    3.repeat语句

        形如repeat(n) {xxxxx}这样。一瞬间会执行n次 {}里面的代码

五.Switch语句

    基本就是个高级的if。像这个例子里,i=1时会让a=1,而i=3时,则是执行default:后的代码,因为没找到i=3对应的情况。你可以把a=1之类的换成{}包裹的很多代码,但后面应该写一个break。break的作用是跳出这个语句,比如上面的for语句改成这样,list[6-9]就都不存在了,因为在i=5时这个循环被跳出去了。例子中的switch语句后,弹窗应显示999

六.with结构

    有时候我们希望在a obj一段代码里让 b obj去干什么。这时我们可以写道,假设在step里

{}中的代码是以b为中心的,例如a的create里声明了一个a=0,而b里没有,你如果在{}里写到什么“if a==1”,游戏就会报错,因为b里没有a这个变量

    一个较为复杂的例子:instance_create(0,1,xxx)意思是在横坐标为0,纵坐标为1处生成object xxx,同时这个函数会返回一个数值,这个数值是生成的这个obj的id(在房间里的编号),也就是生成的同时,让ball被赋予了这个生成的xxx的id。因此with语句会让这个id对应的obj进行“速度是5以内随机整数,运动方向360度随机,起始位置是从 以房间宽度为底随机一个横坐标,以房间高度为底随机一个纵坐标 开始运动”

    如果你单纯要在a obj里改b obj一个变量i,你可以写 b.i=什么什么。这样可以让你从一个obj访问另一个obj的变量,并且进行操作。

UndertaleModTool介绍&使用 #3 (代码篇)的评论 (共 条)

分享到微博请遵守国家法律