《游戏编程模式》一7.8 并发状态机

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

7.8 并发状态机

我们决定给我们的主角添加持枪功能。当她持枪的时候,她仍然可以:跑、跳和躲避等。但是,她也需要能够在这些状态过程中开火。

如果你执着于传统的有限状态机,那我们可能需要把之前的状态加倍。对于每一个已经存在的状态,我们需要定义另一个状态,它做的事情也差不多,不过就是多了持枪的操作。比如站立状态和站立开火状态,跳跃状态和跳跃开火状态等。

如果我们添加更多的武器种类,那么这个状态数量将会急剧增加。而且不仅仅是增加了大量的状态类实例,它还会增加大量的冗余,实际上带不带枪的状态仅有是否包含开火代码的区别而已。

这里的问题是,我们把两种状态杂合在一起了。我们把两种不同的状态硬塞到一个状态机里面去了。为所有可能出现的组合建模,我们可能需要为每一种状态准备一组状态。解决方法比较直观,就是分开成两个状态机。

如果我们需要为主角定义n种状态和m种它能够携带的武器状态,如果使用一个状态机来表示,那么我们需要n×m个状态。而如果使用两个状态机,那么状态组合仅是n+m。

首先我们可以保留原有的状态机的代码和功能不管它。接下来,我们定义一个单独的状态机,用来处理主角携带的武器。现在,我们的主角会有两个状态索引,其中一个看起来如下所示:

为了便于示例说明,我们这里使用了完整的状态模式来处理女主角的装备变化。事实上,由于装备目前只有两个状态,我们完全可以只使用一个布尔值变量来替代。

class Heroine
{// Other code...private:HeroineState* state_;HeroineState* equipment_;
};

当主角派发输入事件给状态类时,需要给两种状态都派发一下。

void Heroine::handleInput(Input input)
{state_->handleInput(*this, input);equipment_->handleInput(*this, input);
}

这样每一个状态机都可以响应输入事件并以此切换状态而不用考虑其他状态机的实现细节。当两个状态没什么关系的时候,这种方法工作得很好。

功能更加完备的系统可能会让一个状态机来处理输入,以便另外一个状态机不会接收到输入。这样将能防止两个状态机对同一输入进行错误的响应。
在实际中,你可能会发现你需要对某些状态处理进行干预。比如,如果主角不能够在跳跃的过程中开火,或者她在装备武器的时候不能俯冲。为了处理这种情况,在代码里面,对于每一个状态,你可能需要做一些简单的if判断并做出特殊处理。虽然这可能不是最好的解决方案,但是至少它可以完成任务。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/395976.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

洛阳师范学院计算机科学与技术专业怎么样,2019洛阳师范学院专业排名

洛阳师范学院是一所省属普通高等本科院校,学校大力实施"人才兴校"战略,形成了一支结构合理、素质优良的师资队伍。为了让大家更好的了解这所大学的专业排名,下面是学习啦小编给大家带来的洛阳师范学院专业排名,供大家参…

MobaXterm 错行,乱码

最近使用MobaXterm ssh,发现进入ssh显示中文没问题。但如果用VIM编辑文件时如果有中文,修改插入操作有时就会有串行乱码情况,改vim编码也不行。都没有完美解决。最后发现只需要在MobaXterm 的设置中把字体换一个问题就都解决了。 转载于:https://www.cnb…

一个数据仓库转型者眼中的数据挖掘

一个数据仓库转型者眼中的数据挖掘 对于大多数非从业者或者初学者来说,数据仓库(Data Warehousing)与数据挖掘(Data Mining)是很容易混淆的两个概念。有个形象的比喻说:如果把数据仓库比做一个大型的矿坑&a…

mysql的告警日志_运维日记|MySQL关于aborted告警日志的分析

又是一个季度一次的现场巡检,期待数据库能跑的又快又稳,毕竟这是对DBA最大的馈赠了。​结果不遂人意发现在错误日志内存在大量的如下报错:查看当前数据库的状态值:查看数据库关于数据库会话的关键参数:数据库环境及相关…

2017年Spring发布了30个新的Android库,值得您关注

by Michal Bialas由Michal Bialas 2017年Spring推出的30个最酷的Android库 (The 30 Coolest Android Libraries from Spring 2017) These are my 30 favorite new Android libraries that have come out since March 2017. Some of them aren’t production ready yet, but yo…

《异构信息网络挖掘: 原理和方法(1)》一第2章 基于排名的聚类

本节书摘来自华章出版社《异构信息网络挖掘: 原理和方法(1)》一书中的第2章,作者[美]孙艺洲(Yizhou Sun)韩家炜(Jiawei Han),更多章节内容可以访问云栖社区“华章计算机”…

html怎样将单元格的字竖式,数学竖式计算的标准格式是怎样的?需要注意哪些问题?...

小学阶段数学计算题是重中之重,也是为日后打基础的时间段,所以在小学的时候,要让孩子熟练掌握数学计算。数学计算在这段时期一般比较简单,通常情况下学生可以采用口算、心算的形式,但是有的学生因为这两个能力不强。于…

