在拥有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和相关程序讲解相关推荐

  1. 计算机专业答辩讲什么,计算机专业毕业论文答辩的程序讲解

    计算机专业毕业论文答辩的程序讲解 毕业论文答辩对毕业生来说是一种知识水平和表达能力的考验,下面是CN人才网为大家整理的计算机专业毕业论文答辩的程序讲解,欢迎参考~ 计算机专业毕业论文答辩的程序讲解 一 ...

  2. 嵌入式单片机基础篇(三十六)之STM32F1SPI标准接口程序以及模拟SPI标准接口程序讲解

    STM32F1SPI标准接口程序以及模拟SPI标准接口程序讲解 一.SPI标准接口初始化: 1.SPI 内部结构简明图 2.上一篇文章提到,spi标准协议包含4条信号线.时钟相位.时钟极性.数据单字节 ...

  3. redis相关知识点讲解,redis面试题

    redis相关知识点讲解,redis面试题 1. redis基本知识点 1.1 什么是redis? 1.2 redis的key的设计 1.3 redis的value数据类型有哪些? 1.3.1 str ...

  4. FANUC 宏程序 讲解 第一课

    FANUC 宏程序 讲解 第一课 首先,先讲下自己的一些想法和看法,公众号搞了已经好多年了,一直没能用到正路,每天一直都是追剧打游戏,<自杀式>浪费仅有的几十年光阴,一直没有所醒悟,只到无 ...

  5. 基于DCMTK的DICOM相关程序编写攻略

    2008年09月10日 星期三 15:35 基于DCMTK的DICOM相关程序编写攻略 前言: 由于现在的医学影像设备的图像存储和传输正在逐渐向DICOM标准靠拢,在我们进行医学图像处理的过程中,经常 ...

  6. 在ThinkPad W500 A98上升级Windows 7以及安装硬件驱动和相关程序(2/2)

    在ThinkPad W500 A98上升级Windows 7以及安装硬件驱动和相关程序(2/2) 升级硬件固件 在安装了升级硬件固件所必要的驱动程序后,就可以升级硬件固件了,在下载的硬件驱动和相关程序 ...

  7. 电力期刊论文实现:微电网经济调度(程序讲解)

    微电网经济调度(程序讲解) 代码图 本篇采用粒子群.遗传算法求解,其中的超参数(如惩罚项系数还没有调到最佳,也不想调试啦,不想给人直接白嫖).后期会写一版更好的寻优策略. 专栏解锁是解锁该专栏所有文章 ...

  8. 电气期刊论文实现:考虑斜坡约束、开停机时间约束的电力机组组合(程序讲解)

    电气期刊论文实现:考虑斜坡约束.开停机时间约束的电力机组组合(程序讲解) 程序图 提示:个人电气博文目录链接:学好电气全靠它,个人电气博文目录(持续更新中-) 论文解锁是可以看这个专栏所有文章.一年时 ...

  9. 【转】基于DCMTK的DICOM相关程序编写攻略

    转自:https://blog.csdn.net/jackmacro/article/details/5332654 零.前言: 由于现在的医学影像设备的图像存储和传输正在逐渐向DICOM标准靠拢,因 ...

最新文章

  1. 餐厅前台php,餐厅前台接听电话技巧
  2. 【LiveVideoStack采访】李备:音视频技术的难点与未来
  3. 类的构造器-init和new
  4. Python 数据分析三剑客之 Pandas(四):函数应用、映射、排序和层级索引
  5. NAT网关之SNAT进阶使用(二)构建ECS级别SNAT出网方式
  6. v8引擎和v12引擎_v8和v12发动机的区别
  7. java List转Map的三种方法(java8语法特性使用)
  8. vue的computed单向绑定(如淘宝的购物车中使用)
  9. Android中下载编译Volley
  10. 数据库备份与还原c#.net实现
  11. DirectSound---输出设备基本操作(枚举、查询等)
  12. vc如何画圆,并填充颜色
  13. vbs整人代码蓝屏_vbs整人程序大全
  14. win7原版系统安装及基本设置
  15. 基于DWM1000的UWB测距调试(一)
  16. 极客DIY:廉价电视棒玩转GNSS-SDR,实现GPS实时定位
  17. 简单粗暴卸载Oracle RAC
  18. Python3.5学习之旅——day5
  19. 如何把word文档转换成jpg图片
  20. 常用等价无穷小以及泰勒公式

热门文章

  1. STM32模拟I2C程序
  2. (开源)带有笔顺的字体
  3. 阿里研究院:2019企业数智化转型发展报告:无业务不数据,无数据不智能,无智能不商业...
  4. 中企海外周报 | 华为在西班牙启动Wi-Fi 6高校创新应用测试试点;爱奇艺人脸识别技术获全球学术会议认可...
  5. 潜望丨蔚来发布了喜忧参半的财报 与特斯拉的较量刚刚开始
  6. (附思维导图+笔记)-六面美团后,我发现大厂面试真的有“题库”!
  7. Autovue与后台的管理系统集成示例
  8. 小猪佩奇代码 Python
  9. 3dsmax 2019 插件开发要点
  10. canvas-樱花飘落