《游戏编程模式》一7.9 层次状态机

简介:

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

7.9 层次状态机

在我们把主角的行为更加具象化以后,她可能会包含大量相似的状态。比如,她可能有站立、走路、跑步和滑动状态。在这些状态中的任何一个状态时按下B键,我们的主角要跳跃;按下下方向键,我们的主角要躲避。

如果只是使用一个简单的状态机实现,我们可能会在这些状态中重复不少代码。更好的解决方案是,我们只需要实现一次然后它便可以在所有的状态下都复用。

这可能同时带来好坏两种影响。继承是一种强大的代码重用方式,但是,它也会使得子类与基类之间的代码变得紧耦合。它是一个很大的“锤子”,需小心使用才行。

如果我们抛开状态机来谈面向对象,有一种共享代码的方式便是继承。我们可以定义一个类来表示“on ground”的状态,它用来处理跳跃状态和躲避状态。站立、走路、跑步和滑行状态从这个“on ground”的状态继承而来,并且在其类里面实现一些特殊行为。

这里,我们通常把这种状态机叫做层次状态机。一个状态有一个父状态。当有一个事件进来的时候,如果子状态不处理它,那么沿着继承链传给它的父状态来处理。换句话说,它有点像覆盖继承的方法。

实际上,如果我们正在使用状态模式来实现有限状态机,那么我们可以使用继承类来实现继承。我们首先定义一个基类来表示父状态:

class OnGroundState : public HeroineState
{
public:
 virtual void handleInput(Heroine& heroine,   
                   Input input)
 {
  if (input == PRESS_B) // Jump...
  else if (input == PRESS_DOWN) // Duck...
  }
 }
};

然后,每一个子状态都继承至它:

class DuckingState : public OnGroundState
{
public:
 virtual void handleInput(Heroine& heroine,   
                   Input input)
 {
  if (input == RELEASE_DOWN)
  {
   // Stand up...
  }
  else
  {
   // Didn't handle input, so walk up hierarchy.
   OnGroundState::handleInput(heroine, input);
  }
 }
};
 ```  
 
当然,这不是实现继承的唯一方式。如果你没有使用GoF的状态模式,这种做法可能并不奏效。不过,你可以在基类中使用状态栈而不是单单一个状态的方法来更加明确地表示父状态的状态链。
相关文章
|
2月前
|
设计模式 算法 C++
从 C++ 优化状态机实现:结合设计模式的实用指南
从 C++ 优化状态机实现:结合设计模式的实用指南
67 1
|
5月前
|
人工智能 安全 图形学
有限状态机的概念
有限状态机的概念
|
7月前
|
设计模式 网络协议 Java
《移动互联网技术》 第十章 系统与通信: 掌握Android系统的分层架构设计思想和基于组件的设计模式
《移动互联网技术》 第十章 系统与通信: 掌握Android系统的分层架构设计思想和基于组件的设计模式
66 0
|
9月前
|
设计模式 Oracle 关系型数据库
软件架构设计原则之合成复用原则
合成复用原则(Composite/Aggregate Reuse Principle,CARP)是指尽量使用对象组合(has-a)/聚合(contanis-a)而不是继承关系达到软件复用的目的。可以使系统更加灵活,降低类与类之间的耦合度,一个类的变化对其他类造成的影响相对较少。
79 0
|
10月前
|
设计模式 算法
设计模式——从简单的程序变化到设计理念
设计模式——从简单的程序变化到设计理念
72 0
|
12月前
|
测试技术
【系统架构】面向对象设计——控制类
【系统架构】面向对象设计——控制类
106 0
|
存储 算法 异构计算
状态机的概念与设计
⭐本专栏针对FPGA进行入门学习,从数电中常见的逻辑代数讲起,结合Verilog HDL语言学习与仿真,主要对组合逻辑电路与时序逻辑电路进行分析与设计,对状态机FSM进行剖析与建模。
237 0
状态机的概念与设计
|
设计模式 Oracle 关系型数据库
软件架构设计原则--合成复用原则
本专栏内容参考自:咕泡学院Tom老师的《Spring5核心原理与30个类手写实战》,仅作个人学习记录使用,如有侵权,联系速删
|
网络协议 数据可视化 测试技术
面向对象分析与设计的底层逻辑
真正掌握了面向对象分析和设计的方法,也体会到其中的益处,对理解业务、方案设计、编码开发都有好处。
680 0
面向对象分析与设计的底层逻辑
|
缓存 Android开发
怎么理解 onStart可见但不可交互
onStart生命周期表示Activity可见,那为什么不能交互呢
130 0
怎么理解 onStart可见但不可交互