武器瞄准镜 - MOD和相关程序讲解
在拥有scope的武器的xml中,我们必须定义下面的标签(Tag)
<accessories> ... </accessories>
在上述的标签中,最重要的是下面这个子标签
<accessory name = "LAWScope">
<attach helper = "scope_term" layer = "">
<detach />
</accessory>
这个子标签定义了LAWScope(用作火箭筒上的瞄准镜)的位置信息,属性helper是个火箭筒的模型上的位置标记,通过这个标记,LAWScope可以跟火箭筒很好的组合成一个整体。
这个标记在标签<geometry>中可以看到,下面的<geometry>会讲述这个地方。
--
在游戏中,有scope的武器可以通过相应的键控制进入瞄准镜瞄准(注意这里后面的瞄准是动词)状态,在XML中,有相应的标签用来提供可配置的数据,该标签为
<zoommode name="Scope" type="Scope">
<zoom>
<param name="zoom_in_time" value=5>
<param name="zoom_out_time" value=0.2>
<param name="scope_offset" value="1, 1, 1">
</zoom>
<scope>
<param name="scope" value="scope">
</scope>
</zoommode>
上面标签的param参数中, zoom_in_time定义了开镜是镜头推进的速度,这个值越大,那么看到的镜头到位的动画就越慢(调试某些功能的时候可以用)。相反,Zoom_out_time定义了镜头收回的速度。
Scope_offset是一个很重要的值,它定义了在开镜后,最后游戏镜头要到达的最终的相对位置,这个相对位置是相对于武器模型的世界位置的。
在武器的XML中,标签<geometry>用来指定武器在各种状态下用到的模型,这里的状态指第一人称、第三人称模式。下面是一个例子:
<geometry>
<firstperson name="Objects/Weapons/Binoculars/binoculars_fp.chr"/>
<thirdperson name="Objects/Weapons/Binoculars/binoculars_tp.cgf"/>
</geometry>
上述的<firstperson>、<thirdperson>属性,分别对应于第一人称、第三人称下面的使用模型。这里必须指出的是,在第一人称下的模型跟第三人称下看到的一般是不一样的。这样做的是为了突出武器在第一人称下的效果。
<geometry>
<boneAttachment>
<attachment target="firstperson" name="scope_term" bone="scope_term" />
</boneAttachment>
</geometry>
这个<boneAttachment>中 name="scope_term"会把我们上面提到的<accessory>中的"scope_term"链接起来,这样在第一人称下面,accessory就能通过<accessory>中的helper跟该武器绑定。
--
在游戏中,开镜后的效果可以分成几段来讲,
首先,中心的圆框和十字准心,这个是通过HUD来实现,也就是2D的画面;
然后,我们能看到的火箭筒的圆筒,就是把相机放到火箭筒的scope的一端,往前看的效果。如果要看清楚这个过程,可以把上面讲过的zoom_in_time修改成大一点的数值,这样游戏镜头会有一个慢速推进的过程,我们就可以看到游戏镜头慢慢推向瞄准镜,最后到达我们最终看到的位置的整个过程。
最后的也是最复杂的部分,是瞄准的整个过程。这里做相应的讲述,
1,当我们拿了火箭筒在手上,然后按下鼠标右键。在CPlayerInput::OnAction()中,会得到"zoom"消息,OnAction()中会呼叫一定的函数,导致CWeapon::OnActionZoom()被调用。
CWeapon::OnActionZoom()中,会调用自己的CWeapon::StartZoom(),这里会判断该武器是否有Scope,有的话就会通过m_zm来调用m_zm的StartZoom()。
这里需要说明的是,m_zoom这里是一个CScope的实例,而CScope是一个CIronSight(额~,这里的意思是前者继承后者,如果你熟悉C++,你知道是一个意思)。
因为CScope并没有重载StartZoom()方法,因此CIronSight的StartZoom()方法被调用。
CIronSight::StartZoom(),开始就激活几个效果融合效果,然后调用EnterZoom(),这里要特别提到的是,送给EnterZoom()的参数中,有zoom_in_time。在整个引擎的初始化过程中,这个值就被相关的代码从XML读取兵放置到相关的变量中供读取。因此,在EnterZoom()中,主要的工作就在于把整个zoom过程的值都读取到位(当然有其他的工作需要做,但是我们这里只关心跟zoom in相关的)。
然后,在CScope::OnZoomStep()中,我们就可以看到每一帧对zoom过程的更新,这个关键值就是我们刚才提到的zoom_in_time,每一帧都会把这个值对比已经逝去的时间,来决定是否整个zoom过程是否结束。当然,每一帧镜头步进的方向,都是根据zoom_in_time和已经消逝的时间的比值,来乘以初始的方向值决定。这个方向值在上面的XML中有提到。
武器瞄准镜 - MOD和相关程序讲解相关推荐
- 计算机专业答辩讲什么,计算机专业毕业论文答辩的程序讲解
计算机专业毕业论文答辩的程序讲解 毕业论文答辩对毕业生来说是一种知识水平和表达能力的考验,下面是CN人才网为大家整理的计算机专业毕业论文答辩的程序讲解,欢迎参考~ 计算机专业毕业论文答辩的程序讲解 一 ...
- 嵌入式单片机基础篇(三十六)之STM32F1SPI标准接口程序以及模拟SPI标准接口程序讲解
STM32F1SPI标准接口程序以及模拟SPI标准接口程序讲解 一.SPI标准接口初始化: 1.SPI 内部结构简明图 2.上一篇文章提到,spi标准协议包含4条信号线.时钟相位.时钟极性.数据单字节 ...
- redis相关知识点讲解,redis面试题
redis相关知识点讲解,redis面试题 1. redis基本知识点 1.1 什么是redis? 1.2 redis的key的设计 1.3 redis的value数据类型有哪些? 1.3.1 str ...
- FANUC 宏程序 讲解 第一课
FANUC 宏程序 讲解 第一课 首先,先讲下自己的一些想法和看法,公众号搞了已经好多年了,一直没能用到正路,每天一直都是追剧打游戏,<自杀式>浪费仅有的几十年光阴,一直没有所醒悟,只到无 ...
- 基于DCMTK的DICOM相关程序编写攻略
2008年09月10日 星期三 15:35 基于DCMTK的DICOM相关程序编写攻略 前言: 由于现在的医学影像设备的图像存储和传输正在逐渐向DICOM标准靠拢,在我们进行医学图像处理的过程中,经常 ...
- 在ThinkPad W500 A98上升级Windows 7以及安装硬件驱动和相关程序(2/2)
在ThinkPad W500 A98上升级Windows 7以及安装硬件驱动和相关程序(2/2) 升级硬件固件 在安装了升级硬件固件所必要的驱动程序后,就可以升级硬件固件了,在下载的硬件驱动和相关程序 ...
- 电力期刊论文实现:微电网经济调度(程序讲解)
微电网经济调度(程序讲解) 代码图 本篇采用粒子群.遗传算法求解,其中的超参数(如惩罚项系数还没有调到最佳,也不想调试啦,不想给人直接白嫖).后期会写一版更好的寻优策略. 专栏解锁是解锁该专栏所有文章 ...
- 电气期刊论文实现:考虑斜坡约束、开停机时间约束的电力机组组合(程序讲解)
电气期刊论文实现:考虑斜坡约束.开停机时间约束的电力机组组合(程序讲解) 程序图 提示:个人电气博文目录链接:学好电气全靠它,个人电气博文目录(持续更新中-) 论文解锁是可以看这个专栏所有文章.一年时 ...
- 【转】基于DCMTK的DICOM相关程序编写攻略
转自:https://blog.csdn.net/jackmacro/article/details/5332654 零.前言: 由于现在的医学影像设备的图像存储和传输正在逐渐向DICOM标准靠拢,因 ...
最新文章
- 餐厅前台php,餐厅前台接听电话技巧
- 【LiveVideoStack采访】李备:音视频技术的难点与未来
- 类的构造器-init和new
- Python 数据分析三剑客之 Pandas(四):函数应用、映射、排序和层级索引
- NAT网关之SNAT进阶使用(二)构建ECS级别SNAT出网方式
- v8引擎和v12引擎_v8和v12发动机的区别
- java List转Map的三种方法(java8语法特性使用)
- vue的computed单向绑定(如淘宝的购物车中使用)
- Android中下载编译Volley
- 数据库备份与还原c#.net实现
- DirectSound---输出设备基本操作(枚举、查询等)
- vc如何画圆,并填充颜色
- vbs整人代码蓝屏_vbs整人程序大全
- win7原版系统安装及基本设置
- 基于DWM1000的UWB测距调试(一)
- 极客DIY:廉价电视棒玩转GNSS-SDR,实现GPS实时定位
- 简单粗暴卸载Oracle RAC
- Python3.5学习之旅——day5
- 如何把word文档转换成jpg图片
- 常用等价无穷小以及泰勒公式
热门文章
- STM32模拟I2C程序
- (开源)带有笔顺的字体
- 阿里研究院:2019企业数智化转型发展报告:无业务不数据,无数据不智能,无智能不商业...
- 中企海外周报 | 华为在西班牙启动Wi-Fi 6高校创新应用测试试点;爱奇艺人脸识别技术获全球学术会议认可...
- 潜望丨蔚来发布了喜忧参半的财报 与特斯拉的较量刚刚开始
- (附思维导图+笔记)-六面美团后,我发现大厂面试真的有“题库”!
- Autovue与后台的管理系统集成示例
- 小猪佩奇代码 Python
- 3dsmax 2019 插件开发要点
- canvas-樱花飘落