UndertaleModTool介紹&使用 #3 (代碼篇)
“工欲善其事,必先利其器”
? ? 作為修改游戲之基,學(xué)習(xí)代碼編寫益處頗多,這可以讓我們避免只能復(fù)制粘貼他人現(xiàn)成的代碼,而可以創(chuàng)造自己想要的效果。介于本教程宗旨并不在此,這里只會(huì)介紹簡(jiǎn)單的代碼編寫(基于gm8),而且會(huì)與修改游戲捆綁。

一.數(shù)據(jù)
????在gm中,我們能見到這種數(shù)字“0” “1241” “3.14”,也會(huì)有 "你好" "Hellp"這種文本,前者就是個(gè)數(shù)字,后者我們叫它字符串,一個(gè)字符串應(yīng)該是 "xxx" 這種形式。我們可以用string(一個(gè)數(shù)字)把數(shù)字轉(zhuǎn)化為字符串,也可以用real(一個(gè)字符串)把字符串轉(zhuǎn)化為數(shù)字,例如string(1)得到的結(jié)果是字符串"1",real("1239.2")得到的是數(shù)字1239.2
????特別的?true 等同于1?;?false 等同于 0?;?pi 等同于 3.1415...
????往變量名前面加 global.?就是全局變量,整個(gè)游戲里,不管哪個(gè)房間,哪個(gè)obj都能訪問到
? ? 我們可以用字母(不僅僅是字母)表示數(shù)字(像if這種關(guān)鍵字也是不行的),例如a,b,eee,iloveut,這四個(gè)都被稱作變量,變量使用的要求是被賦予一個(gè)數(shù)值,不像大多數(shù)語言,我們不需要聲明一個(gè)變量(不存在這樣的聲明語句)
一個(gè)基本的賦值語句是 a = 數(shù)字(也可以是另一個(gè)變量)
如 a = 2 此時(shí),我們就建立了一個(gè)對(duì)應(yīng)關(guān)系,即 a是2,把2這個(gè)值賦予a,從此a就是2了,比如這樣
形同i[x],x=0,1,2,3......的數(shù)叫做數(shù)組,你可以寫i[2]=5,show_message(i[2])顯示的結(jié)果就是5
對(duì)于一個(gè)object,其create事件里的代碼先執(zhí)行,所以大多數(shù)時(shí)候我們?cè)贑reate里賦值一次,來說明這個(gè)變量存在
我們把它寫到一個(gè)object的create事件里,再把這個(gè)object放到一個(gè)房間中,如果我們打開游戲進(jìn)入這個(gè)房間,就會(huì)有彈窗顯示“1”。
如果我們不先賦值這個(gè)a,那么就會(huì)報(bào)錯(cuò)“Unknown variable a”,因?yàn)閟how_message這個(gè)函數(shù)不知道a是什么東西
二.代碼執(zhí)行方面以及作用域
????1.代碼由上到下執(zhí)行,過程是瞬間完成的,如下,得到的結(jié)果是彈窗顯示數(shù)字2
????2.step里的代碼每秒執(zhí)行room_speed次(粗略來說),以下摘自gm8說明手冊(cè):
步開始事件在每一步開始時(shí)被執(zhí)行,在任何其他事件之前發(fā)生;正常的歩事件在實(shí)例被放到新的位置之前執(zhí)行;步結(jié)束事件在一步的最后,僅僅是繪制事件之前執(zhí)行。
????3.draw事件里通俗來說,你可以用draw_xxxxxxx系列的函數(shù),當(dāng)然,別的也行。執(zhí)行類似step事件
????4.var的使用:你可以用var定義一個(gè)臨時(shí)變量,在gm8中你可以這么寫,var定義的東西只在當(dāng)前事件里有用,比如create里var一個(gè)a,你在step寫個(gè)show_message(a)就會(huì)報(bào)錯(cuò)
????5.{}圈起來的代碼是一個(gè)整體,如果{}里面只有一條,可以不寫{}
????6.不同的代碼之間如果硬要寫一行,或者亂七八糟,就要加 ; 隔開不同的代碼段
三.邏輯,判斷
????1.常用符運(yùn)算(最常用)
????< <= > >= :這四個(gè)你就當(dāng)是不等號(hào),比如 3 < 4 結(jié)果是 true ;4>=4 結(jié)果也是true
????==:判斷兩邊是否一樣,一樣就得出結(jié)果(返回)true,否則則是false。例如1?== 0的結(jié)果為false
????or / || :意思是“或”,如果兩邊有一個(gè)是true就返回true。例如 (2 == 2) or (2?== 0)結(jié)果是true
????and / && :意思是“和”,兩邊都是true才行。例如 (312 == 312) and?(312 == 311)結(jié)果是 false
????*:乘號(hào)? /:除號(hào) mod:取余數(shù)
????!:!false = true ;!true = false。例如show_message(!0),顯示的是1
????-:你就當(dāng)這玩意是個(gè)負(fù)號(hào)
????2.一個(gè)if語句實(shí)例:a+=1意思是a=a+1,就是把a(bǔ)加上1再賦值給a,實(shí)現(xiàn)a的自增。不確定運(yùn)算順序時(shí)建議加括號(hào)(半角),避免邏輯和你想的不一樣的問題。if的意思是判斷后面的數(shù)是不是true,是就執(zhí)行{}里面的內(nèi)容,在此建議養(yǎng)成多用tab鍵的好習(xí)慣,讓代碼看起來更舒服。像這個(gè)例子,room_speed=30,寫在Step里,效果就是每隔2秒就彈窗顯示“0”
? ? 換一個(gè)例子。else里的代碼會(huì)在if判斷<=0時(shí)執(zhí)行。把這段代碼寫在draw事件里,游戲界面左上角就會(huì)繪制一段文本。在gm里,房間的坐標(biāo)以房間左上為(0,0)點(diǎn),向右為x軸正軸,向下為y軸正軸。irandom是個(gè)內(nèi)置函數(shù),隨機(jī)返回60以內(nèi)(包括60)的整數(shù)。在這個(gè)例子中,左上角顯示的數(shù)字要么是30-60之間,要么是100到129之間
四.幾個(gè)特殊語句
????1.for循環(huán)
????? ?基本結(jié)構(gòu)為:for (<語句1> ; <表達(dá)式> ;<語句2>) {xxxx}。首先執(zhí)行語句1。之后運(yùn)算表達(dá)式。如果表達(dá)式為true,則{xxxx}執(zhí)行,然后語句2和表達(dá)式重新進(jìn)行運(yùn)算。循環(huán)將一直執(zhí)行至表達(dá)式為false。
????????舉個(gè)例子:這段代碼一瞬間會(huì)被執(zhí)行完畢,其結(jié)果是產(chǎn)生數(shù)組i[0-9],其中i[0]=1;i[1]=2 ...i[9]=10
????2.while循環(huán)
????????例如這段代碼寫在create里,當(dāng)i<10時(shí),讓ii自增1,再把ii賦值給i,最后顯示的數(shù)字為ii的值,ii為10
????3.repeat語句
????????形如repeat(n) {xxxxx}這樣。一瞬間會(huì)執(zhí)行n次 {}里面的代碼
五.Switch語句
????基本就是個(gè)高級(jí)的if。像這個(gè)例子里,i=1時(shí)會(huì)讓a=1,而i=3時(shí),則是執(zhí)行default:后的代碼,因?yàn)闆]找到i=3對(duì)應(yīng)的情況。你可以把a(bǔ)=1之類的換成{}包裹的很多代碼,但后面應(yīng)該寫一個(gè)break。break的作用是跳出這個(gè)語句,比如上面的for語句改成這樣,list[6-9]就都不存在了,因?yàn)樵趇=5時(shí)這個(gè)循環(huán)被跳出去了。例子中的switch語句后,彈窗應(yīng)顯示999
六.with結(jié)構(gòu)
????有時(shí)候我們希望在a obj一段代碼里讓 b obj去干什么。這時(shí)我們可以寫道,假設(shè)在step里
{}中的代碼是以b為中心的,例如a的create里聲明了一個(gè)a=0,而b里沒有,你如果在{}里寫到什么“if a==1”,游戲就會(huì)報(bào)錯(cuò),因?yàn)閎里沒有a這個(gè)變量
? ? 一個(gè)較為復(fù)雜的例子:instance_create(0,1,xxx)意思是在橫坐標(biāo)為0,縱坐標(biāo)為1處生成object xxx,同時(shí)這個(gè)函數(shù)會(huì)返回一個(gè)數(shù)值,這個(gè)數(shù)值是生成的這個(gè)obj的id(在房間里的編號(hào)),也就是生成的同時(shí),讓ball被賦予了這個(gè)生成的xxx的id。因此with語句會(huì)讓這個(gè)id對(duì)應(yīng)的obj進(jìn)行“速度是5以內(nèi)隨機(jī)整數(shù),運(yùn)動(dòng)方向360度隨機(jī),起始位置是從 以房間寬度為底隨機(jī)一個(gè)橫坐標(biāo),以房間高度為底隨機(jī)一個(gè)縱坐標(biāo) 開始運(yùn)動(dòng)”
????如果你單純要在a obj里改b obj一個(gè)變量i,你可以寫 b.i=什么什么。這樣可以讓你從一個(gè)obj訪問另一個(gè)obj的變量,并且進(jìn)行操作。