本章内容摘要

*         计时器的用法

*         计数器的用法

*         STR/CSF编辑

*         胜败判定

*         地图初始化设置及综合实验


计时器的用法

计时器通常用于制造延迟效果,其作用类似于倒计时闹钟。例如我们希望某个动作在30秒之后再发生,而不是立即发生,我们就要创建一个计时器,给它设置一个30秒的闹钟时长,等到30秒到达之后,闹钟会响,于是我们就把“闹钟响了”这个事件作为触发条件来触发我们想要延迟的那个动作。

举个简单例子,还记得序章里我们做的那条HelloWorld触发吗?我们在游戏里去运行实验成果时,得到的效果是,一开局就立马打出一句话“Text_True”。如果我们希望开局30秒后再打出另一句话”Text_ClockAlarm”,我们该怎么做呢?

 

打开HelloWorld地图,我们首先需要创建一个计时器。需要注意的是,计时器只能通过触发结果来创建,没有别的途径,因此我们有两种手段可以创建出计时器。

方法一,新建触发,利用新触发的结果来创建计时器:

我们希望这个计时器无论如何都要成功创建,因此触发条件应该设置为IF True,然后在正结果里去创建计时器,并将反结果删空:

注:或许有的观众已经开始举一反三了,这里也可以将条件设置为IF False,然后在反结果里去创建计时器,并将正结果删空,效果是一样的,具体操作就不详细讲解了,观众可以自行尝试。

方法二,利用现有合适的触发,新增结果来添加计时器。在这里我们可以利用已有的“触发预览”这条触发,在其已有结果中创建计时器,因此我们需要新建一条结果(以正结果为例):

 

创建计时器是这样操作的,可以看到游戏内核提供了很多种计时器类型,有秒型和帧型、固定定值与随机值之分,这里我们以最常用的固定秒型计时器为例,其他类型,观众可以自行尝试:

这条结果需要两个参数,第一个是计时器名称,支持中文,可随意命名,但注意尽量言简意赅。第二个参数是闹钟时间,我们把它设置成希望的30秒。

 

接下来我们该实现延迟打出”Text_ClockAlarm”这句话的触发了。新建一条触发,命名为“延迟文本”:

注意检测重复性的取值!如果使用默认的每帧,则游戏内核总共会检测闹钟状态1001次(30 / 0.03 = 1000,再加上触发启动时的那1次),由于闹钟一定要等到30秒到达了才会响,所以前1000次注定都是白费功夫。为了降低CPU消耗,此这里我们可以将检测重复性设大一些,例如10秒,也就是说,在闹钟响之前,游戏内核总共只会检测4次(30 / 10 = 3,再加上触发启动时的那1次),前3次白费,最后一次检测到闹钟响了。如果你胆子再大些,直接设置成30秒也没事,那么总共就只检测2次了。

然后设置触发条件为“计时器溢出”,溢出这个术语有点专业,我们就把它理解为“闹钟响了”吧

注意参数!一定要设置为之前我们创建的那个计时器的名称

结果就不用多说了吧,我们在序章里已经学会怎么打出文本了

 

现在这张地图上总共已经有了3条触发(下图以创建计时器的方法一为例):

保存地图,到游戏里去看看效果吧。

 


计数器的用法

计数器通常用于存储变量值,比如记录我们总共击毁了多少个目标、完成了多少个任务点等等。一些重要的计数器需要将其数值显示到游戏屏幕的右下角,方便给玩家提供相关信息。玩过FK3D的人应该都知道遭遇战和对战有个全局计数器叫“挑战时间”,它就是用计数器来制作的,这里我们就来揭晓一下,如果制作一个“挑战时间”计数器。

还是打开HelloWorld地图,继续添加内容。需要注意的是,计数器和计时器一样,也只能通过触发来创建,别无他法,因此也可以新建触发来实现,或者利用现有触发来新建结果实现。这里我们利用已有的触发“创建计时器”来搞定:

创建计数器是这样操作的:

