游戏开发论坛

 找回密码
 立即注册
搜索
查看: 5173|回复: 0

[分享] 坦克类游戏弹道系统设计指导:命中与伤害判定

[复制链接]

1万

主题

1万

帖子

3万

积分

论坛元老

Rank: 8Rank: 8

积分
36572
发表于 2016-3-3 14:42:44 | 显示全部楼层 |阅读模式
d4nj5uxpn29ntqk6.jpg

  文/工头

  今天我们讲讲类似坦克世界这种仿真模拟的游戏,命中和伤害判定是怎么做的

  但是我估计各位看到这里的时候一定直接会说:直接物理运算啊!

  但是我要说一句:物理他奶奶个腿!

  首先这里边一共有两个东西

  1:炮弹

  2:被命中目标

  但是呢,会包含3个子系统

  1):飞行弹道

  2):命中判定

  3):伤害判定

  我们先来看第一个东西

  炮弹

  对于一个游戏来说,肯定会有很多的元素。比如,坦克起码二三十种吧,炮弹也有七八种吧。那么肯定不同的坦克,不同的炮弹,会有不同的散布,射程,穿深,等差异化表现

  这时候很多人就以为,这一定是一个很复杂的系统,参与管理的属性一定很多。比如什么炮弹质量啊,重力加速度啊,空气阻力啊,惯性啊,就差没有把北半球自转的角动惯量给加进去了。

  然后也有很多人直接就以为:用物理计算就好了呗。好吧,我先假设你要输入“物理计算”四个汉字,它就能给你自动物理计算了。但是这样你这么多炮弹和坦克还是得有差异,你还是得有不同的属性表现,你得有参数控制啊,你得想好哪些参数控制啊,哪怕你能列出重量直径长度密度重心等不同的参数都行啊

  我曾经多次强调一句话:策划,要用最简单的办法来处理最复杂的需求。

  因为如果你非要搞得很复杂,那么到时候你维护起来还不是得自找不自在。

  回到炮弹本身,我们回顾一下有多少差异化需要表现

  1:射程

  2:飞行速度

  3:命中散布

  4:穿深

  不同的游戏项目,对现实的拟真度是不一样的。比如坦克世界的拟真度就不是很高。现在我们尽量以更拟真的需求来做例子。

  首先是射程。

  这个其实很简单,抛物线在数轴上的前后端最大距离即可,可以用椭圆曲线,也可以用展弦公式,也可以用其他,这个可以看大家的爱好,因为这一块并不复杂,不同公式效率也没什么差别。

  接着,飞行速度

  现实中,炮口初速是衡量一门炮优劣的重要战术指标。但是大家也注意到了,这是“炮口”初速。因为炮弹在飞行过程中,由于空气阻力,减速效应是非常大的,比如现代坦克的破甲弹,炮口初速可能在1000米/S上下,但是当它飞到2000米的时候,速度会急剧下降到300米/S以下,而这才经过了多少时间?

  那游戏设计时,如果要模拟这个情况要怎么做?

  很简单,递减公式大家其实都很熟悉了。。对于速度的控制,直接用递减公式的参数就可以做出不同炮弹的飞行速度差异化,而不需要给每一种炮弹配置一套速度计算公式。

  比如速度V=Y-T*X

  V=速度

  Y=初速

  T=时间

  X=速度递减修正倍数参数

  不同的速度曲线只要修改X的值就可达到。

  这时候,我们得到第二个炮弹属性:速度递减参数。

  接下来,到了命中散布的问题。

  炮弹飞行像目标,肯定不会像CS一样一定命中你的十字准星正中间,而是有一定的散布范围。

  很明显,不同的炮和不同的弹药都有各自的散布属性。

  那么游戏设计时,如何让两者都起作用,而不互相冲突?

  首先大家都知道,炮有一个身管倍径的参数。这个长径比越长,炮弹的射程越远,速度越快。当然在动能的加持下,散布也会相应缩小一些。

  然后炮弹本身怎么办?炮弹也是有不同的散布的,因为不同的炮弹形状不同,飞行气动参数不同。

  于是,可以给炮弹绑定一个散布属性:散布半径。

  比如半径是30CM。那么以弹道轴线为圆心,半径30CM的圆内,随机出弹着点 。利用0.0坐标随机+-数值就可以得到四象限随机分布。由于炮并非连射武器,所以并不需要像FPS那样设计枪械连续弹着点那样去设计散布分布。(相信聪明的同学已经想到,这里可是个吸钱的好设定)

  这时候可能有人问,炮管的属性怎么办?炮管确实对炮弹散布有帮助。那么给炮管一个属性:增加或缩减炮弹的散布半径。

  就可以做到两者属性都起作用,又能最大限度的扩大差异化。

  第四个,穿深。

  这个问题需要对以上3个设定进行回顾。

  每一种炮弹都有各自的质量以及速度,也就是有不同的动能携带量,直接体现就是命中目标后的穿透能力。

  但是之前,炮弹经过了发射,飞行,直到命中目标。

  嗯,打是打上去了,但是我们依然还需要进行一次命中判定。

  有的坦克,比如炮弹,它是个半圆形,有的,则是很大角度的楔形。那么在现实中,是有可能发生跳弹的。

  这时候,就需要先判定有没有跳。这个,则需要进行炮弹和命中目标面的角度检查,当角度大于多少时,则发生跳弹。

  不过呢,二战时的坦克,有一种风帽穿甲弹,还有一种叫平头穿甲弹,这两种炮弹命中非垂直目标面时,会有自转正效应,也就是不会发生跳弹,反而会增加穿透的概率。

  那么这里又出现两个新属性

  1:炮弹类型,用于是否无视跳弹

  2:装甲厚度,用于判定是否穿透。

  但是第二个属性它并不是直接就参与作用。对于非垂直面,不发生跳弹的情况下,炮弹穿透装甲的过程是不一样的

