一、前言
先补充一下,英雄的死亡
英雄的死亡,我们要在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; } } }<strong> </strong>
好了,前面我们讲得移动,攻击,都是对角色类来讲的。现在为了开展后面的,我们是时候对角色分成两类了,英雄和怪物。
二、正文
英雄类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
如有问题或指教,欢迎与我交流,谢谢。