基於Java的移動遊戲開發入門 – JAVA編程語言程序開發技術文章

如果讀者有Java編程經驗,尤其是AWT和SWING的Java GUI開發經驗將十分有助於理解本文,盡管不是必需的。

   一、 引言
近來,移動遊戲在提供個人娛樂方面變得越來越流行。這種流行使得移動遊戲給手機用戶,遊戲出版商和手持設備制造者帶來豐厚的利潤;移動遊戲,在給遊戲開發者和相關人員帶來無數商機的同時,處於極為重要的樞紐位置。據估計,到2009年,全世界的手機玩傢有望達到兩億兩千萬之多,移動遊戲業將被規劃並擴展到一個更高層次,為手機用戶和手持設備制造者帶來更大的利潤份額。

  移動遊戲可以分為三大類:

  ·嵌入式遊戲:被硬編碼到移動手持設備系統中的遊戲,並隨著設備一同發佈。不久就會過時。例如:隨著諾基亞手機一同發行的貪吃蛇遊戲。

  ·SMS遊戲:通過發送文本消息來玩的遊戲-例如,把SMS消息發送到遊戲服務器-該服務器處理這些SMS消息,然後再通過SMS消息形式發送回結果。經常是以在線競賽和測驗形式出現。並不很流行,因為遊戲的費用將隨著把每一個SMS發送到遊戲服務器而逐步增加。

  ·瀏覽器遊戲:這些遊戲可以使用移動電話的內嵌微型瀏覽器(專用於移動設備的網絡瀏覽器)來玩,在線或離線的方式都可以。玩傢可以通過自己的手持設備或一個第三方遊戲供給者的遊戲Web站點的方式在線玩這樣的遊戲,或下載它們後離線玩。這一類遊戲又有很多種類,例如單人或者多人遊戲,網絡遊戲,離線遊戲,街機遊戲,等等。

  在這三種類型中,瀏覽器遊戲是今天最流行的移動遊戲類型,這是因為它們具有創新性和豐富的多媒體內容,引人入勝的表達與SMS遊戲相比的低價位優勢。本文將重點討論瀏覽器遊戲開發。今後,術語”移動遊戲”在本文專指”瀏覽器遊戲”。

  註意:本文集中於討論2D遊戲開發。因為今天流行的大部分的數字移動電話有很有限的資源(小的屏幕,有限的內存和圖形支持,繁瑣的鍵盤輸入),所以時下最適合於這些設備的也是最具有商業可行性的遊戲是2D遊戲。但是,隨著移動電話能力的不斷提高,3D遊戲在不久的將來將廣為流行。

  移動遊戲可用C++,Java(J2ME),還有Qualcomm公司的Binary Runtime Environment for Wireless(BREW)平臺來進行開發。

   二、 為什麼選擇Java進行移動遊戲開發?

  盡管C++能夠被編譯成本機代碼並且可以直接存取本機系統資源,以及與BREW(它允許開發者使用任何希望的語言,包括C++,Java,XML和Flash)相結合為移動遊戲開發者提供端到端的解決方案,但是Java仍然是進行移動遊戲開發的最流行的選擇。Java,或更精確的說是Java 2微型版本(J2ME)平臺,被認為是開發移動遊戲的最方便的語言。(要更多地瞭解J2ME,請參考”What is Java 2 Micro Edition?”)。J2ME如此流行的背後動力包括:

  ·J2ME遵循為大多數手持設備生產商所支持的工業標準,如今大多數的移動電話都支持Java開發。

  ·J2ME是一個自由的和開放的平臺。這使得開發人員投資很少,但卻提供給他們必需的靈活性以及大量的支持。

  ·它的高度可移植的特性(“書寫一次到處運行”)保證一部為一個品牌/類型的手持設備開發的遊戲應用程序,將可以工作在其它類型的支持Java的手持設備品牌/類型上。

  ·它特別為小型設備進行瞭優化,是輕量級的,高度安全的,因為在其上開發的應用程序不能存取或者影響運行在該手持設備上的其它應用程序。

  J2ME包含移動信息設備輪廓(MIDP)API,它的設計是為專門開發包括手機在內的移動設備應用程序,但切記它們的局限性和約束條件。而且,最新的MIDP 2.0版自己提供瞭一套完整的API以用於遊戲開發,這使得遊戲開發更為簡單和快捷。

  現在,我們探索一下MIDP 2.0在移動遊戲開發環境中的使用。

   三、 MIDP2.0在遊戲開發中的地位

  MIDP2.0 API是一組具有特別性能的API,可用於開發安全的,內容豐富的多媒體應用軟件,包括適合於移動設備的遊戲程序。MIDP 2.0基於以前的MIDP 1.0之上並提供一個更好的開發平臺以創建高效快速的移動設備應用程序。

  MIDP 2.0進一步提煉瞭MIDP 1.0的特性和有關功能。有關這些新特性的信息請參考What’s New in MIDP 2.0。新增添到MIDP上的重要特點之一是Game API,或更精確地說是javax.microedition.lcdui.game API包。通過該Game API,MIDP 2.0提供給遊戲開發者現成的程序模塊,這些模塊在早期的MIDP 1.0時是你必須從頭開始創建的。這些模塊以類的形式提供,用於創建和控制各種遊戲元素,如遊戲畫佈、精靈、層等等(後文將介紹)。這樣,MIDP 2.0大大減少瞭遊戲開發者的創作時間。

  進行遊戲開發必需的另外兩個MIDP 2.0 API包,在本文中也作瞭探索,它們是javax.microedition.midlet和javax.microedition.lcdui。
