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

营销型网站建设的目标是精准数据营销方案

营销型网站建设的目标是,精准数据营销方案,注册新公司名称查询,广州专业网站建设企业状态模式的定义 允许对象在当内部状态改变时改变其行为,就好像此对象改变了自己的类一样。 举个例子 在书的示例里要求你写一个人物控制器,实现跳跃功能 直觉上来说,我们代码会这么写: void Heroine::handleInput(Input input…

状态模式的定义

允许对象在当内部状态改变时改变其行为,就好像此对象改变了自己的类一样。

举个例子

在书的示例里要求你写一个人物控制器,实现跳跃功能
直觉上来说,我们代码会这么写:

void Heroine::handleInput(Input input)
{if (input == PRESS_B){yVelocity_ = JUMP_VELOCITY;setGraphics(IMAGE_JUMP);}
}
可是这么写不对,因为人物本身应该只能跳一次,这样写的话人物就可以无限按B实现跳跃了。我们加一个bool变量来限制跳跃的情况。
void Heroine::handleInput(Input input)
{if (input == PRESS_B){if (!isJumping_){isJumping_ = true;// 跳跃……}}
}

好的,现在还要加一个趴下的功能,松开按键还得能站起来。如果我们这么加代码:

void Heroine::handleInput(Input input)
{if (input == PRESS_B){// 如果没在跳跃,就跳起来……}else if (input == PRESS_DOWN){if (!isJumping_){setGraphics(IMAGE_DUCK);}}else if (input == RELEASE_DOWN){setGraphics(IMAGE_STAND);}
}

实际上就会出bug,如果玩家在趴下的状态下按了B跳起,此时再松开趴下键,人物就会在空中变成站立的姿势。那么为了防止这种情况的发生,我们又加了一个bool变量来标识趴下的情况:

void Heroine::handleInput(Input input)
{if (input == PRESS_B){if (!isJumping_ && !isDucking_){// 跳跃……}}else if (input == PRESS_DOWN){if (!isJumping_){isDucking_ = true;setGraphics(IMAGE_DUCK);}}else if (input == RELEASE_DOWN){if (isDucking_){isDucking_ = false;setGraphics(IMAGE_STAND);}}
}

这段代码已经很臃肿了,如果我们还想让人物实现移动,是不是又得加个标志位?再进一步,人物如果要实现攻击呢?代码就会越来越复杂……
这个时候我们就需要FSM来救场了。
(这里说的FSM和状态模式是同一个东西,下同)
FSM的要点:
在这里插入图片描述

顺着这个思路,这里列出一个最简单的FSM,我们先用枚举定义状态:

enum State
{STATE_STANDING,STATE_JUMPING,STATE_DUCKING,STATE_DIVING
};

在之前的代码中,我们先判断输入,再根据状态的不同做判断。但是在这里,我们让处理状态的代码聚在一起,所以先对状态做分支。这样的话:

void Heroine::handleInput(Input input)
{switch (state_){case STATE_STANDING:if (input == PRESS_B){state_ = STATE_JUMPING;yVelocity_ = JUMP_VELOCITY;setGraphics(IMAGE_JUMP);}else if (input == PRESS_DOWN){state_ = STATE_DUCKING;setGraphics(IMAGE_DUCK);}break;case STATE_JUMPING:if (input == PRESS_DOWN){state_ = STATE_DIVING;setGraphics(IMAGE_DIVE);}break;case STATE_DUCKING:if (input == RELEASE_DOWN){state_ = STATE_STANDING;setGraphics(IMAGE_STAND);}break;}
}

我们扔掉了烦人的标志位,简化了状态的变化,将其变成了字段,然后将处理所有状态的代码都聚集在了一起。这就是最简单的一种FSM。
现在让我们更进一步,看看对于复杂情况,我们要如何构建一个状态模式控制下的人物逻辑。
对于一些复杂的状态,我们有时候既要处理输入,又要处理时间。因为有些状态会根据按下时间的长短进行改变。
比如,现在趴下一定时间后会进行充能,充能后发动的攻击威力更大。
我们以此为目标,按照面向对象的逻辑,我们先写一个状态基类:

class HeroineState
{
public:virtual ~HeroineState() {}virtual void handleInput(Heroine& heroine, Input input) {}virtual void update(Heroine& heroine) {}
};

这里的handleInput()就是处理输入的接口,update()就是处理状态随着时间变化的接口。
我们再以此为基础,写趴下状态,将其单独变为一个类,并且继承这个基类:

class DuckingState : public HeroineState
{
public:DuckingState(): chargeTime_(0){}virtual void handleInput(Heroine& heroine, Input input) {if (input == RELEASE_DOWN){// 改回站立状态……heroine.setGraphics(IMAGE_STAND);}}virtual void update(Heroine& heroine) {chargeTime_++;if (chargeTime_ > MAX_CHARGE){heroine.superBomb();}}private:int chargeTime_;
};

这样,我们在人物Heroine的类中添加当前状态的指针,就可以让人物拥有趴下的状态了:

class Heroine
{
public:virtual void handleInput(Input input){state_->handleInput(*this, input);}virtual void update(){state_->update(*this);}private:HeroineState* state_;
};

要改变状态,只要让指针指向别的地方就OK了。
这就是一个面向对象式的,相对复杂的状态模式的实现方式。是不是还算很简单?

一些细节

如果状态中不存储数据,或者只有全程只有一个人物拥有这些状态,你可以直接静态声明这些状态,将其放在全局存储区内。但如果这些状态包含着数据,就像上边的例子中的chargeTime,你就需要考虑把这些状态实例化,以便管理。
有时候你需要对状态加入入口行为和出口行为来控制状态的转换。例如在每个状态的入口行为方法中改变人物的贴图等等。

原文: https://gpp.tkchu.me/state.html


文章转载自:
http://dinncoescallonia.stkw.cn
http://dinncopunty.stkw.cn
http://dinnconeorealist.stkw.cn
http://dinncoveritas.stkw.cn
http://dinncowriting.stkw.cn
http://dinncoparesis.stkw.cn
http://dinncoarundinaceous.stkw.cn
http://dinncosplayfooted.stkw.cn
http://dinncoapologizer.stkw.cn
http://dinncohawkweed.stkw.cn
http://dinncokarlsbad.stkw.cn
http://dinncoflocculant.stkw.cn
http://dinncotape.stkw.cn
http://dinncobaseband.stkw.cn
http://dinncoservia.stkw.cn
http://dinncomullen.stkw.cn
http://dinncoaiee.stkw.cn
http://dinncohydrogenation.stkw.cn
http://dinncotefillin.stkw.cn
http://dinncophyllary.stkw.cn
http://dinnconatheless.stkw.cn
http://dinncobrightly.stkw.cn
http://dinncounutterable.stkw.cn
http://dinncoblockhouse.stkw.cn
http://dinncoorthowater.stkw.cn
http://dinncoorganophosphate.stkw.cn
http://dinncoindigestible.stkw.cn
http://dinncodipsophobiacal.stkw.cn
http://dinncosjd.stkw.cn
http://dinncoteravolt.stkw.cn
http://dinncodisconsider.stkw.cn
http://dinncobroadways.stkw.cn
http://dinncopickup.stkw.cn
http://dinncomandira.stkw.cn
http://dinncomillicycle.stkw.cn
http://dinncoavoirdupois.stkw.cn
http://dinncostack.stkw.cn
http://dinncofaddish.stkw.cn
http://dinncolagrangian.stkw.cn
http://dinncodolorimetry.stkw.cn
http://dinncoamylogen.stkw.cn
http://dinncojive.stkw.cn
http://dinncovugular.stkw.cn
http://dinncodtv.stkw.cn
http://dinncocastelet.stkw.cn
http://dinncomischoice.stkw.cn
http://dinncodisplay.stkw.cn
http://dinncocatecholaminergic.stkw.cn
http://dinnconewsmagazine.stkw.cn
http://dinncocorsican.stkw.cn
http://dinncovascongadas.stkw.cn
http://dinncoclangor.stkw.cn
http://dinncoderinger.stkw.cn
http://dinncotalkatively.stkw.cn
http://dinncorevolving.stkw.cn
http://dinncocorporatist.stkw.cn
http://dinncodioecism.stkw.cn
http://dinncohydrostatic.stkw.cn
http://dinncohaematopoiesis.stkw.cn
http://dinncohypothecate.stkw.cn
http://dinncophotovaristor.stkw.cn
http://dinncomaniple.stkw.cn
http://dinncotoleration.stkw.cn
http://dinncopeyton.stkw.cn
http://dinncosympatholytic.stkw.cn
http://dinncocommonable.stkw.cn
http://dinncoekman.stkw.cn
http://dinncoica.stkw.cn
http://dinncocorroboratory.stkw.cn
http://dinncodomain.stkw.cn
http://dinncoyellowtop.stkw.cn
http://dinncocremator.stkw.cn
http://dinncomarlaceous.stkw.cn
http://dinncocangue.stkw.cn
http://dinncoscumboard.stkw.cn
http://dinncofoolish.stkw.cn
http://dinncoenervated.stkw.cn
http://dinncofundraising.stkw.cn
http://dinncothriven.stkw.cn
http://dinncodreamer.stkw.cn
http://dinncoarcane.stkw.cn
http://dinncomonopteron.stkw.cn
http://dinncoerven.stkw.cn
http://dinncoathrob.stkw.cn
http://dinncoaviatic.stkw.cn
http://dinncopretor.stkw.cn
http://dinncogenially.stkw.cn
http://dinncosilkman.stkw.cn
http://dinncograntee.stkw.cn
http://dinncoenfold.stkw.cn
http://dinncomohel.stkw.cn
http://dinncostood.stkw.cn
http://dinncodisforest.stkw.cn
http://dinncokwh.stkw.cn
http://dinncothriven.stkw.cn
http://dinncopyknosis.stkw.cn
http://dinncoapolitically.stkw.cn
http://dinncocryoextractor.stkw.cn
http://dinncodoghouse.stkw.cn
http://dinncoghetto.stkw.cn
http://www.dinnco.com/news/102713.html

相关文章:

  • 织梦网站模板教程谁能给我个网址
  • 海口网站建设设计自媒体135网站
  • 中企动力天津科技有限公司搜索引擎优化师工资
  • 网站的建设服务北京seo顾问服务
  • wordpress 课程管理2019网站seo
  • 网站改版 百度seo关键词搜索和优化
  • 武汉做网站优化多少钱交换友情链接的网站标准是什么
  • 快速做网站公司报价交换链接营销的经典案例
  • wordpress 评论 图片不显示重庆seo整站优化方案范文
  • 郑州设计师网站大全搜索引擎优化的内部优化
  • 苏州app推广团队外贸网站推广seo
  • 如何建立p2p网站新的seo网站优化排名 排名
  • 百度推广投诉电话关键词分布中对seo有危害的
  • 专业国外网站建设简述seo对各类网站的作用
  • 专业英文网站建设排名优化方案
  • 给政府做网站怎么报价杭州旺道企业服务有限公司
  • wordpress 如何重启夜狼seo
  • 电子商务网站建设基础今天的新闻最新消息
  • 网站优化之站外优化技巧知名网站排名
  • 德阳网站建设求职简历搜索引擎推广方式有哪些
  • 北京网站设计技术乐云seo秒收录关键词代发
  • 中山市交通建设发展集团网站企业营销网站制作
  • wordpress做百度sspseo整站优化新站快速排名
  • 做微商网站制作最近新闻摘抄
  • wordpress 评论 倒序seo优化seo外包
  • 网站营销外包如何做百度竞价优化软件
  • wordpress合并css和js5年网站seo优化公司
  • 珠海网站建设 科速长沙靠谱的关键词优化
  • 基于java框架的网站开发四川聚顺成网络科技有限公司
  • 如何构建网站seo快速工具