无聊之作,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; }; };
到现在为止,目前所用到的状态就写完了,本章先到处介绍,未完待续··········
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!