日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

魂淡1994的博客,有限狀態(tài)機(jī)

能不能通俗的講解下什么是狀態(tài)機(jī)?

魂淡1994的博客,有限狀態(tài)機(jī)


有限狀態(tài)機(jī):這是個(gè)啥?如果你有關(guān)注YoYo Games的官方技術(shù)博客,也許你曾經(jīng)見過這篇文章,這篇文章很好的解釋了什么事狀態(tài)機(jī),強(qiáng)烈對(duì)此有興趣的朋友仔細(xì)閱讀,不過我會(huì)先簡(jiǎn)單定義一下 。一個(gè)有限狀態(tài)機(jī)(后文以狀態(tài)機(jī)縮寫指代)是一種特殊的組織代碼的方式,用這種方式你能確保你的對(duì)象隨時(shí)都知道自己所處的狀態(tài)以及所能做的操作 。
其中每一個(gè)狀態(tài)都是獨(dú)立的代碼塊,與其他不同的狀態(tài)分開獨(dú)立運(yùn)行,這么做可以使得游戲的調(diào)試變得更加方便,同時(shí)也更易于增加新的功能(比如一些特殊的能力和動(dòng)畫之類) 。玩家角色在跳躍的時(shí)候看起來有點(diǎn)奇怪?那就直接去“跳躍”的狀態(tài)里找問題吧!同樣這個(gè)機(jī)制也可以用于給敵人實(shí)現(xiàn)基本的AI邏輯,讓敵人可以根據(jù)狀態(tài)做出不同的決策 。
【魂淡1994的博客,有限狀態(tài)機(jī)】恰好狀態(tài)機(jī)機(jī)制是本月挑戰(zhàn)里的“專家級(jí)”難度,但我十分希望當(dāng)我剛開始學(xué)習(xí)編程時(shí)就能了解這個(gè)知識(shí)點(diǎn),正確運(yùn)用狀態(tài)機(jī)可以為你免去很多不必要的麻煩 。接下來我們就來看一下如何使用吧 。有限狀態(tài)機(jī)適合我的項(xiàng)目嗎?這個(gè)問題儼然是“世上沒有愚蠢的問題”這句話的最佳反證 。狀態(tài)機(jī)系統(tǒng)永遠(yuǎn)適合你的項(xiàng)目,這個(gè)問題可以修改成這樣“狀態(tài)機(jī)是否適合我這個(gè)對(duì)象?”確實(shí),并不是所有的對(duì)象都需要用上狀態(tài)機(jī)機(jī)制,但你可能會(huì)驚訝地發(fā)現(xiàn)有那么多對(duì)象都適合使用狀態(tài)機(jī)去進(jìn)行管理 。
顯然,可控的角色和敵人都需要使用狀態(tài)機(jī),但實(shí)際上我的游戲控制器對(duì)象也采用了這一機(jī)制,用來區(qū)分在主菜單、設(shè)置菜單和關(guān)卡選擇等不同的場(chǎng)景的用途,甚至我的鏡頭控制器也用了狀態(tài)機(jī),比方說“跟隨玩家狀態(tài)”,“過場(chǎng)動(dòng)畫狀態(tài)”和“顯示特定對(duì)象狀態(tài)”等等 。那么如何才能確認(rèn)某個(gè)對(duì)象需要使用狀態(tài)機(jī)呢?其實(shí)非常簡(jiǎn)單,對(duì)于每個(gè)對(duì)象都要問一問自己:“這個(gè)對(duì)象可以做些什么?”如果這個(gè)對(duì)象需要處理超過2件事情以上的功能,那你就應(yīng)該考慮去做一個(gè)狀態(tài)機(jī) 。
讓我們來試著問一下這個(gè)問題,比如馬里奧,尤其是在超級(jí)馬里奧世界里,馬里奧可以做什么呢?他可以:站立行走/跑躲閃跳爬墻顯然上面這個(gè)列表還有更多沒列出來的,但這是個(gè)好的開始 。因此,顯然馬里奧有很多事情可做,而且?guī)缀跛羞@些事情都是獨(dú)立的狀態(tài),那你現(xiàn)在就已經(jīng)有了一個(gè)對(duì)象應(yīng)該要做的功能列表了,現(xiàn)在是時(shí)候畫一個(gè)流程圖了 。
認(rèn)真臉:流程圖 。不開玩笑,港真,流程圖是你的好伙伴 。下面是幾個(gè)示例(從最上面那個(gè)鏈接里借用的)這是上一張圖的漢化版?設(shè)計(jì)好流程圖并梳理好你所有需要處理的狀態(tài)是非常重要的第一步 。在你正式開始編碼之前,你需要制定出基本的狀態(tài)和各自的規(guī)則 。你不需要徹底搞清楚你的角色能做到每一個(gè)操作,這是狀態(tài)機(jī)最棒的特性,它總是易于擴(kuò)展,但是基本的設(shè)計(jì)是非常重要的 。
OK,設(shè)計(jì)好了 。怎么實(shí)現(xiàn)呢?最好的辦法當(dāng)然是一頭扎進(jìn)去然后直接動(dòng)手了,是吧?為了讓這個(gè)過程變得更輕松簡(jiǎn)單,我做了一個(gè)小腳本可供使用點(diǎn)擊前往網(wǎng)盤下載腳本讓我們來看一下這個(gè)腳本并了解一下它是怎么工作的:state_machine_init()當(dāng)你在創(chuàng)建需要使用狀態(tài)機(jī)的對(duì)象時(shí),可以在Create事件中調(diào)用這個(gè)腳本 。
它會(huì)創(chuàng)建一對(duì)數(shù)據(jù)結(jié)構(gòu)和一系列十分有用的變量 。現(xiàn)在我們先來看看這些變量state - 這個(gè)變量是當(dāng)前狀態(tài)的標(biāo)志位 。這個(gè)腳本中將會(huì)包含在對(duì)象step事件中執(zhí)行的代碼 。state_next - 當(dāng)我們切換狀態(tài)時(shí),我們希望在切換之前當(dāng)前狀態(tài)能執(zhí)行完畢,因此我們調(diào)用這個(gè)腳本來切換狀態(tài),同時(shí)更新這個(gè)值,然后上述"state"變量將在"End Step"事件中發(fā)生變化 。

推薦閱讀