javax.microedition.midlet API包是開發各種類型的移動應用程序的基礎。它包含javax.microedition.midlet.MIDlet類,它是所有的基於J2ME的移動應用軟件(或稱為midlet)的基類,它必須由所有移動應用程序的main類加以擴展後使用。非常類似於java.applet.Applet類,MIDlet類提供創建midlet程序的必要的資源。

  javax.microedition.lcdui API包是開發各種類型的移動應用程序的用戶接口所必需的。這個API提供類來創建和控制UI部件(例如屏幕,表單,文本框,單選按鈕,等等)並且處理包括遊戲在內的移動應用程序的輸入。有使用AWT和SWING GUI開發經驗的開發者會發現javax.microedition.lcdui包中的元素非常相似於這些API中的元素。

  我將在本文的示例遊戲開發期間討論這些API中的和遊戲開發相關的元素。
四、 構建示例遊戲

  為瞭更好地理解這些API和它們各自的類,你最好動手開發一個簡單的移動遊戲。這裡是一個單人的離線遊戲,通過障礙物線路的駕車遊戲。玩傢使用左鍵和右鍵用於改變車的方向到左邊或者右邊以防止與障礙物的碰撞。遊戲在發生碰撞並顯示得分後結束。該遊戲命名為HardDrive。

  註意:雖然這個示例遊戲是使用J2ME Wireless Toolkit 2.1_01和J2SE 1.4.2_07 SDK在Windows 2000平臺上開發的,但是,其它版本的與另外一些平臺相匹配的Wireless Toolkit和J2SE SDK也可以利用。

  現在開始構建遊戲程序HardDrive。從前一節中得知,你第一個需要開發的程序是HardDriveMIDlet(HardDriveMIDlet.java),它擴展瞭javax.microedition.midlet.MIDlet類。

  (一) HardDriveMIDlet.java

  列表1.1:該代碼片斷來自於文件HardDriveMIDlet.java

import javax.microedition.midlet.MIDlet;
import javax.microedition.lcdui.*;
public class HardDriveMIDlet extends MIDlet implements CommandListener {
… … … … … … … …

  HardDriveMIDlet還實現瞭javax.microedition.lcdui.CommandListener接口來接收命令事件,它們是在應用程序執行和處理期間產生的。當發出EXIT,CANCEL,BACK,OK,STOP以及類似的命令-這些命令通過使用軟按鈕(在移動電話屏幕附近的特殊的按鈕,除瞭箭頭鍵以外)產生並被HardDriveMIDlet的commandAction()方法所處理-時,這些命令事件發生。為瞭提高效率,可把這些命令添加到畫佈上去。

  HardDriveMIDlet用作所有canvas的容器,這些canvas是一些描述可用於在移動設備屏幕上進行繪制的對象。這裡,midlet包含瞭HardDriveCanvas,它擴展瞭javax.microedition.lcdui.game.GameCanvas類。GameCanvas是一個專門的畫佈,用於為遊戲程序繪制有效的動畫圖像,還能夠查詢為實現平滑動畫效果而采取的脫屏圖像緩沖技術有關的關鍵狀態。

  HardDriveMIDlet包含的另外的一個canvas是GameOverCanvas,它擴展瞭javax.microedition.lcdui.Canvas類。Canvas是一個簡單canvas,用於繪制文本,線段以及簡單的形狀等。當需要在屏幕上進行簡單的繪制時-例如為顯示遊戲初啟畫面,遊戲結束屏幕以及遊戲指令屏幕-這個canvas被擴展,而取代瞭繁重的繪制。一個遊戲程序的midlet可以包括任何個數的canvas,但是每次僅顯示一個canvas,這是通過使用javax.microedition.lcdui.Display類的setCurrent()方法來實現的。

  HardDriveMIDlet還包含3個另外的重要方法,也稱作lifecycle方法。它們是startApp()、pauseApp()和destroyApp(),分別相應於該midlet的Active,Paused和Destroyed狀態。在HardDriveMIDlet的startApp()方法中,實現實例化HardDriveCanvas並通過使用HardDriveCanvas類的方法addCommand()把EXIT命令添加到它上面去。

  (二) HardDriveCanvas.java

  HardDriveCanvas實現瞭一個java.lang.Runnable接口來使它自己可以運行在自己的線程中,這對於獨立地執行遊戲循環是必需的。該遊戲循環被連續不斷地執行,直到終止遊戲的必備條件滿足為止(在本例中,當汽車碰撞到障礙物上或者在任何時候當玩傢使用Exit按鈕退出遊戲)。

  列表1.2:文件HardDriveCanvas.java中的遊戲循環

public void start()
{
gameRunning = true;
Thread gameThread = new Thread(this);
gameThread.start();
}
… … … …
… … … …
public void run()
{
Graphics g = getGraphics();
//… … …一些代碼
while (gameRunning) //遊戲循環
{
tick();
input();
render(g);
//… … …一些代碼
try
{
Thread.sleep(timeStep );
//… … … …一些代碼
}
catch (InterruptedException ie) { stop(); }
}

  列表1.2顯示HardDriveCanvas.java中的遊戲循環。這是一典型遊戲循環,它包含瞭依次對tick(),input()和render()方法的調用。tick()方法檢查是否停止該遊戲的必需條件已經滿足;如果滿足

發佈留言