心靈終結(jié)3.3.6萌新教程第20篇:局部變量(一)
一、什么是局部變量
?????? 局部變量在戰(zhàn)役中是一個(gè)重要的控制觸發(fā)條件的手段。所謂“變量”,指的就是一個(gè)可以在游戲過程中變化的數(shù)值,它的取值可以是0或1。所謂“局部”,指的是這個(gè)變量只在這一張地圖當(dāng)中發(fā)揮作用,與它相對(duì)應(yīng)的是“全局變量”。
?????? 在地編中“編輯——局部變量”中,你可以編輯局部變量。剛開始沒有局部變量的時(shí)候只有一條“No Name”,我們只需要在“變量名稱”那里作修改,就相當(dāng)于新建一個(gè)局部變量了,然后它就會(huì)自動(dòng)新增一行“No Name”以供我們新建第二個(gè)局部變量?!熬植孔兞俊苯缑鏇]有“刪除”鍵,把“Name”這一行清空就算刪除了,但地編仍然會(huì)這一個(gè)空行顯示出來,除了不好看之外沒有任何影響(當(dāng)然你也可以不刪除,只要在后面的觸發(fā)中不涉及到這個(gè)局部變量就行了)。局部變量的“預(yù)設(shè)值”就是它一開始是取0還是1,這個(gè)并不重要,只要和之后的觸發(fā)相匹配就可以了。另外,雖然我沒有試過使用中文命名局部變量會(huì)不會(huì)出問題,但還是建議局部變量的名稱中只使用英文字母。


