去评论
TC辅助网

FPS的后坐力研究探讨,HYXD中实践。

Ysjt、凌何
2019/08/11 19:56:26
发贴前我特意问过某超版,只做技术讨论,不发布软件,就不违规。

本贴全手打,部分学习借鉴的,部分自己领悟的,旨在学习讨论,请勿用于非法用途。

1:FPS游戏中后坐力,FOV视野的范围和变化
FOV即第1人称视角范围场,FPS中常见的是90度。
在空间系中,坐标是三维的,我们学习过坐标分xy,这是二维坐标。
但在三维空间中,坐标是xyz,即空间中的高横向,纵向。高度。

在CS中,后坐力最开始是没有的,后来为了仿真,各种演化版的游戏都有后坐力。
比如某鹅,为了赚钱,表现枪械的好坏,鼓励大家买好枪,在这方面做的额外明显。

2:开枪后视角的变化(后坐力影响了什么?)
所谓枪法,对枪械了解,一定要知道后坐力的范围。

假设你拿棍子打了版主,棍子会跳一下,弹一下,这也是后坐力(反正我不敢打版主)。
可是FPS中,后坐力不仅会影响枪械的标准位置,甚至还会影响视野,还会影响瞄准点的变化。
(不然火麒麟怎么卖钱?)
所以如果你用易语言开发游戏,想赚钱一定要搞后坐力,再卖个888的龙麒麟步枪,这样才行啊!

那么,开始说正事。
目前荒野行动中,后坐力分4大部分。通用大部分FPS,但不绝对。
1:开枪后,瞄准位置会变化(普通开枪和开镜开枪不一样)。
2:开枪后,视野会重置,固定下移(狙)。固定上移(步枪)。
3:开镜后,FOV会变化,和最初的FOV(视野角度)值不同。
4:开枪后,视野回弹,枪械瞄准位置回弹,这里一般是固定范围+随机值。
虽然听起来很绕,我实践中也很绕。但还是有区别的。
技术在进步,FPS中如果少了一个环节,就无法实现后坐力了。

3:如何定位后坐力call,如何找到指针及内存指令。
最常见的是根据FOV值定位,然后看FOV变化,根据访问代码,跟踪到指令。
以某游戏为例:(基址是别人找的,大家请自行百度,本贴只做学习研究)




假设我们要提高初始视野高度值,定位到三维空间系中的Z轴,即相机竖向高度。
科普下,FPS中的相机是什么:假设你的眼睛就是个相机,如果你站高点,相机高度就提高了。
在CE中,我们得知,movss(单精度数,在易语言中是小数,在CE中是浮点数)赋值给xmm0,地址为 ebp-38

按照传统的办法,我们需要找到ebp,并且修改他的值,然后他就会返回这个值给xmm0。
但前面讲了,技术在进步。这里我给大家讲一个简单粗暴的易语言实现。字节操作。
比如我们要汇编其代码,改为  mov [ebp-38], (float)5.0  意思 是 将ebp-38的值定义为 浮点数5.0 即float型。
那么,就实现了效果,相机提高了5个单位,每个单位是1米(常见FPS中浮点值 1=1米)。

2:禁用后坐力回弹

根找到的基指,我们可以看到内存中,有2个值。xmm2,xmm1

这里开始讲重点!  用易语言实现改他的汇编指令。
我们用一种简单粗暴的办法!  nop填充,让他什么值都没有!
从228741-228747  给他全部填充nop会发生什么?



这里回弹功能也做了恢复,如果禁止回弹,那么还是简单粗暴的办法,填充nop。


总结:
本次文字教程,旨在学习,如果讲的不好,你来打我啊?
这里面只讲了实现无后坐的2个功能实现,还有2个没搞定
等4个齐全了,就可以解决子弹打的不固定+后坐力问题。
我喜欢讲原理,虽然我理解的也不深。
不要问我怎么找的这个基址,自己去尝试搜索,老是拿成品不好。
在此,感谢某位基佬的指点。