zoukankan      html  css  js  c++  java
  • 无聊之作,RPGdemo制作(一)角色state模式

    今天周末,在家无事可做,不知道为什么,突发奇想,想写一个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  void		update(T*  host)
    	{
    		//如果宿主血条为空
    		if (host->isDead())
    		{
    			//切换到死亡状态
    			host->changeState(createState(EN_STATE_DEAD));
    		}
    
    	};
    
    	//是否状态相同
    	virtual bool		isState(state_object<T>* state_)
    	{
    		if (state_)
    		{
    			return _Type == state_->getType();
    		}
    
    		return false;
    	}
    
    	virtual void				onExit(){};
    
    	virtual void				onEnter(){};
    
    	//获取状态类型
    	virtual _EN_STATE_TYPE		getType(){ return _Type; }
    
    private:
    
    };


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

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

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



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

  • 相关阅读:
    css最简单的在背景图片上显示模糊背景色的方法
    css添加网格背景
    获取bing必应图片
    JavaScript超过一定高度导航添加类名
    6行css就可以解决的瀑布流布局的方法
    css实现背景图横向滚动
    JavaScript根据一个元素的显示隐藏控制另一个元素的显示和隐藏
    JavaScript判断地址栏链接与导航栏链接是否一致并给导航添加class
    JavaScript实现选中文字自动复制
    Day 74 算法基础(二)
  • 原文地址:https://www.cnblogs.com/VindyLeong/p/4201677.html
Copyright © 2011-2022 走看看