基礎知識漫談(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