同样还是有两个参数,第一个是计数器名称,支持中文。第二个是计数器的初值,由于我们要做的是挑战时间计数器,因此需要从0开始向上增长,于是初值设置为0

我们希望在游戏右下角将计数器的值打出来,还需要再添加一条结果来显示其文字内容,不过我们需要先保存一下当前修改使其生效,否则我们在当前的触发编辑窗口中是找不到我们创建的计数器的于是我们点击确定执行修改,退回到触发编辑主窗口上,此时已有的触发是这样的:

再重新编辑这条触发,在正结果里添加第三条结果:

显示计数器文字内容是这样操作的:

这里也有两个参数,第一个是计数器名称,可从下拉框里找到我们之前创建的那个计数器,也可以直接手工输入进去。第二个参数是计数器在屏幕上显示的文字。特别注意,计数器文字最好通过下拉框选择,不推荐手工输入,因为如果输入了下拉框里没提供的文字,编辑器会自动判为无效,到了游戏里就看不到文字了!至于下拉框里提供的文字是从哪儿来的,我们留到后面再讲,先用现成的SCRIPT:ChallengeTimer来说明问题。

现在可以保存所有修改,进游戏去看看效果,我们发现开局时,屏幕右下角已经显示出了“挑战时间:0”的字样:

不过现在这个计数器还是死值,永远为0不会变。如果想让它发生点变化,我们还得继续追加更多的触发。

 

假设我们希望让计数器的值每隔1秒自加1,从0一直加到60,要实现这个效果,就需要做一个重复性触发,这跟过去我们做过的那些只被执行一次的触发稍微有点不同:

我们去掉了“执行后自动失效”的勾勾,目的是让它即使执行了结果也不会自动失效,于是这条触发就可以反复被游戏内核多次检测,每检测一次都会执行一次结果。而这条触发被执行多少次,就由其条件来决定,于是我们将其条件设置为“计数器与基准值作比较”

具体操作方法如下:

   

这个条件有三个参数,第一个是计数器名称,从下拉框里选择我们之间创建的“挑战时间”。第二个参数是比较方式,总共有6种可选,分别是LT(小于)、LE(小于等于)、EQ(等于)、GE(大于等于)、GT(大于)、NE(不等于),根据题意,我们应该选LE(小于等于)。第三个参数是基准值,我们将其设置为59。那么这个条件的含义就是,当计数器的值小于等于59时,条件成立,正结果将被执行。

将正结果设置为使计数器增加制定值:

具体操作方法如下:

 

   

这个结果有两个参数,第一个是增加多少,我们将其填为1,表示使计数器的值+1。第二个参数是计数器名称,从下拉框里选择即可。

由于我们只要求计数器在值小于等于59时向上累加,没有别的要求,因此用不到反结果,将其置空即可

现在这张地图上总共有了4条触发:

保存本次的修改,到游戏里去体验一下效果吧:

可以看到条件时间后面的数字在不断地增长,从0一直往上加,加到了60为止。

这里留个思考题给大家,为什么计数器到了60就不动了呢?原因就在前面我们设置的条件里,自己回头去反思吧,想通了这个原因,你就算掌握了动态逻辑思维的奥秘,相信对于那些在大学里学过逻辑电路触发器,以及编程语言的同学来说,这都不是事!

为了让各位好好见识一下动态逻辑思维的乐趣,我们再来发挥一把。假设我们希望计数器加到60之后,再跳回0,然后再向上累加到60……如此无限循环,又该怎么做呢?答案就是——用上反结果:

或许你还记得,我们前面在创建计数器时,曾经用到过这样的结果,为计数器设初值,而这次我们还要再用它一次,来将计数器的值重置为0

 

现在来好好品味一下这样一条触发,到底是个什么样的动态逻辑关系。只看语句,硬翻译过来是:

如果计数器的值小于等于59将计数器+1否则设置为0

结合场景意译,可以这样推算整个动态过程:

当计数器的值等于0时,0小于等于59,条件成立,执行正结果,计数器+1,从0变成1

