第二十九期 强力斩击

 
发布日期:2019年3月10日




大家好,这里是深夜运动节目肥猫池塘第二十九期
我是沉迷鬼泣5无法自拔的крыло


玩过动作游戏的人估计心中都会有自己的一套完美的技能设定
感觉自己理想中的角色应该是这样这样的
但是因为各种各样的原因,这个想法很难实现
美术、策划、编程、音效等,都是实现这个想法的必要成分
要实现为成品很难,所以很多人也仅止步于设想,无法深入下去

不过尽管如此,很多人的热情还是没有冷却,对这个东西还是抱有强烈的好奇心,用自己的方法尽可能地达成自己的想法
今晚的话,就是大概聊一下,dnf的技能是怎么做出来的

引擎
引擎其实是个很模糊的概念
凡是可以去支撑一个去运行的东西都可以称之为引擎,也叫发动机
游戏就是通过这一堆东西去开始运作的,后续也通过这堆东西提供持续的动力,所以形象地称之为引擎

例如说,这里有一组动画,都是使用png格式存放,需要连续播放才能够形成动画
那么,在程序里面,让这6个图形成动画播放的代码,就是引擎的一种
因为没有这段代码,程序生成会动的游戏画面是不可能的,所以这段播放动画的代码就是驱动游戏必须的条件

所谓的引擎就是这样一种,可以让游戏生成一个最基本的运作环境的程序代码集
动作游戏的引擎,就是一堆支撑一个动作游戏的碰撞判定、动作播放、音效反馈、画面渲染、操作反馈等一大堆基本内容的代码的集合体
dnf的话,是开发者自己编写的一套系统,而且还是03年左右的环境,所以我们一直吐槽他们的游戏底层架构落后,某种意义上来说dnf就是用一个十几年的老旧引擎来驱动的汽车,费油又跑不快
所幸的是,现在已经有很多成熟的引擎可以供独立开发者们使用,大大地缩减了游戏开发的难度,使得写一个游戏不需要从0开始写起了


环境
引擎准备完毕的前提下,就要构建一个运行的环境了
类似dnf这样,可以让角色在里面活动的场景,叫map
map限制了这个角色可以活动的范围,这个范围就是一个封闭的环境,但是dnf没有物理引擎,所以本质上就是单纯这样的一个没什么特殊功能的箱子而已
图中就是一个最原始的map,下面格子的范围是dnf引擎所定义的“地面”

限制了活动范围构造了一个基本的环境之后,接下来就是添加环境对象了
什么叫环境对象呢?就是环境里面的“东西”,在环境里可以交互的对象
战斗者、飞行道具、特效、障碍物等,可以在环境里面活动,产生互动和触发事件的物体,都叫环境对象
也就是传统意义上的“单位”

随便加了几个对象进去
红色是玩家操控的对象,蓝色是非玩家操控的对象,绿色是map里面,作为装饰物兼障碍物的对象

TILE&ANI
基本的 环境 构建完毕之后,就可以往环境对象里面代入图片了
2d游戏的话,一般来说,环境的图片处理和环境对象的图片处理的机制是完全不同的
应用于环境,铺设出地图外形的图片称之为tile
tile直译过来就是小瓦片的意思,地图实际上就是一个一个类似小瓦片的元件拼合而来的
这种tile地图的做法在上古时代的游戏,很省空间,而且方便加载,但也不乏使用一整张图片作为地图的地图
dnf的话是处于两者之间
远景也是同样的原理

而ani是animation,也就是动画
如同上面所说的一样,动画就是引擎所规定的的,调用某路径的图片数据规定产生的可供调用的动画文件
我调用游戏图像文件夹里面的sprite_character_swordman_equipment_avatar_skin.NPK文件,把里面sm_body0000.img的176-179这4帧定义为sm_wait.ani
意思是男鬼剑士待机动作
一样地把其他需要用到的动画都做成ani,放到地图里面
ani不一定要动起来,静止也可以算动画,因此ani可以看成是环境对象的“图像单位”
在这个基础上加入更多的细节,例如鬼剑士的avatar穿上衣服,基本上就是我们可以看到的游戏画面了

反馈
图像和环境对象的关系理解之后,接下来就是反馈了
玩家输入的指令,actor(玩家操控的对象)会作出什么样的反应,然后周围的物体会因为actor的行为而作出什么回应,这就是引擎要干的事情

dnf里面,引擎里面设定了技能键1的按键是A,假如角色按了键盘上面的A就会把指令传输给系统,然后系统作出反馈,让鬼剑士的站立状态发生改变,变成登记在技能键1上面的技能鬼斩的动作
这时候actor播放一次鬼斩的动作,伴随着角色的指令,产生出恶鬼剑气
这里的恶鬼剑气实际上是产生了两个ani对象
两个ani的坐标对好,右面的定义为发光图层,就会得到上面的效果
鬼剑士鬼斩之后会定住一段时间,那是因为把鬼斩的动作的ani文件的最后一帧的时间设定长了
ani的不同帧的持续时间是营造良好视觉效果的重要手段

