日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2023/11/29 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《游戏编程模式》一7.8 并发状态机 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本節(jié)書摘來異步社區(qū)《游戲編程模式》一書中的第7章,第7.8節(jié),作者: 【美】Robert Nystrom (尼斯卓姆) 譯者: 趙衛(wèi)兵 , 許新星 , 姜召陽 , 陳侃 , 屈光輝 , 鄭炯彬 責(zé)編: 陳冀康,更多章節(jié)內(nèi)容可以訪問云棲社區(qū)“異步社區(qū)”公眾號(hào)查看。

7.8 并發(fā)狀態(tài)機(jī)

我們決定給我們的主角添加持槍功能。當(dāng)她持槍的時(shí)候,她仍然可以:跑、跳和躲避等。但是,她也需要能夠在這些狀態(tài)過程中開火。

如果你執(zhí)著于傳統(tǒng)的有限狀態(tài)機(jī),那我們可能需要把之前的狀態(tài)加倍。對(duì)于每一個(gè)已經(jīng)存在的狀態(tài),我們需要定義另一個(gè)狀態(tài),它做的事情也差不多,不過就是多了持槍的操作。比如站立狀態(tài)和站立開火狀態(tài),跳躍狀態(tài)和跳躍開火狀態(tài)等。

如果我們添加更多的武器種類,那么這個(gè)狀態(tài)數(shù)量將會(huì)急劇增加。而且不僅僅是增加了大量的狀態(tài)類實(shí)例,它還會(huì)增加大量的冗余,實(shí)際上帶不帶槍的狀態(tài)僅有是否包含開火代碼的區(qū)別而已。

這里的問題是,我們把兩種狀態(tài)雜合在一起了。我們把兩種不同的狀態(tài)硬塞到一個(gè)狀態(tài)機(jī)里面去了。為所有可能出現(xiàn)的組合建模,我們可能需要為每一種狀態(tài)準(zhǔn)備一組狀態(tài)。解決方法比較直觀,就是分開成兩個(gè)狀態(tài)機(jī)。

如果我們需要為主角定義n種狀態(tài)和m種它能夠攜帶的武器狀態(tài),如果使用一個(gè)狀態(tài)機(jī)來表示,那么我們需要n×m個(gè)狀態(tài)。而如果使用兩個(gè)狀態(tài)機(jī),那么狀態(tài)組合僅是n+m。

首先我們可以保留原有的狀態(tài)機(jī)的代碼和功能不管它。接下來,我們定義一個(gè)單獨(dú)的狀態(tài)機(jī),用來處理主角攜帶的武器。現(xiàn)在,我們的主角會(huì)有兩個(gè)狀態(tài)索引,其中一個(gè)看起來如下所示:

為了便于示例說明,我們這里使用了完整的狀態(tài)模式來處理女主角的裝備變化。事實(shí)上,由于裝備目前只有兩個(gè)狀態(tài),我們完全可以只使用一個(gè)布爾值變量來替代。

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

當(dāng)主角派發(fā)輸入事件給狀態(tài)類時(shí),需要給兩種狀態(tài)都派發(fā)一下。

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

這樣每一個(gè)狀態(tài)機(jī)都可以響應(yīng)輸入事件并以此切換狀態(tài)而不用考慮其他狀態(tài)機(jī)的實(shí)現(xiàn)細(xì)節(jié)。當(dāng)兩個(gè)狀態(tài)沒什么關(guān)系的時(shí)候,這種方法工作得很好。

功能更加完備的系統(tǒng)可能會(huì)讓一個(gè)狀態(tài)機(jī)來處理輸入,以便另外一個(gè)狀態(tài)機(jī)不會(huì)接收到輸入。這樣將能防止兩個(gè)狀態(tài)機(jī)對(duì)同一輸入進(jìn)行錯(cuò)誤的響應(yīng)。
在實(shí)際中,你可能會(huì)發(fā)現(xiàn)你需要對(duì)某些狀態(tài)處理進(jìn)行干預(yù)。比如,如果主角不能夠在跳躍的過程中開火,或者她在裝備武器的時(shí)候不能俯沖。為了處理這種情況,在代碼里面,對(duì)于每一個(gè)狀態(tài),你可能需要做一些簡單的if判斷并做出特殊處理。雖然這可能不是最好的解決方案,但是至少它可以完成任務(wù)。

總結(jié)

以上是生活随笔為你收集整理的《游戏编程模式》一7.8 并发状态机的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。