《游戏编程模式》一7.6 进入状态和退出状态的行为

简介:

本节书摘来异步社区《游戏编程模式》一书中的第7章,第7.6节,作者: 【美】Robert Nystrom (尼斯卓姆) 译者: 赵卫兵 , 许新星 , 姜召阳 , 陈侃 , 屈光辉 , 郑炯彬 责编: 陈冀康,更多章节内容可以访问云栖社区“异步社区”公众号查看。

7.6 进入状态和退出状态的行为

状态模式的目标就是将每个状态相关的所有的数据和行为封装到相关类里面。万里长征,我们仅仅迈出去了一步,我们还有更多路要走。

当主角更改状态的时候,我们也会切换它的贴图。现在,这段代码包含在它要切换的状态的上一个状态里面。当她从躲避状态切换到站立状态时,躲避状态将会修改它的图像:

HeroineState* DuckingState::handleInput(  
      Heroine& heroine, Input input)
{
 if (input == RELEASE_DOWN)
 {
  heroine.setGraphics(IMAGE_STAND);
  return new StandingState();
 }

 // Other code...
}

我们希望的是,每一个状态控制自己的图像。我们可以通过给每一个状态添加一个entey行为。

class StandingState : public HeroineState
{
public:
 virtual void enter(Heroine& heroine)
 {
  heroine.setGraphics(IMAGE_STAND);
 }

 // Other code...
};

回到Heroine类,我们修改代码来处理状态切换的情况:

void Heroine::handleInput(Input input)
{
 HeroineState* state = state_->handleInput(  
      *this, input);
 if (state != NULL)
 {
  delete state_;
  state_ = state;

  // Call the enter action on the new state.
  state_->enter(*this);
 }
}

这样也可以让我们简化躲避状态的代码:

HeroineState* DuckingState::handleInput(  
      Heroine& heroine, Input input)
{
 if (input == RELEASE_DOWN)
 {
  return new StandingState();
 }

 // Other code...
}

它所做的就是切换到站立状态,然后站立状态会自己设置图像。现在,我们的状态已经封装好了。entry动作的一个最大的好处就是它不用关心上一个状态是什么,它只需要根据自己的状态来处理图像和行为就可以了。

大部分的真实状态图里面,我们有多个状态对应同一个状态。比如,我们的女主角会在她俯冲或者跳跃之后站立在地面上。这意味着,我们可能会在每一个状态发生变化的时候重复写很多代码。但是,entry动作帮我们很好地解决了这个问题。

当然,我们也可以扩展这个功能来支持退出状态的行为。我们可以定义一个exit函数来定义一些在状态改变前的处理。

相关文章
LabVIEW实现应用程序停止或退出
我们在做应用程序开发时,最后必然会用到应用程序停止或退出功能,本篇博文将分享实用LabVIEW如何实现应用程序停止或退出。
|
Ubuntu Linux Windows
项目实战:Qt终端命令模拟工具 v1.0.0(实时获取命令行输出,执行指令,模拟ctrl+c中止操作)
在Qt软件中实现部分终端控制命令行功能,使软件内可以又好的模拟终端控制,提升软件整体契合度。
项目实战:Qt终端命令模拟工具 v1.0.0(实时获取命令行输出,执行指令,模拟ctrl+c中止操作)
|
开发者
结构搭建与退出功能的实现 | 学习笔记
快速学习结构搭建与退出功能的实现,介绍了结构搭建与退出功能的实现系统机制, 以及在实际应用过程中如何使用。
53 0
|
存储 安全 程序员
程序员思维模式-主调试循环
仅通过测试进行验证基本上是在仪器上驾驶飞机,而不是能够向外看挡风玻璃。视觉飞行和肌肉记忆飞行与仪器相结合,既高效又安全。你不太可能误撞山。 当你已经编码了十多年时,可能很难重新捕捉初学者的思想,并向新手解释如何像程序员一样思考。我记得在大学里,当我编码的时间相对较短时,有一件事在我的脑海中结晶了编写代码背后的思维过程——你可以称之为程序员哲学。我正在帮助一个朋友完成计算机
程序员思维模式-主调试循环
|
存储 安全 程序员
程序员思维模式 - 主调试循环
> 仅通过测试进行验证基本上是在仪器上驾驶飞机,而不是能够向外看挡风玻璃。视觉飞行和肌肉记忆飞行与仪器相结合,既高效又安全。你不太可能误撞山。 当你已经编码了十多年时,可能很难重新捕捉[初学者的思想](https://en.wikipedia.org/wiki/Shoshin),并向新手解释如何像程序员一样思考。我记得在大学里,当我编码的时间相对较短时,有一件事在我的脑海中结晶了编写代码背后的思维过程——你可以称之为程序员哲学。我正在帮助一个朋友完成计算机科学101任务。他们对编码完全陌生。 他们从头到尾在纸上写了一个完整的解决方案——也许是100行代码。然后,他们将其全部输入到文本编辑器
110 0
|
Java 开发者
程序逻辑控制(循环控制)|学习笔记
快速学习 程序逻辑控制(循环控制)
|
Java 开发者
用户模块之退出功能|学习笔记
快速学习用户模块之退出功能
|
C#
艾伟:C#多线程学习(五) 多线程的自动管理(定时器)
本系列文章导航 C#多线程学习(一) 多线程的相关概念 C#多线程学习(二) 如何操纵一个线程 C#多线程学习(三) 生产者和消费者 C#多线程学习(四) 多线程的自动管理(线程池) C#多线程学习(五) 多线程的自动管理(定时器) C#多线程学习(六) 互斥对象 Timer类:设置一个定时器,定时执行用户指定的函数。
1401 0
|
C# 图形学
Unity中巧用协程和游戏对象的生命周期处理游戏重启的问题
主要用到协程(Coroutines)和游戏对象的生命周期(GameObject Lifecycle)基础知识,巧妙解决了游戏重启的问题。   关于协程,这里有篇文章我觉得写的非常好,理解起来也很容易。
1633 0