心靈終結(jié)3.3.6地圖編輯器萌新教程第22篇:全局變量
????前兩篇中我們講了局部變量的原理與應(yīng)用。與“局部變量”相對(duì)應(yīng)的是“全局變量”。我們?cè)趧傞_始介紹局部變量時(shí)就說(shuō)過(guò):“局部”的含義是:只能在一張地圖中使用。在地圖A中建立的局部變量,不能在地圖B中使用。而“全局變量”顧名思義,是可以被所有地圖共同使用的變量。當(dāng)然,它的取值和“局部變量”相同,也是只能取0和1,取0時(shí)稱這個(gè)全局變量處于“被清除”的狀態(tài),取1時(shí)稱這個(gè)全局變量處于“被設(shè)置”的狀態(tài)。
一、如何創(chuàng)建全局變量
????全局變量的創(chuàng)建和局部變量不同。在地編的“編輯”欄中只有“局部變量”沒(méi)有“全局變量”,這其實(shí)也很好理解:既然全局變量是所有地圖都可以共用的,那么它就不可能是在某一張地圖內(nèi)創(chuàng)建的。創(chuàng)建全局變量需要修改根目錄中的rulesmo.ini,在最后可以看到[VariableNames]小節(jié),這就是創(chuàng)建全局變量的地方。官方已經(jīng)使用了0-13這14個(gè)全局變量,我們從“14=xxx”開始創(chuàng)建。比如我在此創(chuàng)建了“14=Guard”和“15=test”這兩個(gè)全局變量。然后保存文件。

????順帶一提,這樣創(chuàng)建出來(lái)的全局變量初始值為0,我們并沒(méi)有辦法像創(chuàng)建局部變量一樣把它的初始值設(shè)置成1。不過(guò)這一點(diǎn)不會(huì)有任何影響。
二、全局變量的基本原理
????首先,全局變量能不能像局部變量那樣,只用在一張地圖中呢?可以,也不建議這樣。能用局部變量解決的問(wèn)題,就不要那么麻煩地使用全局變量了。之后我們舉的也都是在不同地圖中使用全局變量的例子。
????首先我們新建兩張地圖,分別命名為test1.map和test2.map,給兩張地圖都新建關(guān)卡入口,并且把它們連起來(lái),也就是test1這一關(guān)任務(wù)完成后可以直接進(jìn)入test2。如果你不知道怎么新建關(guān)卡入口以及怎么進(jìn)行關(guān)卡之間的連接,可以去看下面這篇專欄:

????然后,我們?cè)趖est1.map中新建兩個(gè)觸發(fā)。觸發(fā)1的條件為“流逝10秒”,結(jié)果選“28:設(shè)置全局變量”。如果你之前已經(jīng)正確地創(chuàng)建了局部變量并保存文件,那么你就可以看到參數(shù)值的選項(xiàng)中有“15-test1”,選擇即可。如果沒(méi)看到,可以把地編關(guān)了再打開。觸發(fā)2條件“流逝20秒”,結(jié)果“勝利者是玩家所屬方”。

