换枪的过程
来源:互联网 发布:深度系统优化工具 编辑:程序博客网 时间:2024/05/01 11:14
在游戏中,我们可以通过鼠标滚轮和相应的数字键进行换枪,这篇文章就鼠标滚轮时换枪进行一些解释。
第一步,我们可以关注CPlayerInput::OnAction()。当游戏进行中的时候,鼠标滚轮事件(向上、向下滚动一下)会经由ActionMapManager翻译成nextitem或者是previtem消息(事件),这样,CPlayerInput::OnAction()就会收到nextitem/previtem消息;
第二步,CPlayerInput::OnAction()方法(下面简称OnAction())会判断玩家是否处于使用一些瞄准镜的状态,这些状态下,换枪的动作会被过滤(就是不会被执行。因为该状态下,鼠标滚轮用来控制镜头的推进级数;如果没有被过滤,那么,OnAction()就会调用m_pPlayer::SelectNextItem()来正式进入换枪过程。
第三步,SelectNextItem()这个方法有三个参数,依次代表在包裹中搜索下一把枪的方向(顺序还是倒序)、是否需要记住最后一次的枪、以及枪的种类(这个参数是因为按下数字键后,枪能直接换成数字键对应的枪)。
在这个方法中,会首先过滤一些不能换枪的地方,包括:人物处于动画控制状态(过场动画(cutscene)、处于游泳状态、自由下落的状态)。
然后,从CActor::SelectNextItem()会被调用,依旧是上面提到的三个参数。大多数正式的事情其实都是在这个方法中调用,因此我们主要关注该方法中的流程,为了简便,我们把该方法简称为SelectNextItem(),记住,除非特殊申明,从现在看到的SelectNextItem()就是指CActor::SelectNextItem()。下面是,
第四步,SelectNextItem()会得到玩家的包裹指针(IInventory* pInventory = GetInventory());
由该包裹指针得到当前被选择的物体的ID(也就是拿在玩家手中或者是正在使用的物品,注意有些物品使用的时候,本地玩家并不会呈现出拿相关的物体的状态,这个时候,引擎不会保持上一个玩家拿物体的动作,而是换成一个空手动作);然后,根据这个得到的物品ID,程序可以找到该物品在包裹中的slot(插槽、格子),有了这个slot后,我们就得到了搜索的起始点。这里要注意的,slot是从0开始编号,跟包裹中所有slot的数量关系是:最后一个slot的编号是最大数量减去一。
然后,程序中会根据搜索的方向来搜索下一个或上一个可用的物品。相应的代码是:
slot = startSlot + direction;
itemId = pInventory->GetItem(slot);
pItem = m_pItemSystem->GetItem(itemId);
第一行代码是用当前的slot跟所谓的direction做加法,direction是1或者-1,表示不同的方向,这里是一个技巧;找到下一个或者说是上一个slot后,第二行代码马上就能从包裹中得到该slot放置的物品的id,有了物品ID,那么从item system中得到item就是第三行代码的事情。
有了我们查找到的物品的指针后,后面是事情就是让这个物品成为玩家的当前物品。这个由SelectItem()函数完成:
首先, 会把当前Actor的当前物品设置成我们刚才查找到的物品;
然后,会调用item的Select()接口,这个接口会通过一系列的调用,播放select该物品是要发生的动画和其他一些琐碎的事情。
到此,整个选枪的过程就结束了。在结束文章之前,读者可能会问那么数字键选枪有什么不同吗?答案是,大同小异。回头去看一下文章提到的“种类”参数,这个参数就是在整个流程中用来搜索的关键词,如果是数字键选枪,这个流程就是搜索的时候要多一个条件,必须是搜索到该参数表示的枪。其他逻辑都一样,走的代码流程也是一样的。
- 换枪的过程
- 网站永久换域名的处理过程
- 换个角度谈谈学习的过程
- 系统切换过程的数据库导换
- 从一次换机器的过程谈软硬件的分离
- 从一次换机器的过程谈软硬件的分离
- 换平台像是一个被强奸的过程
- 从win8换到CentOS的过程真艰难。
- iPhone5s 换电池、修右上角翘起的悲催过程
- 过程改进日记之学习Scrum2010-10-12:很好的实践-换位置
- oracle安装过程中无法换盘
- 环境换核过程命令总结
- 可变换的效果
- 换句话的范德萨范德萨
- 换dashboard 的背景图片
- 默默的换博客
- 换零钱的算法
- 简单的换肤
- sql server游标的Cursor for后面使用变量
- 为什么我不能用Windows Live Writer发文章了?
- 线段树模板
- 调试笔记:BSOD 0xA
- 顺便把1255也过了~~无压力~
- 换枪的过程
- 会员管理系统
- 英文VS2010安装中文版MSDN文档方法
- poj 1466 Girls and Boys (二分图最大独立集)
- TCP三次握手/四次挥手详解
- dom.loadXML() -- IE&FF 兼容问题(原文:http://www.ie0595.com/news/read.asp?id=152)
- poj1828
- 2011-10-17 sverlet的应用
- DoWhile0--华硕笔试题