Windows类标识符及其妙用

Windows类标识符 百度百科这样解释: Windows的类标识符class identifier也称为CLASSID或CLSID,是与某一个类对象相联系的唯一标记(UUID)。一个准备创建多个对象的类对象应将其CLSID注册到系统注册数据库的任务表中,以使客户能够定位并装载与该…

mysql用创建的用户登陆并修改表格_MySQL 基础学习二:创建一个用户表,并增删改查...

MySQL 基础学习二:创建一个用户表,并 增删改查提示:MySQL 命令建议都用大写,因为小写运行时,还是翻译成大写的。第一步,创建一个用户表1,打开控制台,进入数据库C:\Users\Administrator>MySQL -u root -p2,查看有什么数据库MySQ…

《软件工程(第4版?修订版)》—第1章1.5节 系统的方法

本节书摘来自异步社区《软件工程(第4版?修订版)》一书中的第1章1.5节 系统的方法,作者【美】Shari Lawrence Pfleeger , 【加】Joanne M.Atlee,更多章节内容可以访问云栖社区“异步社区”公众号查看。 1.5 系统的方法软件工程&am…

2-2 用Python爬取银河演员网上的演员参演电影的信息进行抓取

脚本中用到的actors_use.csv为之前从豆瓣上抓取的演员列表。 1 galaxyactors.py2 # -*- coding: utf-8 -*-3 #该脚本可以按照文件actors_use.csv中给出的演员的姓名4 #对银河演员网http://www.8fkd.com/上的演员参演电影的信息进行抓取5 #信息包括演员参演电影和电影日期&#…

在c语言中,以r方式不能打开并不存在的文件,C语言文件选择题

C语言文件选择题(答案在最后)1、标准库函数fgets(s,n,f)的功能是A) 从文件f中读取长度为n的字符串存入指针s所指的内存B) 从文件f中读取长度不超过n-1的字符串存入指针s所指的内存C) 从文件f中读取n个字符串存入指针s所指的内存D) 从文件f中读取长度为n-1的字符串存入指针s所指…

动脑2017android_您肯定要在2017年初尝试的25个新Android库

动脑2017androidby Michal Bialas由Michal Bialas 您肯定要在2017年初试用的25个Android库 (25 Android libraries you definitely want to try out in early 2017) This is a list of 25 best Android libraries released in January and February 2017. All of these are wo…

linux中安装多个mysql_liunx系统下安装多个MySql数据库并做主从配置

在网上搜索了很多资料,都没有看到像样的文档,思路不是很清晰,对第一次安装的朋友来说较为困难,经过长时间的安装尝试和查询网上零碎的知识点,终于成功的完成Linux系统下多MySql数据库安装和主从配置,现在分…

034_nginx报错总结

一、nginx: [emerg] "client_header_timeout" directive is not allowed here in /opt/nginx/conf/vhost.d/newton-api.uuwatch.com.conf:24 location / { client_body_timeout 5s;client_header_timeout 3s; #配置参数报错proxy_set_header X-Forwarded-For …

江苏省高等学校计算机一级成绩查询,江苏计算机一级考试成绩查询

想要了解江苏2020年9月计算机一级考试成绩查询入口的小伙伴快来看看吧!下面由出国留学网小编为你精心准备了“江苏2020年9月计算机一级考试成绩查询入口公布”,持续关注本站将可以持续获取更多的考试资讯!江苏2020年9月计算机一级考试成绩查询…

Linux中mongodb安装和导出为json

采用官方工具导出mongo数据为json格式 文档:https://docs.mongodb.com/manual/reference/program/mongoexport/ 可以远程导出,只要有host:port即可。 首先需要安装tools: 在redhat中: 文档:https://docs.mongodb.com/manual/tutor…

《树莓派实战秘籍》——1.17 技巧17添加重启按钮

本节书摘来异步社区《树莓派实战秘籍》一书中的第1章,第1.17节,作者:【美】Ruth Suehle ,Tom Callaway,更多章节内容可以访问云栖社区“异步社区”公众号查看 1.17 技巧17添加重启按钮 树莓派实战秘籍也许你已经注意到Pi缺少了某…

dns是指网络域名系统_域名系统(DNS)是Internet的骨干。 这就是全部的运作方式。...

dns是指网络域名系统by Nikolas ODonnell由Nikolas ODonnell 域名系统(DNS)的工作方式以及如何使其变得更好。 (How the Domain Name System (DNS) works and how you can make it better.) The Domain Name System (DNS) is often referred to as the backbone of the intern…

07.敏捷项目管理——推测阶段笔记

00.推测阶段关注产品很项目——创造和理解产品结构、性能和故事功能清单以及发布计划。 01.发布计划会用到与产品规格、平台结构体系、资源、风险分析、业务约束以及目标进度等信息。 02.迭代计划和开发方法有两个至关重要的组成部分——短期迭代时间框和功能。 03.产品经理控制…