文章目录
之前我们已经完成了自动打怪,自动技能和自动吃药的功能。接下来需要实现自动任务。那么现在就会遇到这么一个问题,大部分的任务都是指定去打某些怪物,但是我们的自动打怪都是默认攻击最近的怪物,这里就需要用到怪物过滤的功能了。
怪物过滤的设计
新建一个类,命名为MonsterFilter
//过滤的列表
vector<wstring> m_FilterList;
首先准备一个过滤的怪物列表,把不需要攻击的怪物放到这个列表里 。
//攻击的列表
vector<wstring> m_AttackList;
然后准备一个攻击的怪物列表,把需要攻击的怪物全部存放到这个容器里。两个列表是互斥的,如果设置了过滤列表就不使用攻击列表;设置了攻击列表就不使用过滤列表。
//添加攻击列表
void AddAttackList(wstring MonsterName);
//添加过滤列表
void AddFilterList(wstring MonsterName);
然后声明两个函数,一个添加攻击列表,一个添加过滤列表。
//刷新匹配的怪物
void UpdateMonsters(_stuObjs& MonsterList);
然后准备一个函数用来刷新怪物列表,把不满足条件的怪物 删除。这个列表需要被实时修改,所以传入引用。
//清空所有数据
void ClearAllData();
再准备一个函数用来清空所有数据。MonsterFilter.h
完整代码如下:
#pragma once
#include "pch.h"
class MonsterFilter
{
public:
//添加攻击列表
void AddAttackList(wstring MonsterName);
//添加过滤列表
void AddFilterList(wstring MonsterName);
//刷新匹配的怪物
void UpdateMonsters(_stuObjs& MonsterList);
//清空所有数据
void ClearAllData();
public:
//过滤的列表
vector<wstring> m_FilterList;
//攻击的列表
vector<wstring> m_AttackList;
};
代码实现
//添加攻击列表
void MonsterFilter::AddAttackList(wstring MonsterName)
{
//遍历攻击列表
for (auto obj: m_AttackList)
{
//如果当前容器中已经有需要添加的怪物 直接退出
if (obj== MonsterName)
{
return;
}
}
//如果没有在容器中找到需要攻击的怪物 则添加到容器
m_AttackList.push_back(MonsterName);
}
//添加过滤列表
void MonsterFilter::AddFilterList(wstring MonsterName)
{
//遍历攻击列表
for (auto obj : m_FilterList)
{
//如果当前容器中已经有需要添加的怪物 直接退出
if (obj == MonsterName)
{
return;
}
}
//如果没有在容器中找到需要攻击的怪物 则添加到容器
m_FilterList.push_back(MonsterName);
}
//清空所有数据
void MonsterFilter::ClearAllData()
{
m_AttackList.clear();
m_FilterList.clear();
}
添加列表和清空列表的代码都比较简单,关键在于怎么将怪物列表中不满足条件的怪物删除。
//判断怪物是否需要攻击(在攻击列表或者不在过滤列表)
BOOL CheckNeedAttack(wstring MonsterName);
新增一个函数,判断当前怪物是否需要攻击,判断是否需要攻击的条件是在攻击列表或者不在过滤列表,代码实现如下:
//判断是否是需要攻击的怪物
BOOL MonsterFilter::CheckNeedAttack(wstring MonsterName)
{
//攻击列表不存在
if (m_AttackList.size()==0)
{
//遍历过滤列表
for (auto obj:m_FilterList)
{
//如果在过滤列表
if (obj== MonsterName)
{
//说明这个怪物是需要过滤掉的 不需要被攻击 所以返回FALSE
return FALSE;
}
}
//遍历完成 说明不存在过滤列表 返回TRUE
return TRUE;
}
else
{
//遍历攻击列表 逻辑和上面相反
for (auto obj : m_AttackList)
{
if (obj == MonsterName)
{
return TRUE;
}
}
return FALSE;
}
}
然后再实现删除不符合要求的怪物列表
//刷新匹配的怪物 把不满足条件的怪物删除
void MonsterFilter::UpdateMonsters(_stuObjs& MonsterList)
{
for (auto it=begin(MonsterList.m_data);it!=end(MonsterList.m_data);it++)
{
//如果不符合条件 则删除
if (CheckNeedAttack(it->m_Name)==FALSE)
{
MonsterList.m_data.erase(it);
}
}
}
这样我们就完成了怪物过滤的设计了。使用的时候只需要传入任务需要攻击的怪物,就能实现自动攻击任务怪物。
在GlobalData加一个全局的类对象
然后在自动打怪线程过滤怪物。需要过滤的怪物我们在接任务的时候去添加,这里当前的过滤列表是空的,也不影响整个代码流程。
下一篇我们开始找自动任务需要的数据。
Github:https://github.com/TonyChen56/GameReverseNote
完整代码:https://download.csdn.net/download/qq_38474570/79498815