河北福利彩票|天津福利彩票网
全國免費熱線:
>J2ME專業手機游戲開發基礎
作者:中國IT實驗室 點擊:6554次 日期:2012-01-09
字號::T | T
歡迎進入Java社區論壇,與200萬技術人員互動交流 >>進入
游戲的基本結構

       游戲是什么呢?在游戲中,往往是顯示各種各樣的畫面,玩家可以做一些設定好的控制,畫面根據玩家的控制有所變化。從這兒可以看出,游戲至少需要三個功能-顯示畫面,接受玩家輸入和對輸入產生反饋。這就是常說的渲染,輸入輸出和邏輯三個模塊。將這三個模塊組合在一起有很多方法。比如事件驅動-畫面保持不變直到接受到輸入事件,程序進行邏輯運算然后改變畫面。而游戲往往不是這樣,游戲是時間驅動的。也就是說無論有沒有輸入,游戲都在不停的循環-檢查是否有輸入,運行邏輯,渲染畫面。這里我多說一句,其實什么樣的結構并不能區別一個程序是不是游戲,其實只要可以互動娛樂的程序就可以稱為游戲,也不一定要用時間驅動,但采用時間驅動是專業游戲的普遍做法,也是很容易接受的方法-因為從一定程度上講,游戲很像電影,隨著時間流逝畫面在改變。

       既然是時間驅動,游戲中就會有幀的概念。所謂幀就是某個時刻顯示在屏幕上的畫面。從整體上看,游戲就是一系列的幀不斷播放著,像動畫片一樣,不過玩家可以通過交互改變播放的內容。而我們開發游戲的主要任務就是安排每一幀的內容。在每一次游戲循環中,我們需要搜集玩家的輸入、運行邏輯以更新游戲的數據、根據更新后的數據安排下一幀顯示的內容。 所以一個最簡單的游戲結構就是:

0 初始化游戲
1 是否結束游戲(Yes:轉到6)
2 搜集玩家輸入信息
3 運行游戲邏輯
4 更新下一幀,顯示下一幀
5 回到1
6 清理,結束游戲
       這是一個最基本的結構,特別對于比較簡單的J2ME游戲來說,這個結構更加有代表性。下面我們將分別講述專業手機游戲如何實現這個結構中的各個內容。

 
 游戲循環的實現
       我們需要一個進入后就一直循環下去直到游戲結束的結構。線程正好可以實現。最通常的做法是讓Canvas實現Runnable接口。于是我們就可以實現run方法。下面是一個run方法簡化版:

public void run()

{

                        exitMidlet = false ;

                         long startTime = 0 ;

                        long timeCount = 0 ;

                        gameInit() ;

                        int curKey = 0 ;

                        while (!exitMidlet) {

                                    startTime = System.currentTimeMillis();  

                                    //acquire key

                                    acquireKey() ;

                                    //call game loop

                                    gameLoop() ;

                                    //repaint the screen

                                    repaint();

                                    serviceRepaints();

                                    frameCount++ ;   

                                    //lock fps 

                                    timeCount = MIN_DELAY - (System.currentTimeMillis() - startTime);

                                    timeCount = (timeCount<1)?1:timeCount ;    

                                    try {

                                                Thread.sleep(timeCount);

                                    } catch (InterruptedException ex) {}

                        }

                        endMidlet() ;

} 

    看到我們的while循環了嗎?除非在程序邏輯中設定exitMidlettrue-那是當玩家選擇了退出游戲,我們的游戲將一直運行下去。在while循環之前,gameInit方法的作用是進行游戲初始化-比如初始化變量值,載入全局數據,生成全局對象等。在while循環中,我們先是調用了acquireKey方法,這個方法將鍵盤輸入信息進行緩沖以便邏輯中判斷按鍵狀態,下面講會講到鍵盤緩沖。gameLoop是我們游戲的主體,每幀中的邏輯運算,圖形處理都在這里面進行。然后是repaintserviceRepaints,刷新屏幕-新的一幀呈現在屏幕上。最后當跳出while之后,我們執行endMidlet結束這個MidletendMidlet的內容只是調用了destroyAppnotifyDestroyed方法。好了整個游戲循環就是這樣了,下面講分別講述鍵盤緩沖和gameLoop如何組織。不過再這之前先讓我解釋下lock fpsFPS就是Frame per second。為了防止游戲在不同的機器上速度變化太大,我們設定一個最大的FPS值,或者說設置一個每幀至少要花費的時間(這里的MIN_DELAY)。比如我們設置MIN_DELAY50,那么max FPS = 1000/50 = 20 /秒。鎖定FPS有多種方法,這里的方法是判斷如果一幀所有的時間還沒達到最大時間,那么就讓線程sleep一會兒。順便在說一下FPS的計算,顧名思義用1000除以一幀所有時間即可,不過要注意的是,一般計算的FPS是平均FPS,所以FPS=累計幀數*1000/累計花費時間。

[1] [2] [3] [4] 下一頁

發表評論

昵稱 * 驗證碼 * 驗證碼
上一篇: >詳解基于J2ME平臺下SOAP協議的應用
下一篇: >用JAVA開發手機游戲需要如何構建開發環境
河北福利彩票 秒速快三单双最稳法 电子投注单如何购买 骰子豹子是几个 十一选五任选8万能9码 今日足彩对阵 六码中特王中王 分分彩后二组选复式杀号技巧 时时彩倍投怎样稳赚 组3中奖多少钱 12选5胆拖投注技巧