已阅读5页,还剩26页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
战役篇首先作两点重要的说明: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.w3m”,并在回来时留下了该存档,于是要读取该进度。如果存档不存在,说明还没去过,要用“保存并切换到关卡”动作切换过去。当玩家要从“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”换过来。现在保存战役测试一下,应该可以在两张地图之间任意切换了。记得每次测试完后删除存档。如前所述,这只是切换地图所需的最基本动作。现在我们来考虑一些相关的问题,对其进行改进。1、“LoadData”触发器使用的事件是“游戏读档”。但除了切换地图时读档,玩家自己存档读档也会触发该事件,怎么把两种情况区别开来呢?我们可以在每张地图上设置一个布尔变量“MapSwitch”,切换地图和分地图初始化时设其为true,读取数据完毕设为false。读档时判断该变量的值,即可知道是玩家读档还是系统读档。2、切换地图时,其动作在瞬间完成,并且要删除玩家的单位,这在玩家看来可能比较突兀。官方的兽族战役中,切换地图之前会先进入电影模式并淡出镜头,等待一小会再运行切换地图的动作,我们也可以效仿。不过这样又带来一个问题:如果玩家拥有多个单位,在等待的这一小段时间中,可能会有别的单位进入矩形区域,造成重复触发。解决的办法很简单,只要临时关闭触发器即可。3、游戏缓存不能记录任务,那么如何继承上一张地图的任务进度呢?我们可以设置一个整数数组QuestProgress,用来记录每个任务的进度,用缓存在各地图之间传递。切换到每张地图时,根据各整数的数值调整对应任务的状态和说明。比如QuestProgress2 = 0代表任务2尚未激活,QuestProgress3 = 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”文件夹,只能靠玩家手动删除。根据上面的方法,我们先在每张地图上添加一个字符串变量SavePath,再添加下面两个触发,在玩家存档读档时复制地图存档文件。玩家存档触发:玩家读档触发:另外在每一章的主地图(我们的例子里是“C1_1.w3m”)也要删除“System”文件夹,即玩家从头开始游戏时删除以前的地图存档:不好意思,纠正前面的一处错误:21L的读取数据触发LoadData,把“设置 MapSwitch = false”移到“等待0.2秒后面”。其实本来没什么错,只是因为刚才又加了一个以读取存档为事件的触发“PlayerLoad”,切换地图读档时两个触发顺序检查条件,“LoadData”符合条件“MapSwitch = true”,于是运行,但该触发动作里把MapSwitch设为false了,检查到“PlayerLoad”时,也变得符合条件了,于是两个条件相反的触发居然都被运行了。按我说的把“设置 MapSwitch = false”移到等待后面就没事了。现在只剩最后一个问题了:多地图切换。上面的地图切换触发,只适用于两张地图之间的切换,如果有多张地图,就需要多套这样的触发。并且读取数据时,不知道数据是从哪张地图上来的,也就不知道该把读取的单位放在哪里。所以我们要做一套通用的触发,不管多少张地图都能一劳永逸。这样做最大的问题在于,当单位进入矩形区域时,如何知道这块区域通往哪张地图。这就要用到哈希表了,我们可以用哈希表把各地图的名称或编号绑定给各个矩形区域。不过函数中没有“触发矩形区域”这一项,只有“触发不规则区域”。所以要把矩形区域添加到不规则区域中,然后把数据绑定给不规则区域,再为触发注册“单位进入不规则区域”事件。另外,把源地图的编号通过游戏缓存传递到目标地图,就可以知道目标地图上读取的数据是从哪张地图来的了,从而确定在哪里放置单位。昨天满血说的“地图转换”参数,我又测试了下,确实可以,先前是我搞错了。这样我们就不用“MapSwitch”这个变量了。另外“储存进度”事件只有手动存档才能触发,所以不需要判断条件。另外,昨天还发现纯T的“获取句柄ID”功能实际不可用,这就意味着T里的哈希表也不能用了,这样要做多地图切换就稍微麻烦些,不过仍然能实现,只是多几条动作而已。为了实现一些功能,我们给每张地图设一个编号,比如“C1_1.w3m”编号是11,“C1_2.w3m”就是12。这样一来可以用数组变量来为每张地图绑定一些数据,比如读取数据的地点;二来在一些循环动作里用得到,大家看了后面的触发就明白了。现在给大家一个3张地图之间任意切换的演示。在前面的“教程战役”中再添加一张地图“C1_3.w3m”,在第一章的3张地图上设置好相关的矩形区域。下面是我的3张地图的格局,大家可以照搬,简单明了。C1_1.w3m:C1_2.w3m:C1_3.w3m:列举一下用到的变量:游戏缓存 GC单位 Char整数 LocalMapNumber ,当前地图的编号。整数 OtherMapNumber ,切换地图时另一张地图的编号。整数数组 QuestProgress字符串 SavePath字符串数组 MapName ,各地图的文件名,以地图编号为索引。点数组 LoadPosition ,从别的地图切换到当前地图时,读取单位的位置,以地图编号为索引。实数数组 LoadFacing ,从别的地图切换到当前地图时,读取单位的面向角度,以地图编号为索引。不规则区域 RegionToC1_1、RegionToC1_2、RegionToC1_3 ,通往其他地图的入口。如前所述,因为无法获得“触发矩形区域” ,只能用不规则区域代替。下面上触发,先发地图“C1_1.w3m”的。为了移植方便,我把切换地图的触发分成了好几部分。其中“MapSwitchPrepare”做初始化相关变量等准备工作,在地图初始化时运行一遍。其中LocalMapNumber、LoadPosition、LoadFacing等变量都要根据当前地图的情况设置。“StartMapSwitch”则根据单位进入的是哪个不规则区域,判断该区域所通往的地图编号。剩下的4个触发“MapSwitch”、“LoadData”、“PlayerSave”、“PlayerLoad”功能与之前相同,不过相关的动作都根据地图编号进行,可以所有地图通用了,无论移动到哪张地图上都不需要做任何修改。“C1_1.w3m”上这套触发直接搬到另外两张地图上即可,不过前三个触发“MapInitialization”、“MapSwitchPrepare”、“StartMapSwitch”以及相关的变量需要稍作调整。C1_2.w3m:C1_3.w3m:3437楼就是3张地图任意切换的完整触发,用这套触发,更多的地图也可以应付。稍后我会把演示战役放到公共邮箱里,大家可以自己下载了研究。接下来还有一个问题,由于魔兽本身存在的一些bug,会影响到切换地图的系统。这里我把我发现的问题列出来,供大家参考。1、用触发切换关卡或读取存档,对文件路径的长度有限制,超过一定的字符数后就会失效。所以大家的战役文件名和地图文件名请尽量简短。2、缓存存取的单位,技能D会重置。3、缓存存取的单位,魔法书中的技能等级会重置为1(游戏存档时也是如此),非永久性技能会丢失。4、缓存存取的单位,用触发添加的动画附加名会丢失,一些状态,比如步兵的防御也会丢失。5、缓存读取的单位,其队伍颜色由其所属玩家决定,物体编辑器中自定义的队伍颜色无效(创建单位时也是如此)。6、缓存读取单位时,单位会将所有的英雄技能重新学习一遍。所以请尽量避免使用以“英雄学习技能”为事件的触发,以免出现bug。7、缓存存取的变身单位,生命周期会重置。8、缓存存取的召唤单位,会变成普通单位,生命周期丢失,死亡后留下尸体。纯T部分的战役编辑器教程到此就结束了,灵活运用的话,做出像官方兽族战役那样的作品完全没问题。后面则是Jass部分,通过导入自定义blizzard.j文件,可以进一步提高切换地图和其他功能的效率。下面的是Jass部分,不会Jass的同学可以止步了。另外前面给出的触发一律没考虑排泄,请大家自己解决。上面整理的地图切换系统,虽然可以通用,但战役中每张地图都要加一套,不免麻烦,而且占用资源。除此之外,做战役免不了会有一些所有地图都要用到的触发,比如技能触发、物品叠加触发等,这些触发如果不用每张图都粘贴一遍,而是可以放在一个地方,由所有地图共用,那该多美!事实上,方法是有的,不过只能在Jass层面上实现。那就是导入自定义blizzard.j文件。懂Jass的同学应该都知道,blizzard.j里放的都是由common.j里的函数写成的自定义函数,可以在所有地图里调用。既然如此,我们就可以修改b.j,把自己写的自定义函数放进去,也可以所有地图共用了。但b.j文件是放在mpq文件里的,总不能让玩家自己修改mpq文件吧。在单张地图上导入自定义b.j文件,并将路径改为与原b.j文件相同,就可以替换原b.j文件,但只对这一张地图有效,那又有什么用呢?大家是否还记得,战役编辑器里也有个导入文件的模块,并且在该模块导入的文件可以被战役里的所有地图共用!也就是说,我们把自定义函数放到b.j文件里,然后把修改过的b.j文件导入到战役编辑器里,就可以在所有战役地图里调用我们的自定义函数,而不必把这些函数在每张地图里都写一遍了!不过修改原版b.j文件是不行的,YDWE整合的JassHelper里,有一个b.j文件却可以用。原因我也不清楚,似乎是因为原版b.j不支持VJ。那么我们就把JassHelper的b.j文件复制出来,导入战役文件里。导入后要把b.j文件的路径修改为与原版相同:当然导入的文件是没法修改的,不过我们可以先导入,在外面修改了原文件以后随时右击替换就可以了。JassHelper的语法检查,也会检查b.j文件里的函数,不过不像检查触发编辑器那么简单。这里提示一下b.j文件语法检查的小窍门:b.j文件刚导入时,还没有保存下来,因此保存前的语法检查是不会检查这个文件的。如果是替换文件,那么实际上检查的是替换之前的b.j文件,可能会有不少错误。等第一遍保存之后,如果接着保存第二遍,由于地图没做修改,不会进行语法检查。所以正确的b.j文件语法检查方法是:先导入,然后保存一遍战役,不必理会检查结果。然后在打开的地图上做少许修改(比如添加一个空触发器再删除),再保存战役,这次得到的结果就是当前b.j文件的语法检查结果了。现在我们把之前的地图切换触发动作写成函数,添加到b.j文件里。当然触发的事件还是要在地图里添加。先把我们用到的变量放到最开始的全局变量
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 钢筋自动化连接系统-洞察与解读
- 风险防范机制设计-洞察与解读
- 培训学校规章章程制度
- 2026年主管护师考试真题附答案
- 车辆管理制度细则
- 2025福建省大数据集团平潭有限公司招聘3人笔试历年典型考点题库附带答案详解
- 2025广西北海市银海区直属国有企业招聘1人笔试历年备考题库附带答案详解
- 班级建设方案学生写
- 医院安全责任制度范本
- 3D打印建筑材料科技公司销售人员绩效考核与奖惩管理制度
- 小升初典型奥数:握手问题(讲义)-2023-2024学年六年级下册数学人教版
- DL∕T 5113.9-2017 水电水利基本建设工程单元工程质量等级评定标准 第9部分:土工合成材料应用工程
- 国家义务教育质量监测现场应急预案
- 国家八年级数学质量测试题(六套)
- 招标代理服务服务方案
- 路灯照明维修技巧培训课件
- 国家电网有限公司十八项电网重大反事故措施
- 绘本故事PPT课件之牙婆婆
- 《说“木叶”》一等奖创新教学设计统编版高中语文必修下册
- 三孔桥污水提升泵站压力管道设计说明
- 医废收集人员培训
评论
0/150
提交评论