今天周末,在家无事可做,不知道为什么,突发奇想,想写一个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. Android 怎么使用Bitmap+Canvas 自适应屏幕

    我们可以使用Matrix 来放缩我们得到的Bitmap 从而使我们的BItmap适应我们的手机屏幕 首先我们得先获取我们的手机屏幕的大小 WindowManager wm = (WindowManag ...

  2. Oracle ->> Oracle下实现SQL Server的TOP + APPLY

    今晚很好奇想知道Oracle下有没有APPLY子句?如果有那怎么实现SQL Server下的TOP + APPLY.结果自己写了个例子. with a as ( order by grp_factor ...

  3. HDOJ ----Phone List

    Phone List Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  4. Crypto API加密通信流程

    应用程序使用Crypto API进行加密通信的一般步骤如下: 1,include wincrypt.h 2,调用CryptAcquireContext()获得某个CSP模块中的密钥容器(key con ...

  5. linux 实时时钟(RTC)驱动【转】

    转自:http://blog.csdn.net/yaozhenguo2006/article/details/6820218 这个是linux内核文档关于rtc实时时钟部分的说明,此文档主要描述了rt ...

  6. allegro使用汇总 [转贴]

    1.如何在allegro中取消花焊盘(十字焊盘) set up->design parameter ->shape->edit global dynamic shape parame ...

  7. hdu - 1010 Tempter of the Bone (dfs+奇偶性剪枝) && hdu-1015 Safecracker(简单搜索)

    http://acm.hdu.edu.cn/showproblem.php?pid=1010 这题就是问能不能在t时刻走到门口,不能用bfs的原因大概是可能不一定是最短路路径吧. 但是这题要过除了细心 ...

  8. POJ-3669 Meteor Shower(bfs)

    http://poj.org/problem?id=3669 注意理解题意:有m颗行星将会落在方格中(第一象限),第i颗行星在ti时间会摧毁(xi,yi)这个点和四周相邻的点,一个人开始在原点,然后只 ...

  9. javascript callback函数的理解与使用

    最近做的一个项目中用到了callback函数,于是就研究了下总结下我对javascript callback的理解 首先从callback的字面翻译“回调” 可以理解这是一个函数被调用的机制 当我们遇 ...

  10. [HIHO1328]逃离迷宫(bfs,位压)

    题目链接:http://hihocoder.com/problemset/problem/1328 这个题bfs到时候不止要存当前的坐标,还要存当前有哪几把钥匙.因为5把钥匙,所以可以直接用位来存,这 ...