本节课中,我们要做的就是调试第一节课中分析的数据。
首先我们需要打开新建项目->win32控制台程序->静态库;添加一个静态库,然后在库中添加一个基类来保存数据基址,然后创建一个派生类来保存人物角色属性。
在派生类中添加数据偏移管理单元
具体代码如下:
#include<Windows.h>
class BaseData
{
public:
BaseData();
~BaseData();
DWORD GetBaseRoleAddr();
private:
const DWORD BaseRoleAddr = 0x2F9D4D0;
};
class RoleData :public BaseData
{
public:
RoleData();
~RoleData();
char *GetRoleName(); //获取人物名字
char *GetRoleFame(); //获取人物名声
int GetHp(); //获取HP
int GetMp(); //获取内功
int GetAngry();//获取愤怒值
int GetMaxHp();//获取最大HP
int GetMaxMp();//获取最大内功
int GetMaxAngry();//获取最大愤怒值
int GetExp(); //获取经验值
int GetMaxExp();//获取最大经验值
int GetHeart(); //获取心
int GetBody();//获取体
int GetAir();//获取气
int GetSoul();//获取魂
int GetAttack();//获取攻击力
int GetDefense();//获取防御力
int GetHit();//获取命中
int GetAvoid();//获取回避
private:
DWORD NameOffset = 0x0;//名字偏移
DWORD fameOffset = 0x36; //名声偏移
DWORD HPOffset = 0x80;//hp偏移
DWORD MPOffset = 0x84; //内功偏移
DWORD AngryOffset = 0x88; //当前愤怒值偏移
DWORD MaxHpOffset = 0x8c; //最大HP
DWORD MaxMpOffset = 0x90; //最大内功值
DWORD MaxAngryOffset = 0x94; //最大愤怒值
DWORD ExpOffset = 0x98;//当前经验值
DWORD MaxExpOffset = 0xa0; //最大经验值
DWORD HeartOffset = 0xb0; //心
DWORD BodyOffset = 0xb4; //体
DWORD AirOffset = 0xb8; //气
DWORD SoulOffset = 0xbc; //魂
DWORD AttackOffset = 0xc8; //攻击
DWORD DefenseOffset = 0xcc;//防御
DWORD HitOffset = 0xd0; //命中
DWORD AvoidOffset = 0xd4; //回避
};
#include"BaseGameData.h"
BaseData::BaseData()
{
}
BaseData::~BaseData()
{
}
RoleData::RoleData(){
}
RoleData::~RoleData(){
}
DWORD BaseData::GetBaseRoleAddr(){
return BaseRoleAddr;
}
//获取人物名字
char* RoleData::GetRoleName(){
return (char*)(this->GetBaseRoleAddr() + NameOffset);
}
//获取人物名声
char *RoleData::GetRoleFame(){
return (char*)(this->GetBaseRoleAddr() + fameOffset);
}
//获取HP
int RoleData::GetHp(){
return *(DWORD*)(this->GetBaseRoleAddr() + HPOffset);
}
//获取内功
int RoleData::GetMp(){
return *(DWORD*)(this->GetBaseRoleAddr() + MPOffset);
}
//获取愤怒值
int RoleData::GetAngry(){
return *(DWORD*)(this->GetBaseRoleAddr() + AngryOffset);
}
//获取最大HP
int RoleData::GetMaxHp(){
return *(DWORD*)(this->GetBaseRoleAddr() + MaxHpOffset);
}
//获取最大内功
int RoleData::GetMaxMp(){
return *(DWORD*)(this->GetBaseRoleAddr() + MaxMpOffset);
}
//获取最大愤怒值
int RoleData::GetMaxAngry(){
return *(DWORD*)(this->GetBaseRoleAddr() + MaxAngryOffset);
}
//获取经验值
int RoleData::GetExp(){
return *(DWORD*)(this->GetBaseRoleAddr() + ExpOffset);
}
//获取最大经验值
int RoleData::GetMaxExp(){
return *(DWORD*)(this->GetBaseRoleAddr() + MaxExpOffset);
}
//获取心
int RoleData::GetHeart(){
return *(DWORD*)(this->GetBaseRoleAddr() + HeartOffset);
}
//获取体
int RoleData::GetBody(){
return *(DWORD*)(this->GetBaseRoleAddr() + BodyOffset);
}
//获取气
int RoleData::GetAir(){
return *(DWORD*)(this->GetBaseRoleAddr() + AirOffset);
}
//获取魂
int RoleData::GetSoul(){
return *(DWORD*)(this->GetBaseRoleAddr() + SoulOffset);
}
//获取攻击力
int RoleData::GetAttack(){
return *(DWORD*)(this->GetBaseRoleAddr() + AttackOffset);
}
//获取防御力
int RoleData::GetDefense(){
return *(DWORD*)(this->GetBaseRoleAddr() + DefenseOffset);
}
//获取命中
int RoleData::GetHit(){
return *(DWORD*)(this->GetBaseRoleAddr() + HitOffset);
}
//获取回避
int RoleData::GetAvoid(){
return *(DWORD*)(this->GetBaseRoleAddr() + AvoidOffset);
}
以上代码就完成了对游戏数据的封装,然后在对话框中添加一起test按钮来测试数据 ,具体代码如下:
void CMainDialog::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
pRoleData = new RoleData();
TRACE("Game:人物名称:%s\r\n", BaseRoleAddr);
TRACE("Game:人物名称:%s\r\n", pRoleData->GetRoleName());
TRACE("Game:人物名声:%s\r\n", pRoleData->GetRoleFame());
TRACE("Game:HP/MAXHP = %d / %d\r\n", pRoleData->GetHp(), pRoleData->GetMaxHp());
TRACE("Game:MP/MAXMP = %d / %d\r\n", pRoleData->GetMp(), pRoleData->GetMp());
TRACE("Game:愤怒值:%f \r\n", pRoleData->GetAngry()/pRoleData->GetMaxAngry());
TRACE("Game:经验值:%f \r\n", pRoleData->GetExp() / pRoleData->GetMaxExp());
TRACE("Game:心:%d\r\n", pRoleData->GetHeart());
TRACE("Game:体:%d\r\n", pRoleData->GetBody());
TRACE("Game:气:%d\r\n", pRoleData->GetAir());
TRACE("Game:魂:%d\r\n", pRoleData->GetSoul());
TRACE("Game:攻击:%d\r\n", pRoleData->GetAttack());
TRACE("Game:防御:%d\r\n", pRoleData->GetDefense());
TRACE("Game:命中:%d\r\n", pRoleData->GetHit());
TRACE("Game:闪避:%d\r\n", pRoleData->GetAvoid());
}
以上代码就完成了对所有数据的测试,还有就是测试要用到的工具是DEBUGVIEW,百度云盘下载地址:第四课的源码:调试获取到的人物数据及工具