当计数器的值等于1时,1小于等于59,条件成立,执行正结果,计数器+1,从1变成2

当计数器的值等于2时,2小于等于59,条件成立,执行正结果,计数器+1,从2变成3

…………………………

当计数器的值等于57时,57小于等于59,条件成立,执行正结果,计数器+1,从57变成58

当计数器的值等于58时,58小于等于59,条件成立,执行正结果,计数器+1,从58变成59

当计数器的值等于59时,59小于等于59,条件成立,执行正结果,计数器+1,从59变成60

当计数器的值等于60时,60大于59,条件不成立,执行反结果,计数器被设置为0

当计数器的值等于0时,0小于等于59,条件成立,执行正结果,计数器+1,从0变成1

当计数器的值等于1时,1小于等于59,条件成立,执行正结果,计数器+1,从1变成2

当计数器的值等于2时,2小于等于59,条件成立,执行正结果,计数器+1,从2变成3

…………………………再次循环……………………

这个推算到底对不对?可以到游戏里去证实!

 


STR/CSF编辑

之前我们通过触发打出来的文本都是英文,如何才能打出中文?我当时留了一个玄机,现在终于可以揭晓答案了。答案就是CSF翻译条。做过红警MOD或者任务地图的观众一定知道“红警2语言编辑器”这么一个工具,没错,就是下面个东东:

请自行从盗版之家主站下载本工具,地址:http://www.uc129.com/bd/ra2gj/7145.html

绝命时刻的CSF文件通常在Data\Chinese文件夹中,FK3D也遵循了这个文件树规则:

注:1.78G完整版、黄金版等官方原始版本并没有将其裸放在文件夹内,而是包在了ChineseZH.big里,需要观众使用XccMixerFinalBig之类的解包工具自行提取出来,放到Data\Chinese中。这里我们以提取好之后的情况为例来讲解如何编辑CSF翻译条。

首先讲解一下CSF翻译条的原理,看看它是怎么实现文本转换的。用红警2语言编辑器打开generals.csf,可以看到这样的界面:

除了菜单栏和工具按钮外,整个窗口分为三个部分,左上侧为类型列表,右上侧为项目内容列表,底部为内容详情预览窗口。

注意看类型和项目的关系,以当前选中的ACADEMY为例,你会发现项目里每一行都是一个固定格式,即ACADEMY开头(不区分大小写),然后是一个冒号,后面再跟一串英文。内容里面则是对应的中文。例如ACADEMY:BuildAHero,对应着中文“每个阵营至少有一名英雄……”,它就表示游戏会将把“ACADEMY:BuildAHero”视作一个代号,凡是遇到这个代号都会替换成“每个阵营至少有一名英雄……”这段文字。反之,如果我们希望游戏显示出“每个阵营至少有一名英雄……”这句话,我们就在触发结果里填上“ACADEMY:BuildAHero”这个代号。

根据这个规律,要想让游戏将我们之前做的“Text_True”显示成“中文文本_正结果”,我们只需要在CSF里添加一个新的项目,填上中文,再修改触发结果去调用这个翻译条即可。

通常我们可以在已有的类型里选一个合适的,例如SCRIPT,然后添加我们的翻译条项目:

在弹出框里输入两个关键信息,大框里填我们希望翻译成的内容“中文文本_正结果”。项目名称里填我们将在触发结果里调用的代号名Text_True。需要注意的是,项目名称只能填英文字母、数字和下划线、中杠之类的英文符号,切记不能出现空格、中文字和标点符号,字数控制在30字以内,不能太长,否则有可能出现错乱!

点击确定执行修改之后,项目内容列表将出现我们刚才新增的这个翻译条项目:

于是,我们就得到了这样一个翻译条,其代号为“SCRIPT:Text_Ture”。

接下来编辑我们做过的触发结果。将原有的参数修改为翻译条代号“SCRIPT:Text_Ture”。

