魔兽战役简单教程
战役篇
首先作两点重要的说明:

1、在制作战役时,如果要保存,请直接在战役编辑器上保存,一定不要在单张地图上保存,否则会导致该地图打不开。如果已经遇到了这种情况,不必惊慌,可以在该地图上做少许修改(如添加一个空触发器再删除),然后在战役编辑器上保存一遍,即可恢复该地图。

2、如果要测试战役,不要在单张地图上点测试地图,要保存战役后进入游戏进行测试。这是因为,跟切换地图和章节相关的很多动作,以及战役编辑器中的自定义数据,都只能在运行战役时生效。


看一下战役编辑器的基本功能。打开战役编辑器,可以看到4个模块:普通、载入画面、自定义数据、导入文件。

普通:

在这里可以设置战役的说明文字,以及导入地图。导入地图并保存战役后,地图就整合在战役文件里了,可以把原始地图文件删掉。要编辑导入的地图,在右面的地图列表里右击,选择编辑地图

导入的地图请一律用英文名,并且为了后面切换地图方便,请保持所有地图的后缀名一致,要么都是.w3m”,要么都是.w3x”。导入的地图无论再怎么修改,后缀名都不会改变了。


载入画面:

在这里可以设置战役背景的图片(比如暗夜战役的弓箭手mm)、鼠标指针形状(因种族而异),还有战役屏幕按钮。

战役屏幕按钮,也就是战役背景中的章节选项。新建一个按钮,可以设置章节名称和它通往的地图。还有一个初始可见选项,顾名思义,勾选了该项的按钮一开始就能看到,没选的按钮就是隐藏的,可以通过触发来显示。另外,每个按钮前面都有一个序号(ID),用触发显示按钮时就是以这个序号为准的。


自定义数据:

和物体编辑器功能相同。区别在于,在这里定义的数据能被战役里的所有地图共用,并且会在每张地图的物体编辑器里以蓝字体显示出来。如果这里和物体编辑器的数据有冲突,则以物体编辑器为准。建议大家的自定义物体数据都在这里改。另外这里的数据在测试单张地图时是无效的,只有运行战役才会生效。

导入文件:

顾名思义。这里的导入文件同样可以被所有地图共用。


接下来就是大家最关心的切换章节和切换地图了。我们先做点准备工作。

创建三张地图(为方便测试,用尺寸小点的),分别命名为C1_1.w3m”、C1_2.w3m”、C2_1.w3m”。其中第一个数字表示章节,第二个数字表示同一章的地图序号。做点最基本的处理:放置开始点;删除对战初始化触发器;在情节——队伍中勾选自定义队伍设置固定玩家设置,这样可以将游戏界面固定为某一种族的;随便修改一下地图说明和地形,将两张地图区别开。

把三张地图导入新建战役。在载入画面模块为C1_1.w3m”和C2_1.w3m”各添加一个按钮,分别命名为第一章 C1_1”和第二章 C2_1”,其中第一章设为初始可见。保存战役为教程战役.w3n”,删除两张地图的原始文件。

自定义数据模块中自定义一个英雄,作为战役的主角。比如一个称谓为大师与天才的血魔法师。



切换地图的核心是游戏缓存。先简单介绍一下原理:


在一张地图上创建一个游戏缓存,可以将一些数据(包括单位、整数、实数、字符串)储存起来,将其保存到本地硬盘。然后通过保存并切换关卡保存并读取进度等动作,进入同一战役的另一张地图。在新的地图上,创建一个同名的游戏缓存,从硬盘读取缓存数据,便可以将上一张地图的数据复制过来,也就是继承上一张地图的进度。

关于游戏缓存,有一些诡异的问题,比如无法彻底删除、同一硬盘上有数量限制等。总之就是创建的游戏缓存越少越好。所以我们只在每张地图初始化时创建一个游戏缓存,一律用同样的名称。
现在开始制作切换章节的触发,即从第一章C1_1.w3m”进入第二章C2_1.w3m”。

C1_1.w3m”上设置一块矩形区域to C2_1”,作为通往第二章的入口。当玩家1的单位进入该矩形区域时,即进入第二章。


