遊戲狀態管理之C 實現

2021-03-31 23:07:20 字數 3291 閱讀 4420

遊戲狀態管理之c++

實現

managing game states in c++

tonyandpaige.***

翻譯:mythma

多年前看的乙個

demo

使我第一次完全明白了遊戲中的不同狀態。這個

demo

能夠從乙個特效平滑的過渡到另乙個特效,並能從

2d漩渦效果直接過渡到

3d渲染環境,就像是幾個不同的程式寫成的。

多狀態不僅在

demo

中重要,在遊戲中也同樣重要。每個遊戲程式基本上都是從介紹

開始,顯示選單,然後進行遊戲。當被擊敗時,遊戲就結束了(通常返回到選單介面)。大多數遊戲中,很可能會同時出現多個狀態——比如遊戲過程中彈出選單。

傳統的處理多狀態的方式是使用一大堆的if,

switch

和loop

語句。程式從介紹狀態

開始一直迴圈,直到按下乙個鍵;然後選單就顯示了,直到完成了選擇操作;遊戲開始了,就一直迴圈,直到遊戲結束。每一次遊戲迴圈,程式還得檢查是應該顯示選單還是簡單的繪製下一幀。而且,處理事件的那部分程式還必須判斷輸入究竟是選單來相應還是遊戲來相應。所有的這些組合起來就形成了乙個主迴圈,可以發現這個大雜燴很難理解,並且除錯和維護起來也不方便。

狀態是什麼呢?(what』s a state?)

遊戲狀態就像是遊戲的乙個單獨的程式。每個狀態需要以不同的方式處理事件,需要在螢幕上繪製不同的內容。每個狀態還需要處理它自己的事件、更新遊戲場景、繪製下一幀等等。因此,我們可以確定狀態應該至少擁有三個方法。

狀態又應該能夠載入圖形、自初始化、釋放資源。並且有時狀態還需要暫停,還要能夠恢復。

到此為止,狀態類就應該看起來如下所示:

class

cgamestate

;

上面的狀態類設計應該能夠滿足遊戲的狀態需求。把它當作基類,從它可以派生出遊戲所需要的每一種狀態——介紹狀態(

intro state

)、選單狀態(

menu state

)、遊戲狀態(

play state

)等等。

狀態管理器(the state manager

接下來,我們需要乙個管理狀態的方法——狀態管理器。狀態管理器是遊戲引擎本身的一部分。別人可能會選擇建立乙個單獨的狀態管理類,而我只是把它直接加到引擎中。我們先來看看乙個遊戲引擎能做什麼,然後再設計乙個類來完成這些功能。

我們的這個例子很簡單,整個引擎需要做到是初始化

sdl和完成後的清理工作。由於在主迴圈需要用到這個引擎,因此需要檢查引擎是否仍然在執行、是否退出,以及處理事件、更新遊戲、繪製幀序列。

狀態管理器實際上很簡單。我們用

「狀態棧」來管理各種不同的遊戲狀態。在此用

stl的

vector

來實現狀態棧。除此之外,還需要改變狀態的方法,以及入棧和出棧方法。

至此,遊戲引擎類就如下所示:

class

cgameengine

void quit()

private:

// the stack of states

vector

states;

bool m_running;

};

這些成員函式中有幾個非常簡單的——

handleevents(), update()

和draw()

。它們只需簡單的呼叫棧頂狀態物件相應的成員函式即可。由於需要經常訪問遊戲引擎中的資料,因此需要在以上三個成員函式中加乙個指向引擎指標的引數。

最後需要考慮的是狀態之間的切換。引擎如何知道狀態何時切換到另乙個狀態?答案是:它不知道。只有當前的狀態知道什麼時候轉向下乙個狀態。於是,我們又需要為狀態類加乙個改變狀態的成員函式。

對於狀態類時,我們把它設計為乙個抽象基類——它的大部分成員函式設計為純虛函式。這就保證了它的子類都必須得實現這些方法。經過這些更改後,最後的遊戲狀態類如下所示:

class

cgamestate

protected:

cgamestate() 

};

現在要為遊戲增加狀態就非常簡單了,只需從基類繼承乙個子類,實現那幾個純虛函式就可以了。對於某種狀態,在遊戲中只需乙個例項,因此把它們設計成

singleton

模式是個不錯的選擇。

這種方法究竟能夠把遊戲簡化到什麼程度,如下所示的

main.cpp

中包含的所有**可以說明:

int

main ( int argc, char *argv )

// cleanup the engine

game.cleanup();

return 0;

}

downloads

這個例子裡包含了三個不同的狀態——

introduction state

,playing state

,pauses state

。每種狀態都用一幅背景來表示。

·stateman.zip

- tutorial source, graphics, and project files for visual c++ 6.

·stateman.tar.gz

- tutorial source, graphics, and makefile for linux.

這個例子的**用的是

sdl。如果你不熟悉,可以

看一下這篇文章:

getting started with sdl

狀態管理之 redux dva vuex

日常積累,歡迎指正 redux 中 非同步處理 借助 redux saga 等工具實現 container 元件示例 import from react redux import from redux import from types todolist import from actions to...

狀態管理之Cookie

一 cookie 工作流程 如果在使用者請求站點中不僅僅是乙個頁面,還有乙個包含過期時間的 cookie 使用者的瀏覽器在獲得頁面的同時還獲得了該 cookie 並將它儲存在使用者硬碟上的某個資料夾中。以後,如果該使用者再次請求該站點,瀏覽器便會在本地硬碟上查詢與之關聯 cookie 如果該 coo...

狀態管理之Session

一 sessionid 會話識別符號 預設情況下,sessionid 儲存在瀏覽未到期會話的 cookie 中。如果要儲存在 url將 sessionstate 節點的cookieless 設定為true 二 session 模式預設是 inproc iis 程序中 stateserver 狀態服務...