今天周末,在家无事可做,不知道为什么,突发奇想,想写一个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; };
};

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

无聊之作,RPGdemo制作(一)角色state模式的更多相关文章

  1. 【行为型】State模式

    状态模式其意图是在一个对象的状态发生变化时能够同时改变它的行为.一个生活中比较常见的例子就如你(是指你自己本人)在走时时,整个人全身的动作是双手臂前后慢慢摇摆且双脚也是一步一步慢慢往前移的,即:该走路 ...

  2. State模式(状态设计模式)

    State??? State模式中,我们用类来表示状态.以类来表示状态后,我们就能通过切换类来方便地改变对象的状态.当需要增加新的状态时,如何修改代码这个问题也会很明确. 直接用状态代替硬编码 依赖于 ...

  3. 《图解设计模式》读书笔记8-3 STATE模式

    目录 State模式 示例程序 实现的功能 不使用&使用状态模式对比 示例程序的类图 代码 角色和类图 角色 类图 拓展思路 分而治之 依赖于状态的处理 谁来管理状态迁移 易于增加新状态 实例 ...

  4. 敏捷软件开发(1)--- STATE 模式

    如果状态在运行过程中,不停的切换和改变,我们怎么办? 状态的迁移是我们生活和工程中非常普遍的一个概念.于是在数学上有一种理论来分析和解决这个问题. 有限状态机理论是一个非常成熟的理论,所有动作和流程的 ...

  5. State模式的经典应用场景:订单处理(c#实现)

    State模式在对象内部状态发生变化的时候,改变自身的行为,这通常是通过切换内部状态对象实现的,对象将自身在各个状态的行为推给了状态对象,从而解开了行为与对象的依赖. 场景描述 在经典的订单处理场景中 ...

  6. State模式

    地铁十字转门 状态迁移表格. 起始状态 触发迁移的事件 终止状态  要执行的动作. Locked   Coin               UnLocked UnLock UnLocked Pass  ...

  7. Behavioral模式State模式

    1.意向 同意一个目标,然后改变其内部状态,改变它的行为. 对象似乎改变它的类别. 2.别名 状态对象(Objects for States) 3.动机 考虑一个表示网络连接的类TCPConnecti ...

  8. State 模式

    State模式中我们将状态逻辑和动作实现进行分离.允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类:在一个状态即将结束的时候启用下一个状态. /////////state.h// ...

  9. state模式理解

    state模式应用场景 条件判断很多的情况 比如有很多if else语句:switch case语句等等. 如果以后业务越来越复杂,条件判断有100多个,每种条件的处理逻辑很复杂,不止一个业务逻辑会重 ...

随机推荐

  1. CentOS单用户模式下修改ROOT密码和grub加密

    Linux 系统处于正常状态时,服务器主机开机(或重新启动)后,能够由系统引导器程序自动引导 Linux 系统启动到多用户模式,并提供正常的网络服务.如果系统管理员需要进行系统维护或系统出现启动异常时 ...

  2. CleanAOP实战系列--WPF中MVVM自动更新

    CleanAOP实战系列--WPF中MVVM自动更新 作者: 立地 邮箱: jarvin_g@126.com QQ: 511363759 CleanAOP介绍:https://github.com/J ...

  3. 大数据时代下的用户洞察:用户画像建立(ppt版)

    大数据是物理世界在网络世界的映射,是一场人类空前的网络画像运动.网络世界与物理世界不是孤立的,网络世界是物理世界层次的反映.数据是无缝连接网络世界与物理世界的DNA.发现数据DNA.重组数据DNA是人 ...

  4. Go语言学习笔记一(语法篇)

    国庆节七天假期,这段时间刚好项目那边催的不是很紧,基本上每天都是白天重构一下项目代码,晚上自己学习.(大概是因为容总那边的人都去度假了把项目进度放慢了吧.这两天“彩虹”姐姐也来凑热闹,据说还是直接从澳 ...

  5. Docker+K8S实践

    一.运维角度: (一)镜像: 1. 避免依赖过深.不要在基础镜像上加太多产生其他的镜像,我觉得这块最多是三四层. 一层是base景像再往上是工具.中间件这样的,再往上一层就是你自己的程序,再多就比较乱 ...

  6. flex 组建重写

    flex历经几个版本的变化,其封装性也越来越规范. 今日flex的学习,总结是组件的重写. 项目中为使组件的针对性,易用性更强 ,免不了要重写组件. 要改变你的对手你的了解你的对手. 一个组件从被ne ...

  7. dojo 总结

    对以前项目中用到的dojo框架进行一个框架式的总结,以备参考学习. 主要组成... 1 开发注意... 3 Dojo代码约定... 3 Dojo形式的脚本库... 4 Dojo Build. 4 Do ...

  8. Maven概要[转]

    1. Maven介绍 1.1. 简介 java编写的用于构建系统的自动化工具. 目前版本是2.0.9,注意maven2和maven1有很大区别,阅读第三方文档时需要区分版本. 1.2. Maven资源 ...

  9. non-overlapping-intervals

    https://leetcode.com/problems/non-overlapping-intervals/ 其中还用到了Java的Comparator接口和其中的compare方法. packa ...

  10. List排序的两种简便方式

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace List ...