同理,我们继续添加翻译条“SCRIPT:Text_False”、翻译成“中文文本_反结果”。“SCRIPT:Text_ClockAlarm,翻译成“闹钟响了”:

然后修改触发结果,将其全部替换成翻译条代号,最终的触发是这个样子:

运行游戏看下效果吧:

这次游戏显示的就是中文了!

 

接下来我们还要讲另一种翻译条,叫STR,与CSF有异曲同工之妙,但缺陷是翻译内容只能写英文,不能写中文。或许有些观众见过一些国外MOD(例如火风暴),就在Data文件夹里放了个generals.str文件,但整个MOD中却找不到任何csf文件,那么此时游戏内核就会缺省调用generals.str来显示翻译内容。但我们这里要讲的并不是教大家如何编辑generals.str,而是解决之前我们曾经留的一个问题——计数器文字如何打出我们想要的中文,而不仅仅限制于只能在下拉框里选择现有的。

在此我特意告诉大家,关于SAGE地图的一些内幕。在画质管理器上点击“我的资料”——“第三方地图”,进入“文档\[FK3D]UserProfile\Maps”文件夹

这里存放着我们保存的HelloWorld地图。看到这里你可别感到惊讶,SAGE的地图确实不只是一个单文件,而是一个文件夹,因为SAGE将地图分为了几个分离的文件,共同存放在一个文件夹里,而不像红警2那样把所有资源都揉杂在同一个文件中,这是SAGE与红警2最大的区别。

进入HelloWorld文件夹,我们可以看到里头有两个文件:

HelloWorld.map:地图主文件,里面存放着地形环境、地表贴图、触发等各种基本数据。

HelloWorld.tga:预览图文件,用于在游戏中显示的预览图,由地图编辑器自动生成,但也可以用PS做二次修改。

上述这两个文件的前缀名都和地图文件夹同名,这是固定规则,切不可随便乱改名!

那是不是就只能有这两个文件呢?当然不是!要是是了,我还用得着费口舌来揭秘么?为了说明问题,我们试着用XccMixerFinalBig工具把FK3D的正传5关提取出来看个究竟:

看到了吧,除了HeroLegend05.mapHeroLegend05.tga,这关还多了两个文件:

map.ini:本地图专用的INI规则重定义,可以在地图里对部分单位的INI代码进行重定义修改,使之与遭遇战中的属性有所不同,具体如何重定义,我们留到后面再将,感兴趣的观众可以自行预习FK3D的地图案例

map.str:本地图专用的STR翻译条,凡是在这个文件里定义过的翻译条代号,都可以被地图编辑器加载到计数器文字的下拉框里去。

用记事本打开map.str,可以看到这样一些定义段:

是不是长得很像CSF翻译条?其格式是固定的3行一组:

首行是类型名、冒号、项目名。这三者组合到一起就是一个完整的翻译条代号。

末行是结束符END

中间行是用双引号包含起来的一段英文文字,表示这个翻译条代号将被翻译成什么内容,只支持英文。

如果我们在map.str中定义了一个翻译条,然后又到generals.csf里添加同样的一个翻译条,会怎么样呢?结果就是,游戏会优先调用generals.csf里的,而无视map.str里的。因此,中间行双引号里的内容可以随意乱写,反正游戏也不会调用它,其唯一的作用仅仅是让地图编辑器能够将这个翻译条加载进去,供我们制作触发时可选。

 

现在回到我们的HelloWorld地图文件夹中,我们就来创建一个新的翻译条来作为计数器的显示文字。

新建一个map.str文件,我们可以先新建一个文本文件,再来手工修改其文件名:

注意更改文件名时要确保后缀名一定是*.str,因此我建议先在操作系统的“文件夹选项”——“查看”选项卡里去掉“隐藏已知文件类型的扩展名”前的钩钩:

用记事本打开map.str,在里面添加一个翻译条定义:

注意翻译条定义好之后,地图编辑器还不会自动将它加载进去,我们需要让地图编辑器重新打开这张地图,才能完成对翻译条的加载,最快的办法是点击“文件”——“新建”:

使用随意参数新建一张空白地图,点击确定执行新建操作:

然后再点击“文件”——“打开”:

再次打开HelloWorld地图,即完成了重新加载:

现在到触发编辑里去看看,下拉框中就出现了我们刚刚在map.str中添加的翻译条SCRIPT:HelloWorldCounter

修改之后,这条触发是这个样子:

如果不在generals.csf中添加SCRIPT:HelloWorldCounter翻译条就直接启动游戏,我们会看到计数器的名字是我们在map.str中间行里写的那串英文“My New Counter:

要想把它显示成中文,我们还得去generals.csf里再添加一次SCRIPT:HelloWorldCounter翻译条,给它做个中文翻译:

保存generals.csf之后,再次重开游戏,计数器的显示文字就变成了中文


胜败判定

接下来我们可以开始去感受一些在真实的任务关制作中比较常用的套路了。既然是任务关,那就肯定有“过关”和“战败重来”的概念,那么首当其冲的就是胜败判定。不过以我们目前所具备的知识,还不足以做出一场真正的任务关,但要实现“过关”和“战败重来”的效果已经绰绰有余了。接下来我们就以一个最简单的任务关——“自动过关器”为例来说明如何制作胜败判定,其思路为,开局后设置一个5秒的计时器,5秒一到就立即判任务完成并过关。

 

在画质管理器上右键点击“运行游戏”,在弹出菜单中选择“游戏安装目录”——“根目录”,进入游戏安装路径:

手动新建一个文件夹,改名为Maps

 

回到地图编辑器中,新建一个空白地图,保存到“系统地图”,命名为“HeroLegend01”:

      

    为什么要取这个名字?是因为这是FK3D正传任务关的第一关,我们需要让这张地图替代原有的第一关来实现我们期望的“自动过关”效果。

 

创建一条新触发,取名为“设置计时器”:

条件:恒真

结果:设置秒计时器“自动过关延迟”的溢出上限为5

 

再创建第二条新触发,取名为“自动过关”:

条件:计时器“自动过关延迟”溢出

结果:对战——宣告胜利(即过关),具体设置方法如下:

      

 

       保存触发及地图,到游戏里去试一下效果吧,进单人游戏:

      

       选择英雄传奇(即正传篇章):

      

       随意选个难度,进入游戏,将看到原本的关卡变成了我们刚才制作的空白地图。静候5秒之后会显示“游戏结束”的对话框,表示任务完成并过关

      

       在积分榜上点击“储存并继续”,会有奇迹发生:

      

       奇迹就是——我们并没有按正常顺序去打第1关,就直接跳进了第2关:

2关的内容还是原本的正常关卡,没有发生任何变化:

如此说明,自动过关器已经制作成功!

 

如果我们把第二条触发的结果改一下,由“宣告胜利”改为“宣告战败”会怎么样呢?

       重新进入英雄传奇的第1关,静候5秒之后依然会显示“游戏结束”的对话框,虽然看起来似乎没区别,但这次是表示任务失败,不能过关,只能重打一次:

      

       因为没有过关,所以积分榜提示的就是“再玩一次”了:


地图初始化设置及综合实验

前面我们已经制作了一张能过关、能战败重来的地图,虽然没有实际的内容,不具备可玩性,但已经具备了任务关最基本的框架要素,要做出真正可玩的任务关地图,不外乎就是在这个框架里去填充内容了,为此,我特意找了一个相对简单的案例来讲解可玩的任务关到底应该怎么做。

俗话说,开发未动,剧本先行。剧本才是任务关地图的核心价值所在,它决定了玩家在这张地图上到底能获得什么样的游戏过程和体验,因此,我随便写了一段小故事来作为案例的剧本:

 

       天朝军方想看看共辉坦克军团配备的夭启坦克到底有多强的战斗力,特意安排了一场演习:

       在演习场上安放5个假想敌的碉堡,要求玩家使用一辆夭启坦克在60秒内任意摧毁其中3个来完成任务。

       如果60秒内的摧毁数未达到3个,或夭启阵亡,则判任务失败。

 

