换枪的过程

来源:互联网 发布:深度系统优化工具 编辑:程序博客网 时间: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该物品是要发生的动画和其他一些琐碎的事情。

到此,整个选枪的过程就结束了。在结束文章之前,读者可能会问那么数字键选枪有什么不同吗?答案是,大同小异。回头去看一下文章提到的“种类”参数,这个参数就是在整个流程中用来搜索的关键词,如果是数字键选枪,这个流程就是搜索的时候要多一个条件,必须是搜索到该参数表示的枪。其他逻辑都一样,走的代码流程也是一样的。


原创粉丝点击