V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
DreamerQQ
V2EX  ›  程序员

从零开始的 RPG 游戏制作教程(第十三期)

  •  
  •   DreamerQQ · 2021-03-17 16:06:53 +08:00 · 1600 次点击
    这是一个创建于 1348 天前的主题,其中的信息可能已经有所发展或是发生改变。

    往期回顾

    前言

    第一期:制作基础场景

    第二期:让勇者和怪物登场

    第三期:基础的数值设计

    第四期:从理论的角度简单聊聊关卡

    第五期:制作物品和技能

    第六期:设置怪物掉落物并部署关卡怪物

    第七期:触发器与逻辑

    第八期:对话、按钮、变量、马甲

    第九期:信息反馈(上)

    第十期:信息反馈(下)

    第十一期:刷怪与防守(上)

    第十二期:刷怪与防守(下)

    承接上期,本期将继续完善防守怪物的玩法流程。

    上期我们已经完成了刷怪的主流程,但如何判定玩家已击杀所有怪物,游戏如何胜利,我们还没有撰写。 本期我们要完成一个完整的游戏流程,包含胜利、失败。

    打开地图,我们来到基地区域。

    13-1.png

    放置一个城镇大厅,把它作为我们的基地。 我们需要玩家保护城镇大厅,一旦它被摧毁,游戏就将失败。

    因此来到触发,编写如下逻辑。

    13-2.png

    很简单地完成了游戏失败功能。

    然后我们要编写游戏胜利逻辑。 游戏胜利的逻辑可以有很多种写法,比如我们可以在每次玩家击杀敌人的时候判断地图上剩余的敌人数量和当前游戏的波次。如果剩余的活着的敌人的数量为 0,则游戏胜利。 我们也可以在最后一次创建了所有怪物后,将这些怪物添加到一个单位组中。当一个单位被击杀时,如果这个单位属于该单位组,则将其从单位组中移除。 当单位组中剩余的单位数量为 0 时,则说明所有的怪物都已完成击杀。 或者我们可以不使用击杀所有怪物作为胜利逻辑,而使用游戏时间作为胜利逻辑。 只要玩家能够坚持 35 分钟,游戏就会自动胜利。

    不过,在这里我们使用将最后一波的所有单位添加到单位组的方法。

    13-3.png 13-4.png

    在这里,我们不能使用设置变量来把 monster_final 设置为最后创建的单位组,原因是 [创建单位] 这条动作并不是在每次创建一批单位时一并创建一个新的单位组,而是始终会清空一个魔兽编辑器内置的单位组全局变量,并把新的一批单位添加到这个全局单位组中。 因此如上图,我们应当把最后创建的单位组内的所有单位添加到我们自己的单位组全局变量 monster_final 中。

    创建一个新的触发器,我们可以使用 单位 - 在单位组 来判断死亡的单位是否属于最后一波。

    13-5.png

    逻辑内容如下:

    13-6.png

    一个需要注意的地方是, [单位组中单位数量] 这一函数并没有被分类到 [单位组] 这个类别,而是被分类到了 [单位] 这个类别。 如上图进行撰写,每一次只要有 monster_final 中的怪物死亡时,本触发器就会执行。当 monster_final 单位组中的怪物全部被移除时,即单位数量为 0 时,游戏胜利。

    现在我们可以放置 4 个人族英雄,并预先放置一堆物品,用于测试这种对抗。 为了测试方便,我们启用 T1 中按下 Esc 刷出下一波搞怪的功能。

    13-7.png 13-8.png

    除了放置一堆物品,我们也能够直接编辑地图上英雄的等级,并设置他们的技能等级。

    13-9.png

    保存后点击测试地图,开始我们的测试。

    13-10.png

    由于没有保护好基地,失败了。 然后我们想要测试胜利效果,进入游戏后可以输入无敌秘籍 whosyourdaddy,按 Esc 键召唤出怪物。

    13-11.png

    直到消灭完狮鹫波次后,游戏胜利。

    好了,这样我们就又完成了一个完整的游戏流程。 这是一个没有什么丰富的拓展内容的游戏,但是它有目标、有胜利条件和失败条件。 它不一定能经得起很多次游玩,但是它能玩。

    不过就像我们实际测试中的体验,每 3 分钟如果没有任何提示,会让玩家不知道进度。如果怪物到来时没有任何信息提醒,也会显得突兀。 根据我们讲的 [信息反馈] 相关内容,我们来完善这些。

    首先,我们可以做一个计时器,用来让玩家随时查看距离下一波还有多久。

    13-12.png

    在变量窗口中添加两个全局变量,一个是计时器,一个是计时器窗口。 查看计时器相关的动作,我们可以发现计时器窗口需要被创建并和特定的计时器绑定。 13-13.png

    在 [ D1 游戏数据] 中,我们初始化计时器窗口并运行计时器。 13-14.png

    修改 [ T1 刷怪系统] ,我们将触发事件由每当时间过去 180 秒修改为计时器 monster_timer 到期。

    13-15.png

    同时,我们需要在每次到期后,更新计时器窗口的文本,使得其显示下一波到来时间。

    13-16.png

    不过如果我们只是这样写,当波次为第 10 波时,计时器窗口仍然会显示。 因此我们要在第 10 波时隐藏计时器窗口,同时暂停计时器。

    13-17.png

    然后,当玩家进入最后一波后,为了让玩家容易理解,我们可以每当玩家击杀一个怪物后,都汇报剩余的怪物数量。 修改 [ T4 最终波次怪物死亡] 触发器动作。

    13-18.png

    然后我们可以在玩家进入游戏后,显示一个提示信息,用于告知玩家游戏目标。

    13-19.png 13-20.png

    此外,我们可以在每一波开始时,预告下一波的怪物内容。

    13-21.png

    如上图创建一个新的触发器。 这个触发器没有事件也没有条件,我们可以在别的触发器中手动执行它。 需要预告下一波怪物的地方,是游戏开始、播放完提示信息后,和最后一波之前的每次刷怪时。

    修改 T5 触发器:

    13-22.png

    修改 T1 触发器:

    13-23.png

    在每次怪物到来时,目前没有任何攻击警告信息。 让我们加上它:

    13-24.png

    分别为每一波怪物到来时的提示信息,和第 10 波提示本波为最后一波。 为了更醒目,我们还可以在刷怪的同时,增加一个小地图提示警告圈。

    13-25.png

    进入地图后我们发现计时器对话框并没有显示,原因是 [显示计时器窗口] 不能在地图初始化时运行。

    13-26.png

    如上图的动作注释。

    在触发编辑器中,一部分需要特别注意的功能的要点会被标记在注释中。不过并非所有有问题的动作都被标记了,这些坑往往会在实际开发中浪费大量时间。 因此始终确保在一张空白的地图里面去测试清楚某些功能是否运转正常,是有效规避意外的一种方式。

    修复计时器窗口的问题,我们可以把运行计时器和显示窗口这一套动作放到新的触发器中。

    13-27.png

    回到游戏,确认是否运转正常。

    13-28.png 13-29.png

    好了,我们的目标完成了。

    现在回顾,显然刷怪系统本身并没有占用我们多少制作时间,反而是信息提示、数据录入、文本细节的调整占用了我们很多的时间。 游戏的实际制作也是这样的,主玩法本身很重要,但一款游戏包含的不仅仅是主玩法。除非一个地图只是为了自己玩或者和周围人进行试验,否则就会有很多其它工作要让我们完成。

    除了刷怪以外,在官方对战平台上,有很多基于防守玩法拓展的地图。 有些地图修改了波次间隔和数量,有些修改刷怪规则转而使用连绵不断的出怪方式,有些修改胜负条件,将地图怪物数量上限作为失败条件,有些会拓展刷出的怪物机制,除了魔兽常规的怪物以外,他们还会为怪物增加随机 BUFF 、增强特定属性。 有些则是提供更丰富的可选的英雄、英雄技能、战斗机制、升级英雄的方式,取决于你想要如何设计地图玩法。

    同样,刷怪系统只是诸多系统的一部分,我们也可以围绕经营、随机事件、文本剧情,或是围绕提升某个物品来设计玩法,并制作相应的系统。

    目前为止,我们已经讲了很多基础知识和概要内容,下期开始,我们要走得更深一些了。

    ————————————

    附:感谢魔兽争霸官方对战平台对本教程提供支持。 魔兽争霸官方对战平台是由网易研发运营,暴雪官方正式授权的官方对战平台。如果正在阅读本文的你对制作魔兽地图有想法、希望与平台探讨合作事宜,或正在寻求魔兽地图的商业变现,可通过官方平台提供的合作电子邮箱来沟通联系。 电子邮箱地址:warcraft3worldedit#service.netease.com (#替换为 @)

    2 条回复    2021-03-17 19:22:43 +08:00
    SxqSachin
        1
    SxqSachin  
       2021-03-17 16:13:41 +08:00
    回想起来 jazz 算是我第一个学的编程语言
    xsheII
        2
    xsheII  
       2021-03-17 19:22:43 +08:00
    不错,收藏了,等更新
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2941 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 12:42 · PVG 20:42 · LAX 04:42 · JFK 07:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.