通过对上述剧本的简单分析,不难得出这样一些开发需求点:

1、需要两个参战方:一个是由玩家控制的坦克军团,另一个是由AI控制的假想敌,彼此互为敌对关系

2、需要设定一个计时器,用来计算玩家消耗的时间

3、需要设置一个计数器,用来计算玩家摧毁的碉堡数量

4、胜利条件:玩家摧毁的碉堡数达到3时,消耗的时间小于60

5、战败条件160秒耗尽时,玩家摧毁的碉堡数小于3

6、战败条件2:夭启阵亡

有了这些需求点,我们就可以开始开发制作了。依然还是创建一张空白地图,尺寸不必太大,100x100就好,边界40,初始高度16

保存到用户地图,命名为Class1点击这里可以下载我事先制作好了的样板地图。

 

地图尺寸小贴士

*         边长和边界的数字单位是“网格”,在SAGE引擎里一个网格等于10像素。因此尺寸100网格x100网格,边界40网格,实际上等于尺寸1000像素 x 1000像素,边界400像素。

*         高度的数字单位是“英尺”,在SAGE引擎里一英尺等于1.6像素。因此尺寸16英尺,实际上等于10像素

*         如果读者想要用SAGE引擎重制红警2的官方战役,请注意换算红警2的尺寸,其换算关系为:

红警2的单位模型,一个单元格的面积等于SAGE25像素 x 25像素

FinalAlert2地图编辑器制作的红警2地图,一个单元地块的尺寸等于SAGE36像素 x 36像素

 

首先添加参战方,在菜单栏上点击“编辑”——“参战方编辑”

弹出的参战方编辑窗口为这个样子

顶部的列表框将成列出这张地图上所有的参战方,当我们添加好新的参战方时,它将出现在列表中。

还记得我们在序章里提到的neutral吗?它也出现在了这个列表中,说明这是系统默认自动生成的参战方。需要注意的是,除neutral外,列表中第一个参战方为人类玩家所有,因此我们必须先添加人类玩家对应的参战方,再添加AI对应的参战方,这个顺序原则上不能颠倒!(当然仅仅是原则上,因为有一条触发结果可以调整参战方的玩家控制权,这个今后再讲)

 

点击左下角的按钮,为玩家的坦克军团添加一个参战方

下拉框会列举出整个游戏中所有的阵营蓝本供我们选择。所谓阵营蓝本即PlayerTemplate.ini里定义的那些Faction,它将决定在这场任务中,玩家会使用什么样的操作栏、获得什么样的初始证书,由于对任务本身没有什么影响,因此可以随意选择。不过由于这个案例剧本以共辉为主视角,因此我们选择FactionChinaTankGeneral(共辉阵营)作为蓝本,这样的话,在游戏中,玩家看到的操作栏就是共辉阵营的操作栏

 

添加好的参战方,默认名称叫palyer+4为数字,不由AI控制,标识色为FactionChinaTankGeneral阵营蓝本的原生阵营色——黄色

如果你觉得player+4位数字这个格式的命名看起来太抽象,还可以手工将其修改为我们看得懂的名称,但是很遗憾的是,这里不能使用中文命名!所以只能这样了——

先在显示名称里输入GloryTankLegion(共辉坦克军团),再将输入好的GloryTankLegion文字复制粘贴到参战方名称里去,最后点击“设置”按钮使设置生效,上面的列表就会发生变化。

事实上真正起到触发关联作用的是参战方名称,而显示名称貌似没什么实质性的作用,不过为了稳妥,两个名称最好还是保持一致

 

接下来再为假想敌添加参战方

这次选FactionChina作为阵营蓝本,将其名称设置成FakeEnemy,勾选“由AI控制”,标识色为FactionChina阵营蓝本的原生阵营色——绿色

