今天周末,在家无事可做,不知道为什么,突发奇想,想写一个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. Java:网络编程之UDP的使用

    java.net  类 DatagramSocket 此类表示用来发送和接收数据报包的套接字,数据报套接字是包投递服务的发送或接收点. java.net  类 DatagramPacket 此类表示数 ...

  2. java post 请求

    新公司的分词为post调用方式,以前还没用过post,这次上网查了下,比较简单,但还是写篇博客记录下,代码为网上找的,非原创. package com.chuntent.tool; import ja ...

  3. SGU 132 Another Chocolate Maniac 状态压缩DP

    感觉不是很好写的一道状态压缩. dp[i][j][k]表示第 i 行状态为k,第i - 1行状态为 j,具体细节见代码. 内存卡的很死,要用滚动数组. 还有一个比较坑爹的地方是它在输入蛋糕的时候中间可 ...

  4. Ubuntu下搭建java开发环境

    JDK安装: 1. 在http://www.oracle.com/technetwork/java/javase/downloads/index.html上下载相应版本的JDK环境,这里我使用的是jd ...

  5. 总结Selenium自动化测试方法(二)测试环境搭建

    (接上期内容) 二.测试环境搭建 1.安装python 现在python3.0比python2.0多了一些改进的功能(详见http://zhidao.baidu.com/link?url=3sT1g7 ...

  6. leetcode:Contains Duplicate和Contains Duplicate II

    一.Contains Duplicate Given an array of integers, find if the array contains any duplicates. Your fun ...

  7. 编写类String的构造函数、析构函数和赋值函数

    已知类String的原型为: class String {   public:  String(const char *str = NULL); // 普通构造函数  String(const Str ...

  8. linux下从源代码安装git

    之所以有这样的需求,是因为部分预安装的git版本太低,很多功能没有并且安全性存在问题. 比如git submodule add xxx@host:yyy.git必须在父repo的root目录安装,而新 ...

  9. SPOJ ARCTAN (数论) Use of Function Arctan

    详细的题解见这里. 图片转自上面的博客 假设我们已经推导出来x在处取得最小值,并且注意到这个点是位于两个整点之间的,所以从这两个整数往左右两边枚举b就能找到b+c的最小值. 其实只用往一边枚举就够了, ...

  10. 15.Object-C--浅谈Foundation框架OC数组NSArray与NSMutableArray

    昨天总结了一下NSString与NSMutableString,今天我在这里总结一下NSArray与NSMutableArray. NSArray数组是:不可变数组. nil 是数组元素结束的标记.O ...