《游戲編程模式》一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.pswp.cn/news/395976.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/395976.shtml
英文地址,請注明出處:http://en.pswp.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.產品經理控制…