无聊之作,RPGdemo制作(一)角色state模式

来源:互联网 发布:淘宝图片护盾 编辑:程序博客网 时间:2024/04/28 02:33

今天周末,在家无事可做,不知道为什么,突发奇想,想写一个RPG游戏的demo玩玩。所以就记录一下。


第一步要做的是,为以后的角色类写一个state模式的类,考虑到可能以后会用到,所以用模版来实现,

//状态枚举enum _EN_STATE_TYPE{EN_STATE_STANBY,EN_STATE_MOVE,EN_STATE_ATK,EN_STATE_DEAD};//状态父类template < class T >class state_object{protected:_EN_STATE_TYPE _Type;public:state_object(){};~state_object(){};//在本类内创建非本类型的新状态state_object<T>*createState(_EN_STATE_TYPE Type_){state_object<T>* state_ = nullptr;if (_Type != Type_){switch (Type_){case EN_STATE_STANBY:state_ = new state_stanby<T>;break;case EN_STATE_MOVE:state_ = new state_move<T>;break;case EN_STATE_ATK:state_ = new state_atk<T>;break;case EN_STATE_DEAD:state_ = new state_dead<T>;break;default:break;}}return state_;}//状态检测virtual  voidupdate(T*  host){//如果宿主血条为空if (host->isDead()){//切换到死亡状态host->changeState(createState(EN_STATE_DEAD));}};//是否状态相同virtual boolisState(state_object<T>* state_){if (state_){return _Type == state_->getType();}return false;}virtual voidonExit(){};virtual voidonEnter(){};//获取状态类型virtual _EN_STATE_TYPEgetType(){ return _Type; }private:};


这样就用模版创建了一个状态父类,以后的状态都继承于它。再上其他类的代码。

各个状态的update函数负责随时检测更新状态

template < class T >class state_stanby : public state_object<T>{public:state_stanby(){ _Type = EN_STATE_STANBY; };~state_stanby(){};virtual  voidupdate(T*  host){state_object::update(host);if (host->isRival())//如果宿主有攻击对象{//切换到攻击状态host->changeState(createState(EN_STATE_ATK));}};virtual voidonExit(){cout << "退出《state_stanby》状态" << endl;};virtual voidonEnter(){cout << "进入《state_stanby》状态" << endl;};};template < class T >class state_move : public state_object<T>{public:state_move() { _Type = EN_STATE_MOVE; };~state_move(){};virtual  voidupdate(T*  host){state_object::update(host);//暂时没写到画面,所以暂时没写移动状态};virtual voidonExit(){cout << "退出《state_move》状态" << endl;};virtual voidonEnter(){cout << "进入《state_move》状态" << endl;};};template < class T >class state_atk : public state_object<T>{public:state_atk(){ _Type = EN_STATE_ATK; };~state_atk(){};virtual  voidupdate(T*  host){state_object::update(host);//如果有攻击对象if (host->isRival()){//攻击它host->hit_Rival();}else{//没有对象就回到待机状态host->changeState(createState(EN_STATE_STANBY));}};virtual voidonExit(){cout << "退出《state_atk》状态" << endl;};virtual voidonEnter(){cout << "进入《state_atk》状态" << endl;};};template < class T >class state_dead : public state_object<T>{public:state_dead(){ _Type = EN_STATE_DEAD; };~state_dead(){};virtual  voidupdate(T*  host){state_object::update(host);if (host->isRival()){//死亡了,清除宿主的对手信息,以及对手的对手信息host->getRival()->Configure_Role(nullptr);host->Configure_Role(nullptr);}};virtual voidonExit(){cout << "退出《state_dead》状态" << endl;};virtual voidonEnter(){cout << "进入《state_dead》状态" << endl;};};



到现在为止,目前所用到的状态就写完了,本章先到处介绍,未完待续··········

0 0
原创粉丝点击