在地图C1_1.w3m”上,添加一个游戏缓存变量GC”,和一个单位变量Char”,创建一个初始化触发器为其赋值:



游戏缓存的名字可以随便取,不过要保持每张图一致。我用的Demo”是演示的意思。

然后是切换章节触发:

第一张地图到此为
止,再来编辑地图C2_1.w3m”。设置矩形区域from C1_1”,从第一章读取的单位就放在区域中心。



同样添加游戏缓存变量GC”和单位变量Char”,然后用初始化触发器读取上一章的主角数据:



大功告成,现在保存战役,进入游戏测试下,应该可以从第一章进入第二章了。

注意缓存的类别名C2,用的是下一章节的序号。这是为了防止玩家随意进入各个章节,导致缓存数据混乱。比如说,假如所有地图都用相同的类别名A”,某玩家进入第三章,过关后该章的数据存入了类别A”,然后他不进第四章,而是又回头玩第二章,那么他在第二章读到的就是第三章的数据。

另外,以上只是实现关卡切换的最基本动作,实际应用时还要添加很多动作来应对各种意外
情况,后面会慢慢讲到。

接下来是切换地图。我们来写一套触发,让玩家可以在第一章的C1_1.w3m”和C1_2.w3m”两张地图之间随意切换。

切换地图的原理和切换章节相同,都是用缓存传递数据。区别在于,切换地图是双向的,去了之后还要回来,所以在离开一张地图前往另一张时,要做好善后工作,比如储存进度以便回来时读取,删除已记录的单位等。另外切换地图时要继承的不仅是单位,还有其他一些数据,比如游戏时间、玩家资源、任务进度等,都要用缓存记录下来。

另外,由于每一章的分地图(比如C1_2.w3m”)没有章节按钮,玩家不能从战役界面直接进入,所以不用担心数据弄混的问题,缓存类别统一用一个名字就可以了。我习惯用MS”,即MapSwitch(标准的中式英语- -)。

在地图C1_1.w3m”上添加矩形区域to C1_2”,作为通往地图C1_2.w3m”的入口。再添加矩形区域from C1_2”,作为从C1_2.w3m”回来时读取单位的位置(参见8L的图)。

下面是切换到C1_2.w3m”的触发:


看最后一项的if动作,其含义是:如果存档C1_2.w3z”存在,说明玩家已去过地图C1_2.w3
m”,并在回来时留下了该存档,于是要读取该进度。如果存档不存在,说明还没去过,要用保存并切换到关卡动作切换过去。当玩家要从C1_2.w3m”回来时,读取现在留下的存档文件C1_1.w3z”就可以了。

注意每次测试完战役,都要手动删除相关的存档文件,以免对下次测试进行干扰。用触发也可以删除存档文件,其应用留到后面再讲。

C1_2.w3m”回来时,仍然要读取数据。读取数据的触发如下:


地图“C1_1.w3m”上的工作就结束了,再来编辑地图“C1_2.w3m”。为了方便,把上面的两个触发“MapSwitch”和“LoadData”直接复制过来。添加矩形区域“from C1_1”和“to C1_1”。


对两个触发进行修改。其中LoadData”不需要做别的改动,只要把读取单位的矩形区域替换成from C1_1”,然后在地图初始化时运行一遍:



MapSwitch”修改如下:



因为是从C1_1.w3m”切换过来的,所以存档C1_1.w3z”必然存在,不用if判断了。别忘了把存档名C1_1”和C1_2”换过来。

现在保存战役测试一下,应该可以在两张地图之间任意切换了。记得每次测试完后删除存档。

如前所述,这只是切换地图所需的最基本动作。现在我们来考虑一些相关的问题,对其进行
改进。

1LoadData”触发器使用的事件是游戏读档。但除了切换地图时读档,玩家自己存档读档也会触发该事件,怎么把两种情况区别开来呢?我们可以在每张地图上设置一个布尔变量MapSwitch”,切换地图和分地图初始化时设其为true,读取数据完毕设为false。读档时判断该变量的值,即可知道是玩家读档还是系统读档。

