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

	};
};



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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值