然后我们在鬼斩剑气的ani里面加入判定框
判定框是要附着在ani上面的,dnf的情况有几种,直接使用武器本体的ani做判定框,在特效动画上面弄判定框,还有就是弄一个隐藏的空白ani弄判定框,最后一个比较少见

这里面,角色和敌人的判定框是附着在角色和敌人的ani上面的,而鬼斩的攻击判定并没有附着在武器上面,而是剑气特效上面
如果还细心留意的话,被鬼斩砍到的哥布林身上播放了一个暗属性爆炸的特效,所以实际上一个鬼斩会同时刷新5个ani:鬼剑士砍击动作ani、鬼斩的特效ani、鬼斩的发光特效ani,打击的暗属性爆炸ani、敌人反馈动作的ani

参数设定
上面的内容的话,是每个act都一定会做的内容.
而真正考验制作人员功底的,就是技能的参数设定了
只要稍微有一点点偏差,技能都会变得极其陌生,这个参数是非常重要的

dnf里面把部分参数做成了表层参数,表层参数可以直接写成外部脚本的形式被引擎读取
而外部脚本能设定什么要素呢?这里姑且举一个仅供研究参考的假设 例子:
[attack type] `[physic]`     
[weapon damage apply] 1
[attack enemy] 1   
[elemental property] `[dark element]`   
[damage reaction] `[down]`
[push aside] 300   
[lift up] 300
[attack direction] `[hit down]`

[attack type],攻击类型,物理和魔法,[physic]就是说明了这个鬼斩产生的伤害是物理伤害
[weapon damage apply] ,百分比(直接型技能),否为固伤(间接)技能
[attack enemy] 能否对敌人造成伤害,0的话就是纯演出
[elemental property]攻击属性,`[dark element]`意思就是暗属性攻击
[damage reaction]攻击反应,敌人受到攻击后的状态,none是不会造成任何互动,damage是进入硬直但敌人不会改变状态,down是敌人进入受击硬直中
[push aside]击退力,300就是1秒内300px
[lift up]浮空力
[attack direction] 攻击方向,决定了播放的受击特效的方向

可以看到脚本里面的内容只是提供了很浅层的设定条件而已
如果我们把击退力和浮空力都设置成0的话,就会产生什么情况呢?
哥布林会变成迫真建筑类敌人

除去这些之外,还有很多复杂的参数,最典型的就是之前我们说过的硬直和hitstop
例如下图的三种情况
分别是敌我双方的hitstop修改为1秒,攻击者hitstop为1秒怪物正常,怪物hitstop1秒攻击者正常的情况
可以看出达成的感觉完全不同
要做出成功的技能就要制作人员对打击感的理解优秀,这就是好的程序员和画师一大堆,但是做出来的东西水平不同的原因,这个感觉需要多年的制作去培养,并不是天生就有或者可以复制别人的

除了这些参数以外,攻击速度(演出速度=基准速度/攻击速度),还有帧动画的间隔还有负数加速度模拟出来的动态这些也是考验制作人员理解的因素

上面就是制作一个很基本的攻击招式的流程和注意点
然后就是普通攻击、幻影剑舞和白手觉醒这些技能实际上都是多个攻击招式串联在一起的
其中产生的打包和不打包关系又弄出了随动和不随动这些幺蛾子

类似鬼印珠的那种多段攻击技能的则是只用了一个攻击招式,但是用了“攻击间隔时间”这个数值来设定多段攻击次数
一个ani持续1秒时间,正常情况下攻击间隔时间和持续时间一样,换句话说就是在这次攻击中,敌人只会受到最大1次的伤害
但是如果ani持续1秒,攻击间隔时间设定为0.2秒,那么这个技能就可以在攻击效果持续的时候造成最多5次伤害

总的来说,只要是想做出什么效果的技能,只要不超越引擎的极限,可以在理解自家引擎的特性的前提下解释清楚的话完全是可以做出来的,例如真正的空战职业
dnf的技能要做出来是非常简单的,只要是想和有素材,一天做十几个出来都没什么问题
但是要想真正好用并且手感优秀的话,里面的调节就复杂了
不过说实话,现在的dnf的图像、动作调制还有音效实际都是过得去的水平,最大的问题就是大家都很平庸,并不优秀,所以合在一起就显得只能让人感觉差强人意了,蛋疼

行动快感!地牢与战斗机

 

回到目录