2、切换地图时,其动作在瞬间完成,并且要删除玩家的单位,这在玩家看来可能比较突兀。官方的兽族战役中,切换地图之前会先进入电影模式并淡出镜头,等待一小会再运行切换地图的动作,我们也可以效仿。不过这样又带来一个问题:如果玩家拥有多个单位,在等待的这一小段时间中,可能会有别的单位进入矩形区域,造成重复触发。解决的办法很简单,只要临时关闭触发器即可。

3、游戏缓存不能记录任务,那么如何继承上一张地图的任务进度呢?我们可以设置一个整数数组QuestProgress,用来记录每个任务的进度,用缓存在各地图之间传递。切换到每张
地图时,根据各整数的数值调整对应任务的状态和说明。比如QuestProgress[2] = 0代表任务2尚未激活,QuestProgress[3] = 2表示任务3已进行到第2步。

4、缓存不能记录单位的技能CD,每次读取单位,技能CD都会重置。这个问题是无法解决的。而用缓存记录读取变身单位时,该单位的变身持续时间也会重置。这就导致单位可以在变身状态下使用变身技能。如果该技能绑定了一些相关触发,比如每秒对周围单位造成伤害等,重复变身就可能造成bug。因此在记录单位之前,要删除该单位身上包括生命周期在内的一切魔法效果。

5、切换地图时通常我们只记录英雄单位,将其记录并删除后,可能还会留下一些召唤单位什么的。因此记录完单位后,应将玩家剩下的单位都删除。

5、如果玩家队伍中有死亡的英雄,读取时设置其生命值为0,该英雄会再次播放死亡动作,并发布死亡信息。因此对于死亡的英雄,最好在切换地图时将其复活。不想复活的话,可以将其隐藏,杀死之后再显示,可以隐藏死亡动作,但死亡信息是隐藏不掉的。

综合以上考虑,对上面的触发作初步改进。首先在每张地图上添加以下变量:

布尔值MapSwitch 整数数组QuestProgress

修改后的切换地图触发如下:



修改后的读取数据触发如下:


以上只是对切换地图系统最基本的改进,还有更大的问题需要我们解决。下面的这个问题有点麻烦,而我的表述能力比较差劲,所以可能说得很乱,请大家耐下心来好好理解。

我们在判断一张地图是否已经去过时,用的方法是判断该地图相应的存档是否存在。但这种方法是有欠缺的。考虑这样一种情况:玩家在地图1上手动存档,然后第一次进入地图2,再
从地图2回来,于是就生成了地图2的存档。这时玩家任务失败了,于是他只好读取刚才的手动存档重新来过。本来在他手动存档的时候,还没去过地图2,地图2的存档是不存在的,而现在却已经存在了。于是出现了混乱,系统会以为他在当前的进度中已经去过地图2,并读取地图2的进度,而这个进度明明是上一次失败的游戏留下来的。

换个方式来讲吧,可以这么理解:玩家进行2周目的游戏,却读到了1周目的地图存档。

为了解决这个问题,我们需要在每次手动存档时,记录下当前玩家已经去过的地图存档,下次读档时只保留这些地图存档,而把其他的地图存档都删掉,以免混淆。于是我们为每个手动存档建立一个文件夹,把与之相关的地图存档复制到文件夹里。另建立一个文件夹System”,专门放置游戏过程中的地图存档。每次手动读档时,删除System”里的地图存档,把所读存档文件夹里的地图存档复制到Syetem”。

比如说,玩家从地图1去了地图2,再回来,于是System”文件夹里生成了地图2的存档Map2.w3z”。这时玩家手动存档,文件名为Save”。于是生成一个名为Save”的文件夹,
System”里现有的地图存档魔兽冰封王座地图“Map2.w3z”复制到Save”里。接下来玩家又去了地图3,再回来,System”里又有了Map3.w3z”,但Save”里却没有。随后玩家任务失败,读取存档Save”。这时System”文件夹就被清空了,而Save”里的地图存档Map2,w3z”被复制到System”里。切换地图时以当前System”里的存档为准,于是系统正确地判定玩家去过地图2,却没去过地图3,并且读取到的地图2存档正是当前进度留下的。

这正是官方兽族战役里用的办法,我也想不出更好的了。但这个方法还有个缺陷,就是当玩家删除手动存档时,无法用触发删除其对应的存档文件夹,即上例中的Save”文件夹,只能靠玩家手动删除。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。