JAVA入門 基于Java的移動游戲開發
如果讀者有Java編程經驗,尤其是AWT和SWING的Java GUI開發經驗將十分有助于理解本文,盡管不是必需的。
一、 引言
近來,移動游戲在提供個人娛樂方面變得越來越流行。這種流行使得移動游戲給手機用戶,游戲出版商和手持設備制造者帶來豐厚的利潤;移動游戲,在給游戲開發者和相關人員帶來無數商機的同時,處于極為重要的樞紐位置。據估計,到2009年,全世界的手機玩家有望達到兩億兩千萬之多,移動游戲業將被規劃并擴展到一個更高層次,為手機用戶和手持設備制造者帶來更大的利潤份額。
移動游戲可以分為三大類:
1、嵌入式游戲:被硬編碼到移動手持設備系統中的游戲,并隨著設備一同發布。不久就會過時。例如:隨著諾基亞手機一同發行的貪吃蛇游戲。
2、SMS游戲:通過發送文本消息來玩的游戲-例如,把SMS消息發送到游戲服務器-該服務器處理這些SMS消息,然后再通過SMS消息形式發送回結果。經常是以在線競賽和測驗形式出現。并不很流行,因為游戲的費用將隨著把每一個SMS發送到游戲服務器而逐步增加。
3、瀏覽器游戲:這些游戲可以使用移動電話的內嵌微型瀏覽器(專用于移動設備的網絡瀏覽器)來玩,在線或離線的方式都可以。玩家可以通過自己的手持設備或一個第三方游戲供給者的游戲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中的和游戲開發相關的元素。
#p#
四、 構建示例游戲
為了更好地理解這些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()方法檢查是否停止該游戲的必需條件已經滿足;如果滿足,即相應地改變游戲的狀態。方法input()處理游戲的鍵盤(keys assigned for游戲playing)輸入并為每一次按鍵,如一個游戲元素的運動,執行必要的動作。根據其所處的狀態,著色任務由render()方法來完成。
HardDriveCanvas也使用一個javax.microedition.lcdui.game.LayerManager的實例來增加和管理多層的HardDriveCanvas,其中每一層代表一個精靈。一個精靈是一部游戲中一個基本的可視化元素,或者是一個在游戲畫布上移動的character,而且它能夠與其它精靈(在這個示例中,汽車或障礙物都是精靈,它們可能進行彼此碰撞。)進行交互。每一個精靈形成一個虛擬層,它可能是全部或者部分透明地置于畫布之上;這些層彼此以堆棧方式堆疊。一個精靈是一個javax.microedition.lcdui.game.Sprite類的對象,它負責顯示、變形和旋轉精靈以及進行精靈碰撞檢測。被內部使用的tick()方法使用精靈類的collidesWith()方法進行碰撞檢測。HardDriveCanvas實例化一個ObstacleManager類的對象,它用于著色并移動游戲畫布上的障礙物精靈并檢查是否它們與汽車精靈相碰撞。
(三) ObstacleManager.java
ObstacleManager負責創建和管理隨機出現在汽車路徑上的障礙物。為了簡化和便利,ObstacleManager.java硬編碼了每次出現在汽車路徑上的障礙物的最大數目值。這個值可以根據需要進行修改。
列表1.3:該代碼片段來自于ObstacleManager.java
- private static final int MAX_OBS = 10;
- //... ...一些代碼
為了在隨機位置創建和顯示障礙物,ObstacleManager使用了一種簡單的策略。它產生最初的10個障礙物精靈,并使用LayerManager來把這些精靈添加到游戲畫布上去。然后,它通過使用隨機產生的x和y坐標值來設置它們的位置并開始朝著游戲畫布的底部移動它們。一旦每一個障礙物到達了畫布的底部而沒有碰撞到汽車,它的位置就被通過使用相同的技術重新復位,而同時游戲的得分增加1。所以,ObstacleManager重用了同一個障礙物精靈并隨機地顯示它們。
(四) GameOverCanvas.java
GameOverCanvas是一個簡單的canvas,它接收來自于HardDriveMIDlet游戲持續時間以及得分信息并顯示之。
#p#
五、 準備示例游戲的發布
J2ME無線開發工具包提供了Ktoolbar-一個相當有用的工具-可自動化或半自動化處理有關編譯,預先校驗,打包及測試移動程序等一系列問題。
既然現在準備好了游戲代碼,那么就應該把它們組織到由KToolbar提供的下面目錄結構下(見Ktoolbar的用戶指南-"Operating with KToolbar")。為此,啟動KToolbar并創建一新工程HardDriveGame,它將包含HardDrive游戲程序,該程序位于J2ME無線開發工具包的安裝文件夾下的apps子文件夾下。
HardDriveGame(定義用戶的游戲工程名)
| ___src
| ___bin
| ___classes
| ___res
| ___lib
| ___tmpclasses
| ___tmplib
現在,只要簡單地復制游戲程序的四個源代碼文件到src文件夾下,把文件car.png和obstacle.png圖標文件復制到res文件夾下。剩下的任何事情交由Ktoolbar處理好了。
接下去,下面操作將打開相應的HardDriveGame游戲工程,編譯它(使用JDK編譯器),并預校驗該游戲程序。
選擇"Open project"按鈕,選擇"HardDriveGame"->"Build"按鈕,即可開始工程構建。
如果在工程創建過程中發生錯誤,相應信息會顯示在KToolbar窗口中。你可以修改src文件夾下的游戲源代碼來更改它們;但是,必須手工進行調試,因為Ktoolbar沒有提供調試工具。否則,如果沒有錯誤發生,將顯示一條"構建完成"信息于KToolbar窗口上。
一旦游戲工程創建成功,你就可以在仿真器(一個KToolbar組件,它虛擬地模擬移動電話應用程序的執行)中運行以進行程序測試。
該游戲程序現在已開發完成,只等待發布了。為了使用KToolbar把游戲應用程序打包成一個.jar文件并進行發布,應執行下面的步驟:選擇"Open project"按鈕,選擇"HardDriveGame"->"Project"菜單->"打包"->"Create package"/"Create obfuscated package"。
"Create package"菜單項將創建一標準.jar文件,而"Create Obfuscated Package"將創建一個更小些的而不是一個標準.jar文件。一旦打包完成,.jar文件的位置被顯示在KToolbar窗口中;在打包期間還自動產生一個.jad(Java應用程序描述)文件,該文件在游戲程序運行期間為仿真器所用。
圖1.1:運行示例游戲應用程序的模擬器
作為選擇,在打包后,你可以對游戲程序的midlet施加簽名,方法如下:
工程菜單->簽名;這將為.jar文件創建一個數字簽名并把它添加到.jad文件上。
現在,游戲應用程序的.jar和.jad文件,還有用KToolbar創建的MANIFEST.MF manifest文件,組合在一起成為一個midlet 套件,都準備好被發布了。
以上就是如何用Java進行2D移動游戲開發的整個過程。你可以根據本文提供的示例來構建你自己的游戲。
六、 結論
隨著全世界移動訂閱和移動玩家數量的快速增長,移動游戲開發正在成為一個賺錢的行業。J2ME和MIDP 2.0通過提供一種方便快捷高效的移動游戲開發平臺幫助游戲開發者開拓這一領域所擁用的潛力。MIDP 2.0還提供了一套完整的API包,以用于游戲開發,它提供了內建的模塊來簡化和加快移動游戲開發。
【編輯推薦】