????然后,在test2.map中新建一個(gè)觸發(fā):條件1為“27:全局變量被設(shè)置”,參數(shù)值選“15-test”,條件2為“流逝時(shí)間10秒”,結(jié)果為“文本觸發(fā)事件”。
????最后我們進(jìn)入test1游戲中,20秒后任務(wù)完成,通過(guò)評(píng)分屏界面進(jìn)入test2,經(jīng)過(guò)10秒就可以看到觸發(fā)的文本,說(shuō)明test這一全局變量已經(jīng)被成功設(shè)置。
三、全局變量在心靈終結(jié)中存在的問(wèn)題
????以上我們通過(guò)示例說(shuō)明了全局變量的工作原理,其實(shí)和局部變量相同,都是用“設(shè)置/清除全局變量”這兩個(gè)觸發(fā)結(jié)果和“全局變量被設(shè)置/被清除”這兩個(gè)觸發(fā)條件來(lái)對(duì)觸發(fā)事件進(jìn)行控制,只不過(guò)“設(shè)置全局變量”和“全局變量被設(shè)置”這兩個(gè)觸發(fā)不在同一張地圖中。下面我們?cè)龠M(jìn)行一些試驗(yàn):以下試驗(yàn)中,“觸發(fā)文本”說(shuō)明全局變量為1,“不觸發(fā)文本”說(shuō)明全局變量為0.
1、在選關(guān)界面直接進(jìn)入test2,10秒后不觸發(fā)文本。
2、進(jìn)入test1,經(jīng)過(guò)15秒(此時(shí)全局變量已經(jīng)被建立,但是還沒(méi)有任務(wù)完成),退出,從選關(guān)界面進(jìn)入test2,10秒后不觸發(fā)文本。
3、進(jìn)入test1,任務(wù)完成之后通過(guò)評(píng)分屏進(jìn)入test2,5秒后退出,再從選關(guān)界面進(jìn)入test2,10秒后不觸發(fā)文本。
4、進(jìn)入test1,任務(wù)完成后通過(guò)評(píng)分屏進(jìn)入test2,5秒后退出。然后從“載入存檔”進(jìn)入test2(每一關(guān)開始時(shí)都會(huì)有一個(gè)自動(dòng)存檔),10秒后觸發(fā)文本。
5、進(jìn)入test1,任務(wù)完成后通過(guò)評(píng)分屏進(jìn)入test2,5秒后存檔并退出。然后從“載入存檔”進(jìn)入剛才的存檔,則再過(guò)5秒后觸發(fā)文本。
6、進(jìn)入test1,任務(wù)完成后通過(guò)評(píng)分屏進(jìn)入test2,5秒后存檔為A并退出;然后從選關(guān)界面進(jìn)入test2,5秒后存檔為B并退出;然后載入存檔A,5秒后顯示文本;再載入存檔B,5秒后不顯示文本。
????通過(guò)以上的試驗(yàn),我們可以看出來(lái),全局變量在實(shí)際使用過(guò)程中可能會(huì)存在一些問(wèn)題。具體來(lái)說(shuō):比如打完了第1關(guān),通過(guò)評(píng)分屏進(jìn)入第2關(guān)(評(píng)分屏界面沒(méi)有“退出”按鍵,所以即使你不想打了也必須先點(diǎn)“繼續(xù)”進(jìn)入第2關(guān),然后再退出,不考慮任務(wù)管理器結(jié)束進(jìn)程、直接拔電源等情況),然后退出。此時(shí)會(huì)有一個(gè)第2關(guān)開頭的自動(dòng)存檔。第二天你想打第2關(guān)時(shí),有兩種方法:第一種是通過(guò)“載入存檔”讀取第2關(guān)開頭的自動(dòng)存檔,第二種是在選關(guān)界面直接進(jìn)入第2關(guān)。這兩種實(shí)際上是有區(qū)別的,如果和其他眾多可以存檔的游戲進(jìn)行比較的話,第一種就相當(dāng)于是“繼續(xù)之前的游戲”,第二種就相當(dāng)于“開始新游戲并跳過(guò)第1關(guān)”。第一種方法會(huì)保留之前的全局變量信息,第二種方法則會(huì)將所有全局變量設(shè)定為初始值,也就是0。這就是為什么在上面的試驗(yàn)中,“載入存檔”可以顯示文本,而“直接選關(guān)”就不可以。另外,上面的試驗(yàn)6也表明:不同的存檔之間全局變量信息是互不影響的。
????這也解釋了為什么紅警2原版和尤里的復(fù)仇中經(jīng)常使用全局變量而心靈終結(jié)中很少使用。在紅警2原版中比較著名的使用全局變量的例子是:在盟軍第3關(guān)“為長(zhǎng)官歡呼”中,如果你摧毀了一些地標(biāo)建筑,那么在盟軍第6關(guān)這些建筑就不會(huì)再出現(xiàn)(當(dāng)然,前提是第6關(guān)和第3關(guān)是同一個(gè)存檔)。在尤里的復(fù)仇任務(wù)包“林德拉克計(jì)劃”中,作者使用了全局變量來(lái)設(shè)計(jì)支線任務(wù)。這是因?yàn)?strong>原版和尤里的復(fù)仇中沒(méi)有“選關(guān)”界面,而評(píng)分屏點(diǎn)“繼續(xù)”、載入存檔、任務(wù)失敗后“重新開始本關(guān)”都算是“延續(xù)之前的存檔”,所以不會(huì)出現(xiàn)上面說(shuō)的第二種情況。而心靈終結(jié)有選關(guān)界面,所以使用局部變量可能達(dá)不到預(yù)期的目的。
四、全局變量應(yīng)用舉例
????下面我舉一個(gè)我自己制作任務(wù)過(guò)程中使用全局變量的例子。在《守護(hù)》第12關(guān)結(jié)束之后,和官方戰(zhàn)役類似,會(huì)進(jìn)入一個(gè)“結(jié)局”。如果玩家在第12關(guān)第1階段正常摧毀了時(shí)間機(jī)器,那么就會(huì)進(jìn)入“正常結(jié)局”;如果玩家在第12關(guān)占領(lǐng)并保護(hù)了時(shí)間機(jī)器,就會(huì)進(jìn)入“隱藏結(jié)局”。首先要指明的是:“結(jié)局”并沒(méi)有出現(xiàn)在選關(guān)界面,也就是說(shuō)BattleClient.ini中沒(méi)有任何關(guān)于這一張地圖的信息,但是在missionmo.ini和mapselmo.ini中仍然需要像雜談3中提到的那樣寫,這樣做的結(jié)果是:第12關(guān)任務(wù)完成之后可以進(jìn)入結(jié)局,但是不能直接從選關(guān)界面進(jìn)入結(jié)局。這樣就避免了前面說(shuō)的問(wèn)題。這里用到的全局變量就是前面展示的“14=Guard”,在第12關(guān)中將時(shí)間機(jī)器被占領(lǐng)作為條件,設(shè)置這個(gè)全局變量,在結(jié)局的開頭判斷該全局變量是否被設(shè)置,并觸發(fā)相應(yīng)的結(jié)果即可。
