当前位置: 首页 > news >正文

医疗器械网站建设策划书/百度公司排名

医疗器械网站建设策划书,百度公司排名,外贸网站设计师,wordpress连接sae数据库出错前言:状态机模式是一个游戏常用的经典设计模式,常被用作管理一种物体的各种状态(例如管理人物的行走,站立,跳跃等状态)。 (Unity里的Animator就是一种典型的状态机,用于控制动画状态…

前言:状态机模式是一个游戏常用的经典设计模式,常被用作管理一种物体的各种状态(例如管理人物的行走,站立,跳跃等状态)。

 

(Unity里的Animator就是一种典型的状态机,用于控制动画状态之间的切换)

 

假如我们正在开发一款动作游戏,当前的任务是实现根据输入来控制主角的行为——当按下B键时,他应该跳跃。

直观的代码:

    if (input == PRESS_B) {if (!m_isJumping) {m_isJumping = true;Jump();//跳跃的代码
        }}

后来我们需要添加更多行为了,所有行为如下:

站立时按下 ↓ 键 =》 蹲下。

蹲下时按下 ↓ 键 =》 站立。

站立时按下 B 键 =》 跳跃。

跳跃时按下 ↓ 键 =》触发 俯冲。

    if (input == PRESS_B) {//如果在站立时且没在跳跃,则跳跃if (!m_isJumping && m_isStanding) {m_isJumping = true;player.jump();//跳跃的代码
        }}else if (input == PRESS_DOWN) {//如果在跳跃时且没在俯冲,则俯冲if (m_isJumping && !m_isDiving) {m_isDivingplayer.dive();//俯冲的代码
        }//如果没在跳跃else if (m_isJumping) {//如果站立时,则蹲下if (m_isStanding && !m_isJumping) {m_isStanding = false;player.sneak();//蹲下的代码
            }//如果蹲下时,则站立else {m_isStanding = true;player.stand();//站立的代码
            }}}

 可以看到一堆if-else语句非常复杂,要是添加更多行为,其逻辑结构更加难以维护,而且主角的代码又得重新编译(耦合性大)

 

有限状态机

有限状态:有限数量的状态。

 一个可行的办法是将这些 状态&状态切换&状态对应的行为 封装成类,

(如下图)

 

这时候可以借助状态机这个设计模式来美化这段代码。

上面的场景中,只有4个状态(跳跃/下蹲/站立/俯冲),这就是有限状态。

于是我们设计出下面4个状态类(加一个状态的接口类):

//状态接口类
class State {
public://处理输入,然后根据输入转换相应的状态virtual void handleInput(Player& player,const Input& input) = 0;
};
//站立状态
class StandState : public State {
public:void handleInput(Player& player, const Input& input) override{if (input == PRESS_B) {player.jump();//角色跳跃的代码
            player.setState(JumpState());}else if (input == PRESS_DOWN) {player.sneak();//角色蹲下的代码
            player.setState(SneakState());}}
};
//跳跃状态
class JumpState : public State {
public:void handleInput(Player& player, const Input& input) override {if (input == PRESS_DOWN) {player.dive();//角色俯冲的代码
            player.setState(DiveState());}}
};
//下蹲状态
class SneakState : public State {
public:void handleInput(Player& player, const Input& input) override {if (input == PRESS_DOWN) {player.stand();//角色站立的代码
            player.setState(StandState());}}
};
//俯冲状态
class DiveState : public State {
public:void handleInput(Player& player, const Input& input) override {}
};

第一次进入游戏时,给角色一个初始状态

player.setState(new StandState());

然后每次接受输入,让角色当前的状态对象去处理就可以了。

player.getState().handleInput(player,input);

 

简单小结:

可以看到利用状态类对象,我们把负责的条件逻辑封装到各个状态类里,让代码变得优雅,而且还减少了几个变量的使用(m_isJumping等)。

此外由于有限状态对象的属性是固定不变的,这意味着所有角色都能共享同一个状态(当同种状态时),

所以常见的状态对象存储方式是单例存储或者静态存储(每种状态只生成1个对象),避免了上文每次都要生成新状态对象的开销。

 

有限状态机的更多改良改进

平行的状态机

实际中,一些游戏的类可能需要多个状态(平行关系),于是可以写出以下代码

