心灵终结3.3.6萌新教程第20篇:局部变量(一)
一、什么是局部变量
局部变量在战役中是一个重要的控制触发条件的手段。所谓“变量”,指的就是一个可以在游戏过程中变化的数值,它的取值可以是0或1。所谓“局部”,指的是这个变量只在这一张地图当中发挥作用,与它相对应的是“全局变量”。
在地编中“编辑——局部变量”中,你可以编辑局部变量。刚开始没有局部变量的时候只有一条“No Name”,我们只需要在“变量名称”那里作修改,就相当于新建一个局部变量了,然后它就会自动新增一行“No Name”以供我们新建第二个局部变量。“局部变量”界面没有“删除”键,把“Name”这一行清空就算删除了,但地编仍然会这一个空行显示出来,除了不好看之外没有任何影响(当然你也可以不删除,只要在后面的触发中不涉及到这个局部变量就行了)。局部变量的“预设值”就是它一开始是取0还是1,这个并不重要,只要和之后的触发相匹配就可以了。另外,虽然我没有试过使用中文命名局部变量会不会出问题,但还是建议局部变量的名称中只使用英文字母。


二、局部变量的基本运行原理
当某局部变量的取值为0时,我们称该局部变量处于“被清除”的状态,当取值为1时,我们称它处于“被设置”的状态。
触发中分别有两个条件和两个结果与局部变量有关。条件36:局部变量被设置,指的是相应局部变量值为1时满足该条件;条件37:局部变量被清除,指的是相应局部变量值为0时满足该条件;结果56:设置局部变量,指的是将相应局部变量的值设为1;结果57:清除局部变量,指的是将相应局部变量的值设为0。注意“将局部变量的值设为1”并不一定就是让这个局部变量的值“从0变成1”,也有可能在触发这个结果时该局部变量的值本来就是1,此时“设置局部变量”这个结果就相当于没有任何效果。
我们用两个简单的例子来说明和局部变量有关的触发是怎么运行的。
例1:
首先新建一个局部变量Test,预设值为0.
触发1:条件:流逝时间20秒;结果:设置局部变量,参数值选刚才新建的Test.
触发2:条件:局部变量被设置,参数选Test;结果:文本触发事件,随便选一句文本。
游戏开始时,局部变量Test的初始值为0;20秒后,触发1生效,Test的值变成1,此时满足了触发2的条件,因此触发了文本。
例2:
新建一个局部变量Test2,预设值为1.
触发1:条件:被任一所属方摧毁;结果:清除局部变量Test2。该触发的关联对象为建筑A.
触发2:条件:局部变量Test2被清除;结果:变卖关联建筑。该触发的关联对象为建筑B.
游戏开始时,Test2的初始值为1;当摧毁建筑A时,触发1的条件被满足,Test2的值变为0,此时触发2的条件被满足,因此变卖B建筑。
要指出的是,在上面两个例子中,预设值、条件、结果这三者可以同时进行相应变化,对触发效果不会有任何影响。比如在例1中也可以把预设值设为1,同时相应地把触发1的结果改为“清除局部变量”,把触发2的条件改为“局部变量被清除”,效果完全相同。
三、为什么要使用局部变量
我们用了两个例子来说明局部变量的运行原理,不过,显然可以看出来,如果要实现这两个例子中的效果,根本不需要使用局部变量。例1只要一个触发就能搞定,例2由于涉及到关联对象的问题,需要将两个触发分开,但是只需要用“允许触发”将两个触发联系起来即可(详见教程第8篇的例1),也不需要使用局部变量。那么在什么情况下我们才会用到局部变量呢?
我们在教程第3、4篇曾经使用过这么两个触发条件:条件7(或48):关联对象被摧毁;条件82:所属方不存在科技类型。对于“摧毁xxx”这样的任务目标,一般来说需要被摧毁的对象是不可再造的,使用这两个条件作为任务完成的判定都可以。那么,当要被摧毁的目标在地图上唯一存在的时候,这两个条件究竟有没有区别呢?请看下面的例子:
现在地图上有且只有一个苏军建造场,所属方为苏俄。
例3:
触发1:初始禁止,条件:关联对象被摧毁;结果:文本触发事件。关联对象为苏军建造场。
触发2:初始允许,条件:流逝时间30秒;结果:允许触发1。
例4:
触发1:初始禁止,触发所属方苏俄,条件:所属方不存在科技类型,数值为0,科技类型为苏军建造场;结果:文本触发事件。
触发2:初始允许,条件:流逝时间30秒;结果:允许触发1。
在例3中,如果苏军建造场在游戏开始30秒之后被摧毁,那么在摧毁之后立即触发文本;但如果在游戏开始30秒内被摧毁,那么即使过了30秒,也不会触发文本。
而在例4中,如果苏军建造场在游戏开始30秒之后被摧毁,与例3一样,立刻触发文本。但如果在游戏开始30秒内被摧毁,则会在游戏开始30秒之后显示文本。
我们分析一下两者不同的原因:例3中触发1的条件“关联对象被摧毁”,只有当苏军建造场被摧毁的一瞬间会被判定为满足条件。如果我们在30秒内,比如,第20秒时摧毁了苏军建造场,那么虽然触发1的条件满足,但它此时仍处于禁止状态,因此不会触发结果;而到了30秒,触发1被允许了,但是“苏军建造场被摧毁”的这一瞬间已经过了,之后不会再判定满足触发1的条件,因此也就不会显示文本了。而例4中,触发1的条件是“苏俄没有建造场”,那么从建造场被摧毁的那一刻开始,苏俄就一直没有建造场了,也就是说这个条件一直成立,因此一旦触发1被允许,就会立刻执行相应结果。
在此,我将“关联对象被摧毁”这样,只能在某个瞬间被满足的条件称为“瞬时型条件”,将“所属方不存在科技类型”这样,一旦某个动作发生,之后就一直满足,除非之后有另外一个动作(比如苏俄又造了一个基地车并打开)使得条件不再满足,这样的条件称为“持续型条件”。
例5:
在某个战役中,我们想实现以下的效果:游戏开始30分钟后,如果玩家进入过敌军的基地,则从地图外刷出一支敌军,否则无事发生。注意,我们并不是说“玩家进入敌军基地之后再经过30分钟刷兵”,我们是想要游戏一开始就计时,30分钟后进行判定,如果在0到30分钟这一段时间内玩家“进入过”敌方基地就视为满足条件,即使玩家的部队又从敌方基地出来或者被消灭也算。
我们打算用“进入事件”来作为“玩家进入敌军基地”的判定条件,在敌军基地周围围上一圈单元标记。不过,“进入事件”是一个“瞬时型条件”,它只有在所属方的单位从外边“进入”单元标记所在格的一瞬间会被判定为“条件满足”。
第一种错误实现方法:
触发:条件1:流逝时间30分钟;条件2:进入事件,所属方为玩家;结果:援军。关联对象为一圈单元标记。
这样将两个条件写在一个触发中时,只有当两个条件同时满足才会实现触发结果。因此这个触发的效果是:在30分钟后玩家第一次踩上某个单元标记时触发援军,不论前30分钟的情况。例如玩家在第15分钟、25分钟、35分钟、45分钟四次踩上了单元标记,则会在35分钟时刷兵。这与我们想要实现的效果不符。
第二种错误实现方法:
触发1:初始禁止,条件:进入事件,所属方为玩家;结果:援军。关联对象为一圈单元标记。
触发2:条件:流逝时间30分钟;结果:允许触发1
这种方法的错误原因和例3相同,因为“进入事件”是一个瞬时型条件,当触发1被允许时,并不会因为“之前进入过单元标记所在单元格”就判定满足触发1的条件。这样做的效果和第一种错误实现方法相同,都是在30分钟后玩家第一次踩上单元标记时刷兵。
有了例3和例4的经验,我们想到一个可能的解决办法,就是修改触发1的条件,把“进入……”变成“进入过……”,改成一个“持续型条件”,也就是说玩家第一次踩进单元标记之后就一直视为“满足条件”,就像将“关联对象被摧毁”改成“所属方不存在科技类型”一样。但是很可惜,地编中并没有这样的表示“进入过……”的持续型条件。
解决该问题的关键在于,我们需要将“玩家单位进入单元标记”这一个“瞬间型”的信息保存下来,变成一个“持续型”的信息,以便我们之后取用。而保存这一信息的最好方式就是局部变量。
正确实现方法:
新建局部变量,命名为Enter Enemy's Base,预设值为0
触发1:初始允许,条件:进入事件,所属方为玩家;结果:设置局部变量Enter Enemy's Base.
触发2:初始禁止,条件:局部变量Enter Enemy's Base被设置;结果:援军
触发3:初始允许,条件:流逝时间30分钟;结果:允许触发2
此时,我们如果在30分钟内进入了敌军基地,此时局部变量就会被设为1,但是由于触发2处于禁止状态,所以不会刷兵;游戏开始30分钟后,触发2被允许,此时局部变量为1,触发2的条件满足,因此就会立刻刷兵。注意:“局部变量被设置”这一条件是一个持续型条件,它的意思是“局部变量的值为1”而不是“局部变量的值从0变成1”,“被设置”这一表述可能有些歧义,会让人以为只有“设置局部变量”这一动作完成的瞬间才满足条件。这一条件更准确的表述应该是“局部变量处于‘被设置’的状态”。“局部变量被清除”也类似。
由此可见,“局部变量”的作用在于:将“瞬间型条件”转化为“持续型条件”。
本篇教程就到这里,后面还会讲更多应用局部变量的情形。