这个时候,下面的敌友关系框里出现了之前我们添加的第一个阵营GloryTankLengion,我们可以在“与谁为敌”框里点中它,这样就表示FakeEnemyGloryTankLengion视为敌人,即FakeEnemy可以向GloryTankLengion开火攻击(同理,如果你在“与谁同盟”框里点中了GloryTankLengion,就表示FakeEnemyGloryTankLengion视为盟友,即FakeEnemy不能向GloryTankLengion开火攻击)

需要注意的是,FakeEnemyGloryTankLengion视为敌人,并不代表GloryTankLengion会自动将FakeEnemy视为敌人,这就是所谓的“单方面条约”。要想让二者互为敌人,必须再设置GloryTankLengion的敌友关系,使之将FakeEnemy也视为敌人。于是我们还要在参战方列表里选中GloryTankLegion,在它的“与谁为敌”框里点中FakeEnemy,如下图所示:

现在,两个阵营就算是完整地互为敌对关系了,点击右下角的“确定”按钮完成本次编辑。

 

接下来我们要使用触发来设置一些初始化的信息

首先是镜头初始位置,它其实是个路径点,决定了开局后镜头位于哪个地方,

根据规定,镜头初始位置的路径点,其名称必须为InitialCameraPosition,我们将它摆放在地图中合适的位置.

 

接下来,我们需要在战场上摆放剧情所需的单位,按照开发需求,我们要给玩家摆放一辆夭启坦克:

毋庸置疑,摆放单位应该使用对象列表,在Glory——Vehicle列表中找到GHAPOC(夭启坦克),将其默认所属方选成teamGloryTankLegion,表示夭启坦克属于坦克军团这个参战方

将其摆放到地图合适位置。为了保证玩家一开局就能在画面上看到这个坦克,我们特意将它摆放到了初始路径点边上

 

同理,我们再给假想敌摆放5个碉堡,还是对象列表,在Glory——STRUCTURE列表中找到GHPILL(火焰碉堡)

将其默认所属方选为teamFakeEnemy,表示这个碉堡属于假想敌这个参战方

在地图上5个不同的位置连续点5次,即可连续摆放出5个碉堡,并且5个碉堡都具有相同的属性。

 

为了在触发中调用这些摆放好的单位来做作为触发条件与结果的参数,我们需要为它们命名,先选中地图中摆放好的夭启坦克,在对象属性框中为它输入名称——“夭启”:

再依次选中地图中摆放好的每个火焰碉堡,分别在对象属性框中为它们各自输入名称——“碉堡1~“碉堡5”:

注意单位的命名规范,名称随便你怎么取都行,支持中文,但建议尽可能简短,且确保唯一性,切记不要让两个或多个单位重名,否则在触发中调用这个名称时,系统就傻了——有同名单位,到底该调用哪个呢?

 

接下来就是编写触发了。我们需要通过触发来设置一些运行时的源数据,通常将这条触发称为“初始化设置”

neutral文件夹中添加一条新触发,命名为初始化,重复性设置为每1秒,其他选项不动

 

由于我们希望这条触发在开局时立即被执行,并且必须被执行,因此我们将条件设置为IF True

 

这条触发默认的正结果为“Null Operation”,翻译过来就叫“什么都不做”,相当于一条空结果,我们将它删掉再重新添加我们想要的结果

