真实世界物理规律无穷无尽,如果每个游戏的设计都要运用物理知识,那岂不是大大延长了游戏制作周期和开发难度?虽然现在游戏开发工具五花八门,大多数的物理行为都已经被写在了工具的模板中,随时可以直接调用进行模拟。但是,我始终认为,作为一个认真的游戏设计者来说,一定要“知其然”更要“知其所以然”,因为只有这样才可以真正了解自己所做的设计,并且真正会运用它们在每一个细节中,就算出现了错误或者BUG,也可以迅速定位到问题,并且懂得原理,知道如何来修复和优化。
本文想要写一下另外一个很常见的物理行为“切割”。
基础原理
“切割”行为,也可以叫做“分裂”行为,简单描述就是:一个质量为A、体积为V的物体,被外力(或内力)作用,分解成2个或多个部分:A1,A2…(体积V1,V2…)。并且满足:
- ∑An=A
- ∑Vn?V(体积之和不一定等于原来的V)
简单用示意图表示则如下图:
-
质量(用于计算子物体的密度、计算子物体的初始惯性状态,计算子物体的受力)
-
体积(用于计算物体的密度、分析物体的形状相关参数)
-
重心(计算重力,计算物体的翻转行为)
其实《水果忍者》这款游戏,严格意义上来说,并不算一个物理的模拟游戏,虽然在最基本的操作中,仅仅为一种手指操作的“切割”,但是实际的计算过程中,并未根据玩家即时的操作行为,产生与之真实对应的物理反馈,而是一切切割行为都已经预先设计好,计算好,在玩家操作的时候进行选择性触发而已。
举个例子:一个西瓜飞行在空中时,若玩家用手滑动,想要将西瓜切割成体积1:5的两个部分,但是实际操作的时候玩家会发现,无论自己真实如何操作,西瓜分裂成的两个部分都是预先已经被设定好的。
但是在切割类的游戏中,毫无疑问的《水果忍者》这款游戏应该是最广为人知并且最受欢迎的。简单的剖析一下,水果忍者主要的物理原理构成很简单,分为两个部分:
- 重力作用:完全不计算空气阻力,只考虑一个初始速度与重力加速度,每一个水果从飞行到落下的整个过程中,经历的状态变化为(如下图):
通过给不同的水果品种,配置不同的上述2个参数,则可以在游戏中看到各种各样的水果,以不同的角度和速度飞入游戏界面中,玩家在一种眼花缭乱中紧张地进行着“切水果”的操作,获得快乐。配置表随便举例如下图(仅为举例参考,请无视具体数据):
所有的计算公式,只有一个:理想状态下的抛物线公式。(感兴趣的朋友可以参阅我的本系列第二篇文章)。这个过程的计算还是很便捷的。
-
切割作用:
-
切割后分裂成哪几个部分(绝大多数都被简化为2个,无论切割几刀)
-
分裂后的子部分,以何种方式向两边分开落下
甚至可以想象得到,游戏很可能使用了同一套公式和系数去计算所有的水果切割分裂后的飞行状态。意思就是,为了计算的简便,无论哪一种水果(无论体积大小),被切割后都是同样状态的两个子部分(在同一套公式下计算)飞行而落下。
假设(不考虑是否有意义),要适当增加这款游戏的一些物理真实性的话,可以复杂一下算法。可以加入玩家真实切割操作的反馈,并且对应这种反馈对应计算。那么在这种设计下,每个水果的属性配置表,就会相对要复杂一些了,除去上文中的重力相关参数字段,其他的配置属性可能如下表:(仅为个人设计,可能还有更多属性,仅供参考)
需要用到的公式:
- 重心计算公式:只需计算2维几何重心即可。(通过分割后的几何形状、体积、质量计算得出位置,)在此就不再列举出具体公式的计算过程了,百度即可。因为后面的旋转计算中,需要用到“重心”这个参数。(举例:如果切割掉香蕉的某个部位,真实情况下,很可能一部分的香蕉自身旋转着落下)。注意:重心可能在物体上,也可能在物体外哦。
- 受力分析公式:假设玩家的“切割”操作,是一种外力,那么可以赋予所有这种操作一个固定的外力值F,由于力的矢量性,因此可以根据玩家在不同角度划过屏幕的时候,做出不同的受力分析(玩家不同方向的切割,对水果的分裂状态变化也是不同的)。水果在分裂瞬间仅仅受力为两个:切割力F,重力mg。因此受力分析也是比较简单的,使用同一个公式即可实现
- 物体的自身旋转公式:玩家在切割的瞬间,水果具体分裂成哪两个(或多个)部分,是由玩家切割的位置和方向所决定的(可能1/2和1/2,也可能1/10和9/10)。两个分裂的部分,在受力的瞬间,都会受到一个“角速度加速度”,让物体发生自身的旋转(这个也是在真实世界中存在的现象,物体会围绕自己的重心进行旋转),物体的旋转角速度计算公式也是需要的。
在上述固定公式下,配合所有种类的水果的各项属性,基本可以较为真实的模拟出在“切水果”的过程中,被切割的每个水果会做出类似真实世界中的一些物理反馈。虽然对游戏本身的计算和输赢没有什么影响,但是至少会让玩家感觉更加真实一些。
数据存储