• 无聊之作,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;
    
    	};
    };



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

  • 相关阅读:
    sublimetext3安装配置
    .Net Core 商城微服务项目系列(八):购物车
    .Net Core 商城微服务项目系列(七):使用消息队列(RabbitMQ)实现服务异步通信
    eShopOnContainers学习系列(三):RabbitMQ消息总线实践
    Docker系列(五):.Net Core实现k8s健康探测机制
    Docker系列(四):容器之间的网络通信
    Docker系列(三):将.Net Core Api部署到Kubernetes (K8s)中
    Docker系列(二):通过Docker安装使用 Kubernetes (K8s)
    生产环境项目问题记录系列(一):一次循环数据库拖垮服务器问题
    .Net Core 商城微服务项目系列(六):搭建自己的Nuget包服务器
  • 原文地址:https://www.cnblogs.com/VindyLeong/p/4201677.html
Copyright © 2020-2023  润新知