QQ截图20160303144349.jpg


  不同角度下,穿透装甲所需要经过的行程是不同的

  所以,当炮弹类型属于无视跳弹 时,计算装甲厚度直接取值装甲自身厚度。

  当炮弹类型不属于无视跳弹,则根据三角函数计算要穿透的行程。

  这时候,一个新的问题出现了:没有跳弹,开始穿透了。那么是穿透了还是没穿透呢?

  这时候,我们需要更明确的炮弹属性:炮弹飞了这么久,还有多少战斗力?

  我们之前有了炮弹的速度参数,可以得到炮弹飞到目标前,速度还有多少。

  那么,我们还要增加一个炮弹的参数:质量。

  当然,这个质量并非真实的质量,只是一个用来做量化差异的参数。

  比如一个质量为10的的炮弹,速度还有700米/S。那么我们可以做一个简单的公式,两者相乘再除法。

  (10X700)/100=70  |举例

  来定义这枚炮弹还剩余穿透70毫米厚度装甲的能力。

  这时候回头检查装甲行程。如果小于70即可判定击穿,大于70则可判定未击穿

  击穿后的处理如何做?

  部位损伤,大家都很熟悉了。简单的子模块碰撞检测,炮弹碰到了,好损伤,相应功能失效。

  也可以给每一个子模块定义分值。类似血条世界那样当你分值扣完就GAME OVER

  回头来看,炮弹有多少属性呢?

  1:散布设定

  2:速度递减参数

  3:是否无视跳弹 是|或直接定义跳弹角度参数

  4:穿深质量参数

  是不是和大家最开始想的有很大不同?

  炮的属性

  1:散布属性加成

  2:射程

  3:转速

  4:装填速度

  到了被命中物体

  1:角度

  2:厚度

  3:不同材质的厚度效果加成

  4:子模块碰撞判定

  涉及到的数学公式

  1:抛物线|展弦|椭圆曲线  (任选)

  2:递减公式

  3:三角函数

  4:简单运算

  有人看完了可能会问,似乎漏了点什么?比如风偏。

  实际上由于坦克交战距离短,而炮弹自身动能极大,除非你在台风天里对几乎看不到的目标射击,否则以游戏中的可见交战距离来说意义并不大。

  当然,真要做的话也相当简单,只需要给炮弹套上一个位移BUFF即可。

  相关阅读如何设计捕鱼达人游戏中的死亡概率?

via:史晓林微信公众号

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-8-9 18:10

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表