java解析魔兽争霸3录像_Java解析魔兽争霸3录像W3G文件(五):Action和APM计算

本文介绍了如何使用Java解析魔兽争霸3录像文件中的Action和计算APM。Action包括暂停游戏、编队等操作,APM反映了玩家的操作速度。通过解析录像数据块,区分有效Action并排除暂停游戏等因素,可以准确计算每个玩家的APM。文章提供了详细的代码实现,涉及ActionBlock结构解析和APM计算方法。
摘要由CSDN通过智能技术生成

在游戏进行中,玩家会进行各种操作,例如编队、移动、技能、造建筑等,这些操作就是Action。APM(Actions Per Minute),表示每分钟的操作次数,APM可以很好的反映玩家的手速和实力,当然也有高APM的菜鸟和低APM的高手。

在魔兽录像文件中,需要记录下玩家的操作,这些操作是记录在游戏时间段(TimeSlot)数据块中的,这在上一篇博文中有提到。

结构:

在TimeSlot中从第6字节开始到数据块结尾的部分,包含多个玩家数据块(CommandData Block):

1字节:玩家ID;

2~3字节:数据块剩余字节数n;

4~n+4字节:包含该玩家对应的多个操作数据块(ActionBlock)。

ActionBlock结构:

1字节:ActionID,表示操作类型,例如暂停游戏操作的ActionID是0x01;

剩余字节:Action参数,该部分结构需要根据ActionID来确定,有些Action没有这部分。

由于Action类型很多,每种ActionID对应的ActionBlock结构这里不一一列出,下面列出一小部分:

1.暂停游戏

ActionID:0x01

字节数:1

计算APM:否

2.继续游戏

ActionID:0x02

字节数:1

计算APM:否

3.编队

ActionID:0x17

字节数:4+n*8

计算APM:是

结构:

1字节:ActionID;

2字节:队伍编号(0~9);

3~4字节:选择单位的数量n;

5~4+n*8:选择单位

4.选择编队

ActionID:0x18

字节数:3

计算APM:是

结构:

1字节:ActionID;

2字节:队伍编号(0~9);

3字节:未知0x03

APM计算:

由于暴雪官方并没有提供APM的计算方式,所以APM计算的方式都是前辈牛人们总结出来的,不同的录像分析软件算出来的APM可能会有一些误差。

APM的值等于玩家的有效Action数量除以玩家游戏时间的分钟数。

一个ActionBlock一般表示玩家的一次操作,例如一次编队、暂停游戏。其中部分操作要算入APM中,例如编队,而有些操作不计算APM,例如暂停游戏。另外,还有的ActionBlock是自动生成的,也不算入APM。Action是否算入APM可以查看文档w3g_actions.txt。

其中比较特殊的有ActionID为0x16的Action。这个Action表示选择或取消选择。ActionBlock的第二个字节为0x01表示选择,0x02表示取消选择。一般来说这个Action是算入APM的,但是如果两个相邻的ActionID为0x16的ActionBlock,前一个为取消选择,后一个为选择,那么这两个ActionBlock只算一次有效的Action,因为前一个是自动生成的。

在游戏进行过程中,可能会有玩家暂停游戏的情况,也有玩家在游戏结束前提前退出游戏的情况。在计算APM的时候一定要去掉这部分的时间,这样算出来的APM才准确。

下面的截图就是RepKing录像分析软件没有考虑游戏暂停导致的问题,导致玩家游戏时间大于录像的时长,APM计算不准确。

0818b9ca8b590ca3270a3433284dd417.png

Java解析Action和APM:

在Player.java中加入action表示玩家的有效操作数:

/**

* 操作次数

*/

private int action;

public int getAction() {

return action;

}

public void setAction(int action){

this.action = action;

}在ReplayData.java中,加入对Action的解析,在ReplayData中加入isPause表示游戏是否暂停,在游戏暂停时游戏时间不能增加:

/**

* 是否暂停

*/

private boolean isPause;

/**

* 解析一个时间块

*/

private void analysisTimeSlot() {

offset++;

int bytes = LittleEndianTool.getUnsignedInt16(uncompre

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值