cocos2dx3.2开发 RPG《Flighting》(十一)角色分类——英雄与怪物

一、前言
先补充一下,英雄的死亡
英雄的死亡,我们要在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
如有问题或指教,欢迎与我交流,谢谢。