《游戲編程模式》筆記——狀態(tài)模式
有限狀態(tài)機(jī)
說到狀態(tài)模式不得不提一下有限狀態(tài)機(jī)。
一個(gè)事物,有多個(gè)狀態(tài)但是數(shù)量有限,同一時(shí)間只能處在一種狀態(tài)下,可以根據(jù)條件相互切換,就是有限狀態(tài)機(jī)。
我們用游戲里的寶箱來舉例子。
寶箱有三種狀態(tài),上鎖,關(guān)閉,打開。
上鎖狀態(tài)時(shí),我們需要消耗鑰匙才可以打開寶箱拿走里面的道具,并且寶箱會(huì)進(jìn)入打開狀態(tài)。
如果我們沒有要是,就會(huì)提醒我們需要鑰匙才能打開,寶箱依然保持上鎖狀態(tài)。
我們消耗了要是打開了寶箱,但是我們的道具數(shù)量已經(jīng)達(dá)到了上限,所以只能把道具放回寶箱里,但是鎖已經(jīng)開了,所以寶箱會(huì)進(jìn)入關(guān)閉狀態(tài)。
等我們消耗了道具以后再把道具取走,寶箱又會(huì)進(jìn)入打開狀態(tài)。
只是一個(gè)簡單的寶箱邏輯,寫起來還不是很復(fù)雜,如果是一個(gè)角色的控制器,角色擁有站立、行走、奔跑、跳躍、攻擊、攀墻、射擊等多個(gè)狀態(tài),case?的數(shù)量就會(huì)隨著狀態(tài)增加,并且會(huì)添加大量的if判斷,增加?Trigger?函數(shù)的復(fù)雜度。
這時(shí)就可是使用狀態(tài)模式。
狀態(tài)模式
狀態(tài)模式,將每個(gè)狀態(tài)都封裝成單獨(dú)的類,在自己的內(nèi)部處理邏輯,切換狀態(tài)時(shí)切換引用的狀態(tài)對(duì)象,從而執(zhí)行對(duì)應(yīng)狀態(tài)的邏輯。
定義一個(gè)寶箱的狀態(tài)接口,它僅有一個(gè)用來執(zhí)行邏輯的函數(shù)。
再創(chuàng)建寶箱的狀態(tài)類并實(shí)現(xiàn)狀態(tài)接口。
最后修改寶箱類,將枚舉改為寶箱狀態(tài)接口類型,并提供一個(gè)觸發(fā)函數(shù)和一個(gè)設(shè)置狀態(tài)的函數(shù)。
觸發(fā)函數(shù)用來執(zhí)行寶箱的觸發(fā)邏輯,當(dāng)玩家與寶箱交互的時(shí)候調(diào)用這個(gè)函數(shù),而它調(diào)用狀態(tài)對(duì)象的觸發(fā)函數(shù)來執(zhí)行當(dāng)前狀態(tài)的邏輯。
修改狀態(tài)的函數(shù)用來修改當(dāng)前狀態(tài),主要給狀態(tài)對(duì)象使用,狀態(tài)對(duì)象在執(zhí)行邏輯時(shí)根據(jù)情況調(diào)用寶箱的設(shè)置狀態(tài)函數(shù)來修改寶箱的狀態(tài)。
至此,便完成了狀態(tài)模式的簡單實(shí)現(xiàn)。
好處
那么這么做到底有什么好處呢?
假設(shè)我們的邏輯更復(fù)雜一些,每個(gè)狀態(tài)都只需要在自己的類里面去增加變量或函數(shù)去處理,只需要關(guān)注自身所需要關(guān)注的事物。
壞處
但是也有壞處,這樣做勢必會(huì)增加結(jié)構(gòu)上的復(fù)雜度,使用不當(dāng)會(huì)造成結(jié)構(gòu)和代碼的混亂。
增加新的狀態(tài)也要去其他的類里面修改代碼來保證狀態(tài)直接的切換。
參考
《游戲編程模式》