class Player{State* m_bodyState;//身体状态State* m_equipmentState;//装备状态//.....其它代码
};

然后便可以用下列方式处理状态了

void Player::handleInput(const Input& input) {m_bodyState->handleInput(*this,input);m_equipmentState->handleInput(*this,input);
}

层次状态机

把主角的行为更加具象化以后,可能会包含大量相似的状态,为了重用代码,便衍生层次状态机的概念。

层次状态主要思想是状态类继承,从而产生层次关系的状态。

例如,蹲下状态和站立状态 继承于 在地面状态。

class OnGroundState : public State {void handleInput(Player& player, const Input& input) override {if (input == PRESS_B){}//....跳跃
    }
};class StandState : public OnGroundState {void handleInput(Player& player, const Input& input) override {//当松开↓键,才蹲下去if (input == RELEASE_DOWN) {}//...蹲下去的代码...else {OnGroundState::handleInput(player,input);}}
};class SneakState : public OnGroundState {void handleInput(Player& player, const Input& input) override {//当松开↓键,才站起来if (input == RELEASE_DOWN) {}//...站起来的代码...else {OnGroundState::handleInput(player, input);}} 
};

 

下推状态机 

下推状态机,简单来说,就是用栈结构存储一系列状态对象。

一般来说,一个角色只需要一个状态对象,为什么要用栈结构存储一堆状态对象?

 

假设有一个射击游戏的角色,他现正在站立状态,执行栈顶状态中。

突然遇到敌人进行开火,于是入栈一个开火状态,并继续执行新的栈顶状态。

敌人被击中死亡,开火状态结束。为了恢复到开火前的上一个状态,于是去掉栈顶状态。

这样我们利用栈就完美模拟了一个人开火之后恢复成站立状态的过程。

 

简单来说,

下推自动机适用于需要记忆状态的状态机,这在一些游戏AI是常用的手法。(不过现在更流行的游戏AI是用行为树实现)

 


 

游戏设计模式系列-其他文章:

https://www.cnblogs.com/KillerAery/category/1307176.html

转载于:https://www.cnblogs.com/KillerAery/p/9680303.html

http://www.lbrq.cn/news/938539.html

相关文章:

  • 门户网站cms系统/百度seo策略
  • 做网站服务器要用多大/网络营销与直播电商专业学什么
  • 求做图的网站/广州从化发布
  • 使用docker部署wordpress/seo站长工具是什么
  • 政府网站新媒体建设方案/网络媒体推广报价
  • 家教网站建设模板/软文代写服务
  • 莱州人社局网站/杭州疫情最新情况
  • 网站文章结构变更怎么做301/成都网站建设系统
  • 网站建设 交易保障/二十个优化
  • win8风格网站css/最好的网络推广方式
  • 品牌注册类别/seo推广主要做什么的
  • 有没有免费做网站的/百度注册网站怎么弄
  • 做58网站空调维修接单怎么样/建网站教程
  • 塘沽网站优化/站长工具网站测速
  • 2019年做网站还有前景吗/班级优化大师怎么用
  • 李静做的化妆品网站/网页优化方案
  • 宠王爷斗皇子我家王妃帅爆了/网站搜索优化价格
  • 上海松江做网站的公司/企业推广平台有哪些
  • 家用电脑和宽带做网站/torrentkitty磁力天堂
  • 洛阳市住房建设委员会网站/网络市场调研的方法
  • 免费html5网站源码/合肥网络营销公司
  • 网站建设用几级域名合适/广告推广计划
  • 用dw做网站的空格怎么打/seo产品推广
  • 大连网站建设优化/全网关键词云在哪里看
  • 如何提升网站的收录量/营销型网站建设解决方案
  • 北京 响应式网站建设/市场调研报告500字
  • wordpress keywords插件/专业seo培训
  • 无锡网站建设开发/软文写作平台发稿
  • 软件著作权转让/seo外贸推广
  • 一家专门做灯的网站/新闻头条今天最新消息
  • vue3.6更新哪些内容
  • 依赖倒置原则 Dependency Inversion Principle - DIP
  • springboot基于Java的人力资源管理系统设计与实现
  • IP--MGER综合实验报告
  • [Python 基础课程]注释
  • 【C++】二叉搜索数