UndertaleModTool介紹&使用 #4 (分析一個對話object)
????由前文我們已經(jīng)學(xué)習(xí)了gm和UTMT最最基本的一些內(nèi)容,接下來我們來結(jié)合一個ut內(nèi)的實例來分析它是如何運作的,并進行相關(guān)內(nèi)容的介紹


我們要分析的是這樣一個object,這是遺跡內(nèi)的一個仙人掌,可以與之進行對話

作為一個無比常見的對話object,它有幾個典型特征:
????1.Parent是obj_readablesolid,意味著它繼承了obj_readablesolid的很多功能
????2.從貼圖碰撞箱可以看出,它能與玩家碰撞的地方就是白色區(qū)域大小

????3.有三個事件:Create;Alarm;Step


介于我們現(xiàn)在毫無頭緒,不如從它的Create出發(fā)吧。其中image_xscale = 1;image_yscale = 1 這兩條的意思是,圖形橫坐標(biāo)方向拉伸程度為1,圖形縱坐標(biāo)方向拉伸程度為1,如果你修改image_xscale?= 5,它就會變得很胖
myinteract = 0
image_xscale = 1
image_yscale = 1

再來看它的Alarm事件
myinteract = 3
global.msc = 0
global.msg[0] = "* Ah^1, the cactus.&* Truly the most tsundere& ?of plants./%%"
if global.flag[7]
? ?global.msg[0] = "* It's not like this cactus& ?was waiting for you to come& ?back or anything.../%%"
global.typer = 5
global.facechoice = 0
global.faceemotion = 0
mydialoguer = instance_create(0, 0, obj_dialoguer)
這里有非常多信息,我們一點點來看,這個myinteract是限制obj_mainchara所用,等于3時意味著玩家不會移動,也就是對話時讓玩家不動。global.msc是對話索引數(shù). 不同的數(shù)對應(yīng)不同的文本,內(nèi)容定義自gml_Script_SCR_TEXT,可以看出等于0時就是直接按照alarm里寫的對話進行顯示,而不是從SCR_TEXT這個文本中心里讀取對話。
global.typer - 決定角色說話音效。5時為普通對話
global.facechoice - 決定文本框顯示的角色頭像,具體如下
1 - Toriel
2 - Flowey
3 - Sans
4 - Papyrus
5 - Undyne
6 - Alphys
7 - Asgore
8 - Mettaton
9 - Asriel
global.faceemotion - 決定角色是什么表情

其中有這么一行,意思是創(chuàng)建一個obj_dialoguer,并且把它的id賦給mydialoguer這個變量
mydialoguer = instance_create(0, 0, obj_dialoguer)
來看一下obj_dialoguer的draw事件,雖說看起來很復(fù)雜,但摘取其中這段,能看出它是用于繪制對話框的。之所以把它的id賦給mydialoguer,是為了便于把它進行消除,以結(jié)束對話
? ?if instance_exists(obj_face)
? ?{
? ? ? ?if (obj_face.y > (yy + 80))
? ? ? ? ? ?obj_face.y -= 155
? ?}
? ?draw_set_color(c_white)
? ?draw_rectangle((view_xview[view_current] + 16), (view_yview[view_current] + 5), (view_xview[view_current] + 304), (view_yview[view_current] + 80), 0)
? ?draw_set_color(c_black)
? ?draw_rectangle((view_xview[view_current] + 19), (view_yview[view_current] + 8), (view_xview[view_current] + 301), (view_yview[view_current] + 77), 0)
我們注意到它的create,創(chuàng)建了一個OBJ_WRITER,這個obj是用于繪制文本本身的
count = 0
side = 0
global.facechange = 1
xx = view_xview[view_current]
yy = view_yview[view_current]
if instance_exists(obj_mainchara)
{
? ?if (obj_mainchara.y > (yy + 130))
? ?{
? ? ? ?side = 0
? ? ? ?if (global.facechoice != 0)
? ? ? ?{
? ? ? ? ? ?writer = instance_create((xx + 68), (yy - 5), OBJ_WRITER)
? ? ? ? ? ?script_execute(scr_facechoice)
? ? ? ?}
? ? ? ?else
? ? ? ? ? ?writer = instance_create((xx + 10), (yy - 5), OBJ_WRITER)
? ?}
? ?else
? ?{
? ? ? ?side = 1
? ? ? ?if (global.facechoice != 0)
? ? ? ?{
? ? ? ? ? ?writer = instance_create((xx + 68), (yy + 150), OBJ_WRITER)
? ? ? ? ? ?script_execute(scr_facechoice)
? ? ? ?}
? ? ? ?else
? ? ? ? ? ?writer = instance_create((xx + 10), (yy + 150), OBJ_WRITER)
? ?}
}

分析完Alarm,我們再來看Step吧
scr_depth(0, 0, 0, 0, 0)

這是一個讓object能和其他object重疊適當(dāng)?shù)膕cript,就是該誰在前面誰在后面,看著更立體。這里的scr_depth是一個script,script的使用可以大大減少重復(fù)代碼的出現(xiàn),讓代碼更加靈活。一個script可以有輸入值和輸出值,像scr_depth這個其實沒有輸入值也沒有輸出值。
下面是一個二者都有的例子,一個計算絕對值的script,就叫scr_abs吧,代碼內(nèi)容是
if argument0<=0 return -argument0
else return argument0
argument0是指第一個輸入值,例如scr_abs(-1)結(jié)果就是1。return的意思是結(jié)束代碼段,并且返回一個值,這個值也可以是一個字符串。例如在某obj的create里寫上,會彈窗顯示3
var i;
i=scr_abs(-3)
show_message(i)

分析完這個對話object,我們獲得了其大部分信息,但其Parent仍然有值得注意的點,這里一并分析
在gml_Object_obj_readablesolid_Step_0中,我們看到了沒有對話框obj時,玩家又會被恢復(fù)能運動的狀態(tài),并且對話的觸發(fā)機制(使alarm[0] = 1)
if (myinteract == 1)
{
? ?global.interact = 1
? ?alarm[0] = 1
? ?myinteract = 2
}
if (myinteract == 3)
{
? ?if (instance_exists(mydialoguer) == 0)
? ?{
? ? ? ?global.interact = 0
? ? ? ?myinteract = 0
? ?}
}