《DFQ》开发随录——打击感

  欢迎参与讨论,转载请注明出处。

前言

  对于动作游戏(本文所谓的动作游戏具体指由FTG衍生而来的「超人系ACT」,如鬼泣、猎天使魔女等)而言,打击感自然是重中之重,本篇就来讲讲DFQ的打击感实现思路吧。
  首先要明确打击感的定义,本人将之定义为:攻击命中时产生的反馈。就这点而言,打击感并非是动作游戏的专属,凡是涉及到攻击交互的游戏都有。而动作游戏与之不同在于会对在攻击中附加控制效果(击退、击飞等),使得动作游戏成为了围绕打击感展开操作的游戏。
  而DFQ的打击感基本源于DNF,在此基础上加入个人的理解,接下来便一一讲解其中构成。

判定

  在产生攻击命中之前,自然得讨论如何触发了。众所周知,动作游戏讲究「所见即所得」——必须是看上去击中了,才算是命中。所以自然要使用一些方式去近似地模拟素材的边界范围,以此进行碰撞判定。而DFQ的做法则相当粗暴——直接构建一些近似的矩形,当然这矩形却不一般:
collider
  如图所示,人物拥有两种颜色的矩形,其中白色矩形表示人物的X-Z轴矩形,红色矩形表示为X-Y轴矩形。与一般的无纵深横版游戏(冒险岛、胧村正等)不同,DFQ这类可进行上下移动且滞空的横版游戏(DNF、三国战纪等)会去构造一种「逻辑上的三维空间」:
coordinate
  当然实际上可以直接使用3D矩形(立方体)进行构造,只是2D图形下不便表示,于是分解为两个矩形进行。自然地,判定时也是红对红、白对白。至于判定算法,由于DFQ没有太精细的需求,矩形不会参与旋转变换,故直接使用AABB即可。

击退

  话不多说,直接上图:
stun
  击退是打击感中最基本的元素了,当然将之命名为击退只是个人行为,在业界它有着各种各样的称呼,如stun、硬直、僵直、気絶等,在此一提。
  由图可见击退有两种不同的姿势(为了表现的丰富度),敌人会保持被击姿势一段时间,且变速位移一段距离。以函数的形式表示便是stun(time, speed, acceleration),time表示保持姿势的时间,speed为位移的初始速度,acceleration为速度的衰减值(也可以是加速值),通过acceleration来每帧减少speed,以此实现简单的变速运动效果。当然speed与acceleration并非是必须的(不带位移的击退),但time则必须有(无time不stun)。

击飞

  同样,直接上图:
flight1
  与击退同样,击飞也属于动作游戏里最核心的控制效果之一,它的别名也很多,如flight、击倒、倒地、浮空等。
  击飞这种控制效果在最初只是作为一种动画表现手法而已,一般用于敌人死亡、某些想表达击飞的招式等。敌人处于击飞动画时一般无法或难以继续进行互动。将之发展的据说是CAPCOM开发《鬼武者》时触发的一个BUG——敌人处于击飞时被后续攻击而产生了滞空效应。从此一发不可收拾,铸就日后《鬼泣》皇牌空战之名。
  而DFQ身为2019年的游戏,自然不可能落后:
flight2
  以上两张图基本可以窥得击飞之全貌了:

  • 击飞在状态上可分为上升、下落、倒地,上升与下落都会进行类似击退的变速运动,且根据进度改变姿势。
  • 姿势内容为击退的两个为基础外加它们的90度旋转版本及倒地。
  • 在击飞时被攻击会切换姿势且保持滞空一小会,形成了浮空连击的效果。
  • 除此以外便是X轴的位移效果了,这点与击退一致。
  • 倒地会根据浮空高度结算出「再击飞」,画面表现上为落地弹起,若高度不足则直接倒地。

  与击退类似,击飞的基本函数形式则是flight(speed_z, speed_x, acceleration_z_up, acceleration_z_down, acceleration_x),参数含义与击退类似,不再阐述。一般而言acceleration_z_up与acceleration_z_down会选择默认值,speed_x与acceleration_x则为可选项,但speed_z必须有(无speed_z不flight)。

特效

  继续上图:
effect
  特效其实没什么好说的,如果说动作姿势是描线,那么特效便是上色了。需要注意的是特效出现的位置一般得是矩形碰撞的交点处,这样才有「打中这个位置」的感觉。
  特效的种类一般就是斩、打、突、气四类(利器、钝器、锐器、魔法),外加出血之类等等,多多益善。
  顺带一提的是,由于特效算是一种创建销毁十分频繁的对象,值得为之做对象池以减少创建销毁的开销。

声音

  这下上不了图了,毕竟声音的可视化形式一般人类都看不懂(笑。
  由于打击感是攻击命中时产生的反馈,而反馈的形式自然不局限于视觉上的,听觉也相当的重要。当然这里讨论的声音可不仅仅是攻击瞬间产生的部分,还包括了整个招式过程。
  一般而言,一个招式基本会包含以下元素:

  • voice:如人物发招时的叫声,播放时机不限。
  • swing:如人物挥剑的声音、特效产生的声音,一般于运动帧时播放。
  • hitting:如刀砍到身上的声音,于命中时播放。
  • damage:敌人被攻击的惨叫声,于命中时播放。

  声音这部分在业界不少垃圾游戏可谓是偷工减料的重灾区,实际上万万不可忽视,毕竟有时候效果好不好就靠听个响(代表:拳皇)。

Hitstop、闪烁、抖动

  这仨放一块讨论是因为他们相辅相成:
battle
  Hitstop这玩意我对其没有准确的中文词汇,业界一般称为硬直、僵直、卡肉等(可见多容易与击退混淆)。其定义如其名般:因hit而导致stop。表现形式为人物停止运动一段时间,这里的运动包括位移、动画之类。Hitstop是敌我双方皆有的,我称本体的Hitstop为Selfstop,敌方为Hitstop。由此可见,卡肉这个说法其实很恰当,感受起来就像是一下刀卡到肉里了。一般Hitstop的高低可以用于表示攻击的轻重,以及像内功拳法、一闪刀法等延迟杀伤效果也可以通过高Hitstop达成。
  至于闪烁就更直白了,就是敌人表面有一层纯色遮罩渐变消失。值得注意的是,闪烁的运作也会受Hitstop影响,故在Hitstop期间闪烁是保持初始状态的,看起来敌人就是蒙上了一层白色。这么做可以使得命中的效果更为明显,在业界中《王者荣耀》也采用了这样的表现手法。
  抖动在图中也许看不太出来,主要就是设定个时间值以及抖动范围(xa, xb, ya, yb),人物在时间内就会随机位移,形成抖动的效果。与闪烁同样,在Hitstop时间是不会流动的,所以抖动与闪烁类似,基本上便是用于加强Hitstop的表现力。在业界中CAPCOM的《吞食天地》也采用了这样的表现手法。

后记

  以上只是打击感的一些机械的构成,实际上要做好打击感得充分利用许多元素,如场景震动、运镜、符合节奏的连击等。实际上它是一门导演的学问,要想培养就只能多抄多想多做。限于素材与平台,未能表现更丰富的元素,只能有待日后进军3D再说了。