?二、局部變量的基本運(yùn)行原理
?????? 當(dāng)某局部變量的取值為0時(shí),我們稱該局部變量處于“被清除”的狀態(tài),當(dāng)取值為1時(shí),我們稱它處于“被設(shè)置”的狀態(tài)。
?????? 觸發(fā)中分別有兩個(gè)條件和兩個(gè)結(jié)果與局部變量有關(guān)。條件36:局部變量被設(shè)置,指的是相應(yīng)局部變量值為1時(shí)滿足該條件;條件37:局部變量被清除,指的是相應(yīng)局部變量值為0時(shí)滿足該條件;結(jié)果56:設(shè)置局部變量,指的是將相應(yīng)局部變量的值設(shè)為1;結(jié)果57:清除局部變量,指的是將相應(yīng)局部變量的值設(shè)為0。注意“將局部變量的值設(shè)為1”并不一定就是讓這個(gè)局部變量的值“從0變成1”,也有可能在觸發(fā)這個(gè)結(jié)果時(shí)該局部變量的值本來就是1,此時(shí)“設(shè)置局部變量”這個(gè)結(jié)果就相當(dāng)于沒有任何效果。
??? ??? 我們用兩個(gè)簡單的例子來說明和局部變量有關(guān)的觸發(fā)是怎么運(yùn)行的。
??????? 例1:
??????? 首先新建一個(gè)局部變量Test,預(yù)設(shè)值為0.
????????觸發(fā)1:條件:流逝時(shí)間20秒;結(jié)果:設(shè)置局部變量,參數(shù)值選剛才新建的Test.
??????? 觸發(fā)2:條件:局部變量被設(shè)置,參數(shù)選Test;結(jié)果:文本觸發(fā)事件,隨便選一句文本。
????????游戲開始時(shí),局部變量Test的初始值為0;20秒后,觸發(fā)1生效,Test的值變成1,此時(shí)滿足了觸發(fā)2的條件,因此觸發(fā)了文本。
??????? 例2:
????????新建一個(gè)局部變量Test2,預(yù)設(shè)值為1.
????????觸發(fā)1:條件:被任一所屬方摧毀;結(jié)果:清除局部變量Test2。該觸發(fā)的關(guān)聯(lián)對(duì)象為建筑A.
????????觸發(fā)2:條件:局部變量Test2被清除;結(jié)果:變賣關(guān)聯(lián)建筑。該觸發(fā)的關(guān)聯(lián)對(duì)象為建筑B.
????????游戲開始時(shí),Test2的初始值為1;當(dāng)摧毀建筑A時(shí),觸發(fā)1的條件被滿足,Test2的值變?yōu)?,此時(shí)觸發(fā)2的條件被滿足,因此變賣B建筑。
????????要指出的是,在上面兩個(gè)例子中,預(yù)設(shè)值、條件、結(jié)果這三者可以同時(shí)進(jìn)行相應(yīng)變化,對(duì)觸發(fā)效果不會(huì)有任何影響。比如在例1中也可以把預(yù)設(shè)值設(shè)為1,同時(shí)相應(yīng)地把觸發(fā)1的結(jié)果改為“清除局部變量”,把觸發(fā)2的條件改為“局部變量被清除”,效果完全相同。
三、為什么要使用局部變量
????????我們用了兩個(gè)例子來說明局部變量的運(yùn)行原理,不過,顯然可以看出來,如果要實(shí)現(xiàn)這兩個(gè)例子中的效果,根本不需要使用局部變量。例1只要一個(gè)觸發(fā)就能搞定,例2由于涉及到關(guān)聯(lián)對(duì)象的問題,需要將兩個(gè)觸發(fā)分開,但是只需要用“允許觸發(fā)”將兩個(gè)觸發(fā)聯(lián)系起來即可(詳見教程第8篇的例1),也不需要使用局部變量。那么在什么情況下我們才會(huì)用到局部變量呢?
????????我們在教程第3、4篇曾經(jīng)使用過這么兩個(gè)觸發(fā)條件:條件7(或48):關(guān)聯(lián)對(duì)象被摧毀;條件82:所屬方不存在科技類型。對(duì)于“摧毀xxx”這樣的任務(wù)目標(biāo),一般來說需要被摧毀的對(duì)象是不可再造的,使用這兩個(gè)條件作為任務(wù)完成的判定都可以。那么,當(dāng)要被摧毀的目標(biāo)在地圖上唯一存在的時(shí)候,這兩個(gè)條件究竟有沒有區(qū)別呢?請(qǐng)看下面的例子:
????????現(xiàn)在地圖上有且只有一個(gè)蘇軍建造場,所屬方為蘇俄。
????????例3:
????????觸發(fā)1:初始禁止,條件:關(guān)聯(lián)對(duì)象被摧毀;結(jié)果:文本觸發(fā)事件。關(guān)聯(lián)對(duì)象為蘇軍建造場。
????????觸發(fā)2:初始允許,條件:流逝時(shí)間30秒;結(jié)果:允許觸發(fā)1。
????????例4:
????????觸發(fā)1:初始禁止,觸發(fā)所屬方蘇俄,條件:所屬方不存在科技類型,數(shù)值為0,科技類型為蘇軍建造場;結(jié)果:文本觸發(fā)事件。
????????觸發(fā)2:初始允許,條件:流逝時(shí)間30秒;結(jié)果:允許觸發(fā)1。
????????在例3中,如果蘇軍建造場在游戲開始30秒之后被摧毀,那么在摧毀之后立即觸發(fā)文本;但如果在游戲開始30秒內(nèi)被摧毀,那么即使過了30秒,也不會(huì)觸發(fā)文本。
????????而在例4中,如果蘇軍建造場在游戲開始30秒之后被摧毀,與例3一樣,立刻觸發(fā)文本。但如果在游戲開始30秒內(nèi)被摧毀,則會(huì)在游戲開始30秒之后顯示文本。
????????我們分析一下兩者不同的原因:例3中觸發(fā)1的條件“關(guān)聯(lián)對(duì)象被摧毀”,只有當(dāng)蘇軍建造場被摧毀的一瞬間會(huì)被判定為滿足條件。如果我們在30秒內(nèi),比如,第20秒時(shí)摧毀了蘇軍建造場,那么雖然觸發(fā)1的條件滿足,但它此時(shí)仍處于禁止?fàn)顟B(tài),因此不會(huì)觸發(fā)結(jié)果;而到了30秒,觸發(fā)1被允許了,但是“蘇軍建造場被摧毀”的這一瞬間已經(jīng)過了,之后不會(huì)再判定滿足觸發(fā)1的條件,因此也就不會(huì)顯示文本了。而例4中,觸發(fā)1的條件是“蘇俄沒有建造場”,那么從建造場被摧毀的那一刻開始,蘇俄就一直沒有建造場了,也就是說這個(gè)條件一直成立,因此一旦觸發(fā)1被允許,就會(huì)立刻執(zhí)行相應(yīng)結(jié)果。
????????在此,我將“關(guān)聯(lián)對(duì)象被摧毀”這樣,只能在某個(gè)瞬間被滿足的條件稱為“瞬時(shí)型條件”,將“所屬方不存在科技類型”這樣,一旦某個(gè)動(dòng)作發(fā)生,之后就一直滿足,除非之后有另外一個(gè)動(dòng)作(比如蘇俄又造了一個(gè)基地車并打開)使得條件不再滿足,這樣的條件稱為“持續(xù)型條件”。
????????例5:
????????在某個(gè)戰(zhàn)役中,我們想實(shí)現(xiàn)以下的效果:游戲開始30分鐘后,如果玩家進(jìn)入過敵軍的基地,則從地圖外刷出一支敵軍,否則無事發(fā)生。注意,我們并不是說“玩家進(jìn)入敵軍基地之后再經(jīng)過30分鐘刷兵”,我們是想要游戲一開始就計(jì)時(shí),30分鐘后進(jìn)行判定,如果在0到30分鐘這一段時(shí)間內(nèi)玩家“進(jìn)入過”敵方基地就視為滿足條件,即使玩家的部隊(duì)又從敵方基地出來或者被消滅也算。
????????我們打算用“進(jìn)入事件”來作為“玩家進(jìn)入敵軍基地”的判定條件,在敵軍基地周圍圍上一圈單元標(biāo)記。不過,“進(jìn)入事件”是一個(gè)“瞬時(shí)型條件”,它只有在所屬方的單位從外邊“進(jìn)入”單元標(biāo)記所在格的一瞬間會(huì)被判定為“條件滿足”。
??? ????第一種錯(cuò)誤實(shí)現(xiàn)方法:
????????觸發(fā):條件1:流逝時(shí)間30分鐘;條件2:進(jìn)入事件,所屬方為玩家;結(jié)果:援軍。關(guān)聯(lián)對(duì)象為一圈單元標(biāo)記。
????????這樣將兩個(gè)條件寫在一個(gè)觸發(fā)中時(shí),只有當(dāng)兩個(gè)條件同時(shí)滿足才會(huì)實(shí)現(xiàn)觸發(fā)結(jié)果。因此這個(gè)觸發(fā)的效果是:在30分鐘后玩家第一次踩上某個(gè)單元標(biāo)記時(shí)觸發(fā)援軍,不論前30分鐘的情況。例如玩家在第15分鐘、25分鐘、35分鐘、45分鐘四次踩上了單元標(biāo)記,則會(huì)在35分鐘時(shí)刷兵。這與我們想要實(shí)現(xiàn)的效果不符。
????????第二種錯(cuò)誤實(shí)現(xiàn)方法:
????????觸發(fā)1:初始禁止,條件:進(jìn)入事件,所屬方為玩家;結(jié)果:援軍。關(guān)聯(lián)對(duì)象為一圈單元標(biāo)記。
????????觸發(fā)2:條件:流逝時(shí)間30分鐘;結(jié)果:允許觸發(fā)1
????????這種方法的錯(cuò)誤原因和例3相同,因?yàn)椤斑M(jìn)入事件”是一個(gè)瞬時(shí)型條件,當(dāng)觸發(fā)1被允許時(shí),并不會(huì)因?yàn)椤爸斑M(jìn)入過單元標(biāo)記所在單元格”就判定滿足觸發(fā)1的條件。這樣做的效果和第一種錯(cuò)誤實(shí)現(xiàn)方法相同,都是在30分鐘后玩家第一次踩上單元標(biāo)記時(shí)刷兵。
????????有了例3和例4的經(jīng)驗(yàn),我們想到一個(gè)可能的解決辦法,就是修改觸發(fā)1的條件,把“進(jìn)入……”變成“進(jìn)入過……”,改成一個(gè)“持續(xù)型條件”,也就是說玩家第一次踩進(jìn)單元標(biāo)記之后就一直視為“滿足條件”,就像將“關(guān)聯(lián)對(duì)象被摧毀”改成“所屬方不存在科技類型”一樣。但是很可惜,地編中并沒有這樣的表示“進(jìn)入過……”的持續(xù)型條件。
????????解決該問題的關(guān)鍵在于,我們需要將“玩家單位進(jìn)入單元標(biāo)記”這一個(gè)“瞬間型”的信息保存下來,變成一個(gè)“持續(xù)型”的信息,以便我們之后取用。而保存這一信息的最好方式就是局部變量。
????????正確實(shí)現(xiàn)方法:
????????新建局部變量,命名為Enter Enemy's Base,預(yù)設(shè)值為0
????????觸發(fā)1:初始允許,條件:進(jìn)入事件,所屬方為玩家;結(jié)果:設(shè)置局部變量Enter Enemy's Base.
????????觸發(fā)2:初始禁止,條件:局部變量Enter Enemy's Base被設(shè)置;結(jié)果:援軍
????????觸發(fā)3:初始允許,條件:流逝時(shí)間30分鐘;結(jié)果:允許觸發(fā)2
????????此時(shí),我們?nèi)绻?0分鐘內(nèi)進(jìn)入了敵軍基地,此時(shí)局部變量就會(huì)被設(shè)為1,但是由于觸發(fā)2處于禁止?fàn)顟B(tài),所以不會(huì)刷兵;游戲開始30分鐘后,觸發(fā)2被允許,此時(shí)局部變量為1,觸發(fā)2的條件滿足,因此就會(huì)立刻刷兵。注意:“局部變量被設(shè)置”這一條件是一個(gè)持續(xù)型條件,它的意思是“局部變量的值為1”而不是“局部變量的值從0變成1”,“被設(shè)置”這一表述可能有些歧義,會(huì)讓人以為只有“設(shè)置局部變量”這一動(dòng)作完成的瞬間才滿足條件。這一條件更準(zhǔn)確的表述應(yīng)該是“局部變量處于‘被設(shè)置’的狀態(tài)”?!熬植孔兞勘磺宄币差愃?。
????????由此可見,“局部變量”的作用在于:將“瞬間型條件”轉(zhuǎn)化為“持續(xù)型條件”。
????????本篇教程就到這里,后面還會(huì)講更多應(yīng)用局部變量的情形。