一、前言
先补充一下,英雄的死亡
英雄的死亡,我们要在FlightLayer对m_rolesArray进行清除操作
void FlightLayer::cleanNullPtrInArray(){
auto it = m_rolesArray.begin();
while(it != m_rolesArray.end()){
if((**it)->getRoleStat() == Role::ROLE_DIE){
(**it)->removeFromParentAndCleanup(true);
**it = nullptr;
it = m_rolesArray.erase(it);
}else{
++it;
}
}
}
```
好了,前面我们讲得移动,攻击,都是对角色类来讲的。现在为了开展后面的,我们是时候对角色分成两类了,英雄和怪物。
二、正文
英雄类Hero继承Role类,与Role相比,不同的地方就是Hero能够使用技能,而且有技能效果,还有initWithMessage方法就是用HeroMessage来初始化自身的一些属性罢了。
class Hero : public Role{
friend class Skill;
public:
static Hero* create(const std::string& name,FlightLayer* layer);
static Hero* create(const std::string& name,FlightLayer* layer,int offsetX,int offsetY);
void initHero();
void initWithMessage(const HeroMessage& msg);
virtual Point getHpSliderPos();
inline void setSkill(SkillMessage s){m_skill = s;}
inline SkillMessage getSkill(){return m_skill;}
virtual void skill();
void runStateEffect(int id);
//是否在大招状态
inline bool isSkilling(){return skilling;}
//是否能使用大招
inline bool isCanSkill(){return canUseSkill;}
//恢复状态
void recover();
private:
virtual void update(float dt);
void update_state(float dt);
void update_skill_cd(float dt);
private:
SkillMessage m_skill;
bool skilling;
bool canUseSkill;
float m_state_lastTime;
float skillCD;
Sprite* m_state_sprite;
};
```
关于技能和技能效果不打算在这里开展。以后会单独有一节。
怪物类Monster也是继承Role类,与Role相比,Monster有一个仇恨值数组,管理对攻击过自己的英雄的仇恨值,默认攻击仇恨值最高的那个英雄,当怪物在没有攻击对象的时候,会自动随机抽取一个英雄攻击。
既然我们已经有了分类,那么为了逻辑判断操作容易点(例如英雄不能打英雄,怪物不能打怪物之类的),我们可以在父类(Role)增加一个枚举和一个标识是什么角色类型的变量,如下
class Role{
public:
enum ROLE_TYPE{
ROLE_TYPE_NULL,
ROLE_TYPE_HERO,
ROLE_TYPE_MONSTER
};
private:
ROLE_TYPE m_type;//角色类型:Monster Or Hero
}
```
void Hero::initHero(){
setControlable(true);
m_type = Role::ROLE_TYPE_HERO;
}
void Monster::initMonster(){
m_type = Role::ROLE_TYPE_MONSTER;
m_controlable = false;//怪物不可控制
}
```
大概分类就是这样子吧。
我的csdn地址:http://blog.csdn.net/hezijian22
邮箱地址:578690286@qq.com
如有问题或指教,欢迎与我交流,谢谢。