点击右侧的“新建”按钮,添加一条新结果,我们在“参战方“——“设置”里找到“强制设置特定参战方的当前资金量”,将GloryTankLegion的 资金设置成1000(如果不设置的话,默认为10000

注:这条结果在本例里面是多余的,因为我们用不上它,因此数字就随意设置了。但考虑到初始资金是今后我们制作的99%的任务地图都会用到的初始化设置,因此我也将它放在这里进行讲解

同理,我们再给FakeEnemy也设置一个开局资金,我们可以使用界面右侧的“复制”按钮来简化操作,而不必再重新新建一条结果:

复制之后,两条结果长得完全相同,我们只需要双击第二条结果,对它进行编辑,将第一个参数改为FakeEnemy,第二个参数改为2000

再添加第三条结果,设置玩家的初始视野。为了方便讲解,我们直接给玩家设置一个开局全亮。在“地图”——“遮盖或显露”中找到“使整个地图对特定参战方永久全亮,灰雾不会回缩”,参数设置成GloryTankLegion

如果观众有兴趣的话,还可以自行尝试一下使用其他几项条件来设置开局视野,看看产生的效果都有什么差别

最终我们需要的初始化结果就这3条足矣!

由于本触发的条件被我们设置成了IF True,根据我们在序章里学习掌握的知识,不难得知,正结果一定会被执行,反结果将永远不会被执行,因此我们不需要再去设置反结果,让它保持默认的全空即可:

 

点击确定按钮确认编辑内容,这条触发就是这样:

 

继续制作触发,我们要衡量玩家完成攻击任务所消耗的时间,就需要设置一个计时器,我们可以直接在初始化触发里添加一条新结果来实现:

将计时器命名为“任务时限”,根据开发需求,闹钟值应该设置为60秒。

 

继续制作触发,我们要统计玩家击毁的碉堡数,就需要设置一个计数器,同样可以在初始化触发里添加新结果来实现:

将计数器命名为“碉堡击毁数”,由于刚开场时还没有击毁任何碉堡,因此计数值设置为0

 

为了让玩家知道击毁了多少个碉堡,还剩多少时间,我们需要通过CSF翻译条将计时器和计数器的信息显示出来。于是我们在地图文件夹里创建map.str文件,用记事本打开,添加这两条翻译项:

然后用红警语言编辑器打开Data\Chinese\generals.csf,制作对应的中文翻译条:

保存好generals.csf之后,记得要新建一个空白地图,再重新将Class1地图加载回来,使地图编辑器能够加载到我们刚刚添加的str翻译项。然后就是继续在初始化触发中添加结果,将计时器和计数器用文本显示出来:

整个初始化触发就算全部写完了。

 

接下来我们要思考,如何才能实现“每击毁一个碉堡,计数值就+1”这个逻辑呢?

我们首先想到了这样一种思路:让系统去检测某个指定名称的单位是否被摧毁,我们一共有5个碉堡,大不了制作5条相同的触发,分别对5个碉堡做检测,不就行了么?

通过查阅触发条件列表,我们发现了这么一条比较符合我们的期望:

于是我们在neutral文件夹里又创建了这样一条新触发:

将条件设置为“某个单位已被摧毁”,参数从下拉列表中选取为“碉堡1”:

   

将结果设置为“使特定计数器增加多少个整数值”,参数设置为1

   

    这条触发做好后是这个样子:

 

我们用界面右侧的“复制触发”按钮,将这条触发复制出另外4份,地图编辑器会自动为它们命名以避免重名,不过这个名称并不是很人性化,我们需要手工进行改名:

改成这样就人性化多了:

由于复制出来的触发副本与原本具有完全相同的属性,原则上我们需要分别修改其条件和结果,使其各行其事,以实现各自对一个碉堡进行摧毁检测。由于5条触发的结果都是完全相同的让计数器+1,因此在这个例子里就只需要修改条件即可达到目的。

碉堡击毁判定2,条件的参数改为“碉堡2”,表示这条触发只检测碉堡2是否被摧毁。

碉堡击毁判定3,条件的参数改为“碉堡3”,表示这条触发只检测碉堡3是否被摧毁。

后面同理,此处省略……………………

 

最后就是胜败判定触发了,先创建胜利触发:

按照开发需求,其条件为,计数器“碉堡击毁数”的值 >= 3

结果为“宣告胜利”:

 

然后创建第一种战败情况对应的触发:

按照开发需求,其条件为,计时器“任务时限”溢出:

结果为“宣告战败”:

 

再创建第二种战败情况对应的触发:

按照开发需求,其条件为,单位“夭启”被毁:

结果为“宣告战败”:

 

最终做完的所有触发就是这些:

点击确定执行所有触发的编辑,然后保存地图,进游戏体验一下这场简单的小任务关吧: