1. 程式人生 > >基礎知識漫談(3) 組合基礎知識,設計遊戲框架 如何讓畫面動起來?

基礎知識漫談(3) 組合基礎知識,設計遊戲框架 如何讓畫面動起來?

如何讓畫面動起來?

都知道動畫的原理,想想看跑馬燈,在任意時刻把跑馬燈按停,面對眼睛的那附圖,它叫做幀(Frame)。

幀,就是一串兒連貫動畫裡的單個截面

玩兒遊戲的人知道,要達到基本流暢的水準,30fps(frame per second)就夠了,達到毫無察覺的流暢,可能要到60fps,那麼,介面以30~60次每秒的頻率重繪,畫面不就動起來了?

 

在本篇文章裡,將解釋常見的基礎概念生命週期到底是怎麼回事。

 

要寫一個遊戲框架啦,首先,還是對遊戲進行建模,從兩個方面進行,一個是遊戲的實體結構,一個是遊戲的執行流程(也就是生命週期)。

1、結構分析

市面上很多遊戲,在切換場景的時候,都會進入一個loading介面,參考這個現象可以推論出,遊戲是由一個個場景構成。

(loading介面用於載入資源,無論是啟動遊戲時候一次性loading,還是過程中非同步loading又或者切換場景時候loading,都屬於載入策略,這裡暫不討論。)

有了場景了,就要考慮遊戲背景,背景有可能是一份image,也有可能是複雜的動態生成的地形。

除此之外,還有遊戲角色,物品等物件。先就這幾個來做個簡單的建模:

 

 

 

 

想想上一章說過的內容,Scene可以視為複合控制元件,BgPainter執行Scene的背景繪製,Role和Item都是單一控制元件。

當呼叫Scene的繪製方法時,會首先觸發BgPainter的繪製,然後迭代所有的Role和Item,進行繪製。一次繪製方法的呼叫,視為一幀

 

2、流程分析

一個場景從載入到結束的過程,稱之為場景的生命週期。

我把該生命週期劃分為以下幾個步驟:

 

 

其中,載入、啟動、停止、銷燬,在整個生命週期中,只會執行一次。而繼續態會多次出現(可以考慮是根據幀率來不斷提出繼續請求),主動發起暫停請求的時候,才會進入暫停態。

圖是畫出來了,程式碼怎麼寫呢?

一般來說,實現生命週期管理,可以使用狀態機模式

參見如下偽碼:

 

複製程式碼

 1 define Scene{
 2     //空白狀態
 3     status=NONE;
 4     //時鐘頻率
 5     frequence=150;
 6 
 7     /**
 8     *接收請求並修改狀態和頻率
 9     */
10     void performRequest(Request req){
11         status=req.status;
12         frequence=req.frequence;
13 
14         if(isRunning){
15             //停止迴圈呼叫
16             stopInterval();
17         }
18         //啟動迴圈呼叫,執行方式是根據frequence間隔來呼叫refresh方法
19         startInterval();
20 }
21 
22 
23 /**
24 *重新整理
25 */
26 void refresh(){
27     //根據請求型別來決定執行
28     switch(status){
29     case LOADING:
30     if(loaded)
31         status=START;
32     else if(!loading)
33         onLoading();
34     break;
35     case START:
36         if(started)
37         status=RESUME;
38         else if(!starting)
39         onStart();
40         break;
41     case RESUME:
42         resume();
43         break;
44     case PAUSE:
45         if(!paused)
46         pause();
47         break;
48     case STOP:
49         if(!stopped&&!stopping)
50         stop();
51         break;
52     case DESTROY:
53         if(stopped&&!destroyed)
54         destroy();
55         break;
56     }
57 }
58 void loading(){
59 loading=true;
60 //載入loading頁,載入完成後回撥
61 loading=false,loaded=true;
62 }
63 void resume(){
64 //繪製地圖
65 //繪製所有角色
66 //繪製所有物品
67 }
68 }                                                    

複製程式碼

 

 

這段狀態機實現保證了幾點:

1、loading、start、stop三個狀態,無論出現多少次,都只會執行對應函式一次。

2、loading、start對應函式執行完成之後,會修改當前場景的狀態,進入下一個步驟。

3、resume、pause狀態,可以隨時切換

 

啟動方式如下所示

scene.performRequest({status=LOADING,freqence=150});

如果希望暫停,自然也可以使用

scene.performRequest({status=PAUSE,freqence=150});

 

一個結構簡單的動畫框架就這樣完成了。下一章來講解一個數據分析框架,可以用於各種不同型別的資料格式之間的互相轉化,比如Json<->java例項,xml<->java例項,或者xml<->Json

 

特此宣告:因此文章個人認為總結的很到位,很有價值,特此轉載!轉載地址:http://www.cnblogs.com/anrainie/p/5614461.html