今天周末,在家无事可做,不知道为什么,突发奇想,想写一个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. Linux系统监视资源与进程管理

    Linux 系统中时刻运行着许多的进程,如果能够合理的管理它们,有益于系统性能的优化, 系统进程总共有五种不同的状态: 命令一:ps命令,用于查看系统中进程状态 格式:ps [参数] 查看进程与状态: ...

  2. linux网络相关

    ethtool:http://www.ibm.com/developerworks/cn/linux/1304_wangjy_ethtools/ 网卡特性:http://blog.chinaunix. ...

  3. poj2265

    斜坐标系,注意找规律.说明在代码里. e- ?(x):-(x))<eps) ][] = { { ,  }, { -,  }, { -,  }, { , - }, { , - }, { ,  }  ...

  4. excel读取 工具类

    package cn.yongche.utils; import java.io.File; import java.io.FileInputStream; import java.io.IOExce ...

  5. [原]1856-More is better-基础并查集

    思路:注意n为0的时候输出1,还有内存.这题是数据水了,要不我的Count[ ]数组,开10^5绝对会WA.离散化还没想清楚,想清楚了再更新代码.[水过代码下面是正经的AC代码,其实这道题不用离散化, ...

  6. AOJ-2249 Road Construction(最短路)

    http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=45523 有一个国王想在首都与各个城市之间修建公路,但是他的预算太高,所以必须 ...

  7. pyhton与json,Xml

    对简单数据类型的encoding 和 decoding: 使用简单的json.dumps方法对简单数据类型进行编码,例如: 1 2 3 4 5 6 import json   obj = [[1,2, ...

  8. php关于return的关键字

    使用return关键字可以使函数返回值,可以返回包括数组和对象的任意类型,如果省略了 return,则默认返回值为 NULL. function add($a) { return $a+1; } $b ...

  9. How to: Run Tests from Microsoft Visual Studio

    https://msdn.microsoft.com/en-us/library/ms182470.aspx Running Automated Tests in Visual Studio Visu ...

  10. Linux 下安装python软件包(pip、nose、virtualenv、distribute )

    新手刚开始学习Python,目前学习<笨方法学python>ing- 在学习习题46时需要安装几个软件包:pip.nose.virtualenv.distribute !在此记录Linux ...