本
文
摘
要
我来分享一点有意思的东西。 HL 是一座宝库, CS那两个创立人者非常了不起的做了很有创造性的扩展。 这套公式 扩展性很强,参数设置得当能够覆盖 几乎所有见到的 FPS 游戏 不同的枪械特性体现 和整体风格的偏向。 这是我自己在2006年底 对于 HL2 - CS - TF 体系的武器模拟学习笔记整理如下。 附带CS1.6 各种枪械在这个公式组中的参数值参考。 ***********************【2015-10-16注释:限于知识产权,用于游戏项目的文档和代码实现我就不放了,有兴趣探讨的朋友欢迎和我交流,我们钛金骑士团一直欢迎有志于FPS游戏事业的人才加入】 ===========================正文========================= A公式,跳动公式A,适用于 ak47,aug,famas,galil,m249,m4a1,mp5navy,p90,sg552,ump45 ---------------------------------------------- 每发射一发子弹瞬时上扬和侧偏的 绝对值: if (m_iShotsFired == 1) // This is the first round fired { flKickUp = up_base; flKickLateral = lateral_base; } else { flKickUp = up_base + m_iShotsFired*up_modifier; flKickLateral = lateral_base + m_iShotsFired*lateral_modifier; } 即 上扬 = 参数0 + (开火连射数 - 1) * 参数1 侧偏(绝对值) = 参数0 + (开火连射数 - 1) * 参数1 侧偏方向 的变换规则: if ( !SHARED_RANDOMINT( 0, direction_change ) ) m_iDirection = 1 - m_iDirection; 即 direction_change /(direction_change+1) 的概率 交换一下侧偏方向 ***********************【2015-10-16注释:这里是形成给墙一梭子倒“7”字或“T”字弹痕规律的原因,CS在这里很简单很酷的模拟了枪械射击时枪,射击者努力用胳膊控枪的作用下上跳和左右偏向的情况,通过给不同武器设置不同的 direction_change 可以模拟容易左右乱跳和容易控制不左右乱偏的枪械性能差别出来。 up_modifier 和 lateral_modifier 的大小决定了 整体后座大小, base 决定了第一枪的后座。 想模拟 AN94 那种头两枪弹道接近,后面才是传统AK系的快速上扬的效果可以 把 base给得足够小, up_modifier 适当大】 下面附上 CS 里各种枪在不同状态下 这几个参数的值 ----------------------------------------------------------------- 参数格式:从左到右,分别是 float float float float float float int up_base, lateral_base, up_modifier, lateral_modifier, up_max, lateral_max, direction_change 上扬参数0,侧偏参数0, 上扬参数1, 上扬参数1, 上扬最大值,侧偏最大值,左右方向改变概率 参数的性质都是角量,单位都是度 D:\Ref\hl2\src_main\game_shared\cstrike\weapon_ak47.cpp(90): KickBack ( 1.5, 0.45, 0.225, 0.05, 6.5, 2.5, 7 ); //(蹲跳站所有姿态)移动中(走跑一样) D:\Ref\hl2\src_main\game_shared\cstrike\weapon_ak47.cpp(92): KickBack ( 2, 1.0, 0.5, 0.35, 9, 6, 5 ); //空中 D:\Ref\hl2\src_main\game_shared\cstrike\weapon_ak47.cpp(94): KickBack ( 0.9, 0.35, 0.15, 0.025, 5.5, 1.5, 9 ); //蹲下(静止) D:\Ref\hl2\src_main\game_shared\cstrike\weapon_ak47.cpp(96): KickBack ( 1, 0.375, 0.175, 0.0375, 5.75, 1.75, 8 ); //站立(静止) D:\Ref\hl2\src_main\game_shared\cstrike\weapon_aug.cpp(144): KickBack ( 1, 0.45, 0.275, 0.05, 4, 2.5, 7 ); //(蹲跳站所有姿态)移动中(走跑一样) D:\Ref\hl2\src_main\game_shared\cstrike\weapon_aug.cpp(147): KickBack ( 1.25, 0.45, 0.22, 0.18, 5.5, 4, 5 ); //空中 D:\Ref\hl2\src_main\game_shared\cstrike\weapon_aug.cpp(150): KickBack ( 0.575, 0.325, 0.2, 0.011, 3.25, 2, 8 ); //蹲下(静止) D:\Ref\hl2\src_main\game_shared\cstrike\weapon_aug.cpp(153): KickBack ( 0.625, 0.375, 0.25, 0.0125, 3.5, 2.25, 8 );//站立(静止) D:\Ref\hl2\src_main\game_shared\cstrike\weapon_famas.cpp(304): KickBack ( 1, 0.45, 0.275, 0.05, 4, 2.5, 7 ); //(蹲跳站所有姿态)移动中(走跑一样) D:\Ref\hl2\src_main\game_shared\cstrike\weapon_famas.cpp(307): KickBack ( 1.25, 0.45, 0.22, 0.18, 5.5, 4, 5 ); //空中 D:\Ref\hl2\src_main\game_shared\cstrike\weapon_famas.cpp(310): KickBack ( 0.575, 0.325, 0.2, 0.011, 3.25, 2, 8 ); //蹲下(静止) D:\Ref\hl2\src_main\game_shared\cstrike\weapon_famas.cpp(313): KickBack ( 0.625, 0.375, 0.25, 0.0125, 3.5, 2.25, 8 );//站立(静止) D:\Ref\hl2\src_main\game_shared\cstrike\weapon_galil.cpp(117): KickBack (1.0, 0.45, 0.28, 0.045, 3.75, 3, 7); //(蹲跳站所有姿态)移动中(走跑一样) D:\Ref\hl2\src_main\game_shared\cstrike\weapon_galil.cpp(119): KickBack (1.2, 0.5, 0.23, 0.15, 5.5, 3.5, 6); //空中 D:\Ref\hl2\src_main\game_shared\cstrike\weapon_galil.cpp(121): KickBack (0.6, 0.3, 0.2, 0.0125, 3.25, 2, 7); //蹲下(静止) D:\Ref\hl2\src_main\game_shared\cstrike\weapon_galil.cpp(123): KickBack (0.65, 0.35, 0.25, 0.015, 3.5, 2.25, 7); //站立(静止) D:\Ref\hl2\src_main\game_shared\cstrike\weapon_m249.cpp(112): KickBack (1.8, 0.65, 0.45, 0.125, 5, 3.5, 8); //(蹲跳站所有姿态)移动中(走跑一样) D:\Ref\hl2\src_main\game_shared\cstrike\weapon_m249.cpp(115): KickBack (1.1, 0.5, 0.3, 0.06, 4, 3, 8); //空中 D:\Ref\hl2\src_main\game_shared\cstrike\weapon_m249.cpp(118): KickBack (0.75, 0.325, 0.25, 0.025, 3.5, 2.5, 9); //蹲下(静止) D:\Ref\hl2\src_main\game_shared\cstrike\weapon_m249.cpp(121): KickBack (0.8, 0.35, 0.3, 0.03, 3.75, 3, 9); //站立(静止) D:\Ref\hl2\src_main\game_shared\cstrike\weapon_m4a1.cpp(149): KickBack (1.0, 0.45, 0.28, 0.045, 3.75, 3, 7); //(蹲跳站所有姿态)移动中(走跑一样) D:\Ref\hl2\src_main\game_shared\cstrike\weapon_m4a1.cpp(151): KickBack (1.2, 0.5, 0.23, 0.15, 5.5, 3.5, 6); //空中 D:\Ref\hl2\src_main\game_shared\cstrike\weapon_m4a1.cpp(153): KickBack (0.6, 0.3, 0.2, 0.0125, 3.25, 2, 7); //蹲下(静止) D:\Ref\hl2\src_main\game_shared\cstrike\weapon_m4a1.cpp(155): KickBack (0.65, 0.35, 0.25, 0.015, 3.5, 2.25, 7); //站立(静止) D:\Ref\hl2\src_main\game_shared\cstrike\weapon_mac10.cpp(108): KickBack (1.3, 0.55, 0.4, 0.05, 4.75, 3.75, 5); //(蹲跳站所有姿态)移动中(走跑一样) D:\Ref\hl2\src_main\game_shared\cstrike\weapon_mac10.cpp(110): KickBack (0.9, 0.45, 0.25, 0.035, 3.5, 2.75, 7); //空中 D:\Ref\hl2\src_main\game_shared\cstrike\weapon_mac10.cpp(112): KickBack (0.75, 0.4, 0.175, 0.03, 2.75, 2.5, 10); //蹲下(静止) D:\Ref\hl2\src_main\game_shared\cstrike\weapon_mac10.cpp(114): KickBack (0.775, 0.425, 0.2, 0.03, 3, 2.75, 9); //站立(静止) D:\Ref\hl2\src_main\game_shared\cstrike\weapon_mp5navy.cpp(111): KickBack (0.9, 0.475, 0.35, 0.0425, 5, 3, 6); //(蹲跳站所有姿态)移动中(走跑一样) D:\Ref\hl2\src_main\game_shared\cstrike\weapon_mp5navy.cpp(113): KickBack (0.5, 0.275, 0.2, 0.03, 3, 2, 10); //空中 D:\Ref\hl2\src_main\game_shared\cstrike\weapon_mp5navy.cpp(115): KickBack (0.225, 0.15, 0.1, 0.015, 2, 1, 10); //蹲下(静止) D:\Ref\hl2\src_main\game_shared\cstrike\weapon_mp5navy.cpp(117): KickBack (0.25, 0.175, 0.125, 0.02, 2.25, 1.25, 10);//站立(静止) D:\Ref\hl2\src_main\game_shared\cstrike\weapon_p90.cpp(122): KickBack (0.9, 0.45, 0.35, 0.04, 5.25, 3.5, 4); //(蹲跳站所有姿态)移动中(走跑一样) D:\Ref\hl2\src_main\game_shared\cstrike\weapon_p90.cpp(124): KickBack (0.45, 0.3, 0.2, 0.0275, 4, 2.25, 7); //空中 D:\Ref\hl2\src_main\game_shared\cstrike\weapon_p90.cpp(126): KickBack (0.275, 0.2, 0.125, 0.02, 3, 1, 9); //蹲下(静止) D:\Ref\hl2\src_main\game_shared\cstrike\weapon_p90.cpp(128): KickBack (0.3, 0.225, 0.125, 0.02, 3.25, 1.25, 8); //站立(静止) D:\Ref\hl2\src_main\game_shared\cstrike\weapon_sg552.cpp(142): KickBack (1, 0.45, 0.28, 0.04, 4.25, 2.5, 7); //(蹲跳站所有姿态)移动中(走跑一样) D:\Ref\hl2\src_main\game_shared\cstrike\weapon_sg552.cpp(144): KickBack (1.25, 0.45, 0.22, 0.18, 6, 4, 5); //空中 D:\Ref\hl2\src_main\game_shared\cstrike\weapon_sg552.cpp(146): KickBack (0.6, 0.35, 0.2, 0.0125, 3.7, 2, 10); //蹲下(静止) D:\Ref\hl2\src_main\game_shared\cstrike\weapon_sg552.cpp(148): KickBack (0.625, 0.375, 0.25, 0.0125, 4, 2.25, 9); //站立(静止) D:\Ref\hl2\src_main\game_shared\cstrike\weapon_ump45.cpp(111): KickBack (0.125, 0.65, 0.55, 0.0475, 5.5, 4, 10); //(蹲跳站所有姿态)移动中(走跑一样) D:\Ref\hl2\src_main\game_shared\cstrike\weapon_ump45.cpp(113): KickBack (0.55, 0.3, 0.225, 0.03, 3.5, 2.5, 10); //空中 D:\Ref\hl2\src_main\game_shared\cstrike\weapon_ump45.cpp(115): KickBack (0.25, 0.175, 0.125, 0.02, 2.25, 1.25, 10); //蹲下(静止) D:\Ref\hl2\src_main\game_shared\cstrike\weapon_ump45.cpp(117): KickBack (0.275, 0.2, 0.15, 0.0225, 2.5, 1.5, 10); //站立(静止) B公式,跳动公式B,适用于 FiveSeven,Glock,USP,SCOUT,AWP,DEagle ---------------------------------------------- 每发射一发子弹瞬时上扬一个角度常量, 而且不侧偏 各枪参数值: FiveSeven: angle.x -= 2; Glock: 不上跳 p228: angle.x -= 2; usp: angle.x -= 2; SCOUT: angle.x -= 2; C公式, 跳动公式C, 适用于 散弹枪 M3,Xm ---------------------------------------------- 每发射一发子弹瞬时上扬一个随机角度, 而且不侧偏 angle.x -= !(pPlayer->GetFlags() & FL_ONGROUND ) ? SHARED_RANDOMINT( 8, 11 ) : SHARED_RANDOMINT( 4, 6 ); 即 M3 单发散弹枪:SHARED_RANDOMINT( 8, 11 ) XM 连发散弹枪:SHARED_RANDOMINT( 4, 6 ) D公式, 跳动公式D, 适用于 连狙 SG550, ------------------------------------------ 每发射一发子弹瞬时上扬一个随机角度, 同时侧偏一个随机角度 各枪参数: SG550: angle.x -= SHARED_RANDOMFLOAT( 1.5, 1.75 ) + ( angle.x / 4 ); angle.y += SHARED_RANDOMFLOAT( -1, 1 ); G3SG1: angle.x -= SHARED_RANDOMFLOAT( 2.75, 3.25) + ( angle.x / 4 ); angle.y += SHARED_RANDOMFLOAT( -1.25, 1.5);