開發基於Java語言的手機遊戲

火星人 @ 2014-03-10 , reply:0


  最近幾年,手機遊戲作為個人娛樂項目已經普遍流行起來.手機遊戲的火爆程度在移動運營商,遊戲開發商和手機製造商的創收中佔有舉足輕重的地位,同時也為遊戲開發者和相關專業人員提供了大量的機會.隨著世界各地手機遊戲玩家的數量將在2009達到2億2千萬,手機遊戲業務也會擴大到更高的水平並且成為構成移動運營商和手機製造商利潤餅圖中的很大一部分.

  手機遊戲可以分成三類:

  · 嵌入式遊戲(Embedded games): 是內嵌在手機系統中自帶的遊戲.不久就過時了.如所有Nokia手機中自帶的貪吃蛇遊戲.

  · SMS遊戲(SMS games): 通過發送簡訊來玩的遊戲.例如,SMS到遊戲伺服器——加以處理后在通過SMS反饋結果.常見的形式有現場比賽和投票.這個遊戲不是很受歡迎因為會增加費用,當每次SMS發送到遊戲伺服器的時候.

  · 瀏覽器遊戲(Browser games):這些遊戲是通過手機內置的microbrowser(移動設備的網路瀏覽器)來操作的,在聯機或是離線狀態下進行.玩家可以在聯網的狀態下通過手機運營商的或是第三方遊戲供應商的遊戲網站來玩這些遊戲,也可以下載下來在離線的情況下玩.這一類包括很廣的遊戲範圍,如單人或是多人遊戲,網路遊戲,離線遊戲,街機遊戲等等.

  在這三類遊戲當中,瀏覽器遊戲是今天比較流行的手機遊戲類型,因為它們有創新的豐富的多媒體內容,吸引人的表現形式,和SMS遊戲相比費用也很低.本文主要是討論瀏覽器遊戲的開發,在本文中所提到的「手機遊戲」都是指「瀏覽器遊戲」.

  注意:本文側重於2D遊戲.因為現在在市面上流通的大量手機的資源都非常有限(很小的屏幕,有限制的內存和顯卡支持,繁瑣的按鍵輸入),這些設備最適合的也是商業上可行的遊戲就是2D遊戲了.但是,手機功能必然會隨著時間的發展而增加,3D遊戲在未來就會實現.

  手機遊戲也可以使用C , Java(Java2 Micro Edition更準確)來開發,高通的平台Binary Runtime Environment for Wireless (BREW) platform.

  為什麼選擇Java語言作為手機遊戲的開發?

  雖然C 的優勢在於用直接訪問系統資源的方式編譯到本地代碼,並且以BREW平台提供端對端的解決方案給手機遊戲開發者,同時允許他們用任何設計語言(包括C ,Java,XML和Flas),Java是遊戲開發最流行的選擇.Java, 更準確的說是Java 2 Micro Edition (J2ME), 被定義為手機遊戲開發最方便的語言.(關於J2ME,見"What is Java 2 Micro Edition?).J2ME』s受歡迎程度的動力是:

  · J2ME享有所有主要手機製造商支持的行業標準的地位,因為現今大多數手機都使用Java的功能.

  · J2ME是一個自由開放式平台.這個可以降低開發成本並且提供提供了必要的靈活性使開發者能自由的使用它.

  · 它高度的便利性("Write once run anywhere")確保為一個手機品牌/類型寫入的遊戲應用程序都能工作於其他支持Java的手機品牌/類型.

  · 它特別適用於小的重量輕的設備非常安全,因為在它上面寫入的應用程序不能訪問或影響其他運行於手機/設備上的應用程序.

  · J2ME由Mobile Information Device Profile (MIDP) API組成,它是為移動設備包括手機的應用程序開發而特別設計的,牢記它們的限制和約束.此外,最新的MIDP version 2.0致力於遊戲開發的整個API,使遊戲開發更簡單快捷.

  現在,你將要看到更多關於MIDP 2.0環境下的手機遊戲.

  MIDP2.0在遊戲開發中的作用

  MIDP 2.0 API 是用於開發安全的,內容豐富的多媒體應用程序,包括移動設備遊戲的一套功能載入的APIs. MIDP 2.0是建立在它的前身MIDP 1.0基礎上的,為創建有效率的快速的移動應用程序提供了更好的開發平台.關於MIDP2.0更多的信息,參見本文的Resources.

  MIDP2.0進一步完善了MIDP1.0的功能和特徵.關於新的特徵,參見What's New in MIDP 2.0..對MIDP最重要的補充是Game API,或是更準確的說是javax.microedition.lcdui.game API包.通過Game API, MIDP2.0為遊戲開發者提供了從MIDP1.0從無到有的開發的基石.這些基石被創建和控制各種遊戲要素如遊戲畫布,精神和層次等等分了類.因此,MIDP2.0大大降低了遊戲開發的時間.

  另外兩個遊戲開發必不可少的MIDP 2.0 API包,本文也有探究,它們是javax.microedition.midlet 和 javax.microedition.lcdui..

  javax.microedition.midlet API包提供了所有移動應用程序的開發基礎.它包括javax.microedition.midlet.MIDlet class, 是所有基於J2ME移動應用程序類(也被稱作midlets)中的基礎類並且通過所有移動應用程序的類來進行擴展.非常類似java.applet.Applet class,MIDlet class提供必要的資源去創建midlets.

  javax.microedition.lcdui API包對於開發一個所有移動應用程類型的用戶界面是十分必要的.這個API提供了很多類去創建並控制UI模塊(如屏幕,表格,文本框,收音機按鈕等等)並且為移動應用程序包括遊戲處理輸入.有AWT和SWING 的GUI開發經驗的開發者們將會發現javax.microedition.lcdui包的要素類似於APIs的要素.

  我將要探討有關遊戲開發的這些APIs的要素,當在實例遊戲開發的時候遇到他們.

  創建實例遊戲

  為了更好的了解APIs 和他們各自的類別,你將要開始開發一個簡單的手機遊戲.這將是一個單人的離線遊戲,一輛汽車穿過障礙.玩家使用手機上左右鍵來「駕駛」正在運行的汽車,用左鍵或右鍵來控制汽車避免撞到障礙物.當撞到障礙物時遊戲結束並顯示分數.我叫它HardDrive.

  注意:這個實例遊戲開發在Windows 2000平台上使用J2ME Wireless Toolkit 2.1_01和J2SE 1.4.2_07 SDK.其他兼容各種平台的Wireless Toolkit和J2SE SDK版本也可以.

  把源代碼放在一起來開始創建遊戲程序,叫它HardDrive.從上一節所探討的,你需要開發的是HardDriveMIDlet (HardDriveMIDlet.java)擴展javax.microedition.midlet.MIDlet class.

  

HardDriveMIDlet.java (Download)

  Listing 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 Interface來接收應用程序執行和處理它們時所產生的命令事件.該命令事件在像EXIT, CANCEL, BACK, OK, STOP這些命令和使用soft buttons(在手機屏幕附近的特殊按鈕,像箭頭的鍵)所提出的命令時發生的並且被HardDriveMIDlet 的commandAction( )方法所處理.為了更有效率,命令應該被加進canvas中.

  HardDriveMIDlet 像一個容器服務於所有canvases,它是表現出一個平面供在手機屏幕上畫畫.這裡midlet包括HardDriveCanvas, 可以擴展javax.microedition.lcdui.game.GameCanvas class.GameCanvas 是一個特殊的canvas意味著為遊戲程序制定高效率的動畫.

  另外一個canvas是HardDriveMIDlet包括的GameOverCanvas,擴展javax.microedition.lcdui.Canvas class.Canvas是一個簡單的畫布來畫文本,行和簡單的圖形.當需要在屏幕上畫畫時canvas就被延展了,代替複雜的圖形.例如,要顯示啟動畫面,遊戲結束畫面和遊戲指南.一個遊戲程序的midlet可能包括很多canvas,但是只有一個canvas通過使用javax.microedition.lcdui.Display class的setCurrent()方法被隨時顯示.

  HardDriveMIDlet還包括了三個重要的方法,也叫做lifecycle methods.它們是startApp(), pauseApp()和destroyApp( ), 對應的是midlet的Active, Paused和Destroyed狀態.在HardDriveMIDlet的startApp( )方法中,HardDriveCanvas是實例並且通過使用HardDriveCanvas.的addCommand( ) 方法把EXIT命令添加到它的裡面.

  HardDriveCanvas.java (Download)

  HardDriveCanvas實現了一個java.lang.Runnable介面使它本身運行在自己的線程上,這是獨立執行game loop所必要的.Game loop 不段的被執行去運行遊戲直到停止遊戲的條件實現(在這個例子中,當汽車撞到障礙時或是玩家用Exit鍵隨處推出遊戲時).  

Listing 1.2: Game loop of HardDriveCanvas.java

  public void start()

  {

  gameRunning = true;

  Thread gameThread = new Thread(this);

  gameThread.start();

  }

  ... ... ... ...

  ... ... ... ...

  public void run()

  {

  Graphics g = getGraphics();

  //... ... ...some code

  while (gameRunning) //The game loop

  {

  tick();

  input();

  render(g);

  //... ... ...some code

  try

  {

  Thread.sleep(timeStep );

  //... ... ... ...some code

  }

  catch (InterruptedException ie) { stop(); }

  }

  Listing 1.2展示了HardDriveCanvas.java.的game loop.這是典型的game loop由訪問下列順序的方法tick( ), input( ), and render( )所組成.The tick( )方法是檢查條件是否有必要去停止遊戲並且改變遊戲狀態如果可以的話.方法input( )是處理game key(分配給遊戲的鍵)輸入和執行每一個按鍵必要的動作,例如遊戲里的元素移動.通過render( )方法來處理遊戲的呈現.

  HardDriveCanvas也使用一個javax.microedition.lcdui.game.LayerManager例子添加或是管理HardDriveCanvas的多層次,每一層代表了一個sprite,sprite是一個遊戲中基本的視覺要素,是在game canvas上移動的一個角色並且與其他sprite相互作用(這裡,汽車或是物體都是sprite,可以相互碰撞).每一個sprite形成一個虛擬層,可能是完全或是部分透明的,置於game canvas中.這些層一個一個的羅列.Sprite是javax.microedition.lcdui.game.Sprite class的目標,可以提供顯示,轉移和為sprite旋轉碰撞的方向的功能. tick( )方法是使用sprite class的collidesWith( )方法來檢查碰撞.

  HardDriveCanvas實例化一個ObstacleManager class目標來呈現和移動在game canvas上的障礙物並且檢查它們是否與汽車發生碰撞.

  ObstacleManager.java (Download)

  ObstacleManager創建和管理在汽車跑到上隨機出現的障礙物.為了簡化和方便,ObstacleManager.java有汽車跑到上一次出現的障礙物的最大數量的硬編碼值.該值只要你想就可以隨時修改.

  

Listing 1.3: ObstacleManager.java的代碼段

  private static final int MAX_OBS = 10;

  //... ...some code

  為了在隨機位置創建並顯示障礙物,ObstacleManager採用了一個簡單的策略.它創建了首批10個障礙物sprite並且使用LayerManager來添加這些sprite到game canvas中.然後,使用隨機產生的x和y值建立他們的位置,移動它們到game canvas底部.只要這些障礙物中的每一個在沒有碰撞到汽車的情況下到達canvas底部,它的位置就會通過同樣的技術來重新建立同時遊戲分數增加一分.這樣,ObstacleManager重新使用相同的障礙物sprite並且隨機顯示他們.

  GameOverCanvas.java (Download)

  GameOverCanvas是一個簡單的畫布可以從HardDriveMIDlet接收遊戲時間和遊戲分數信息並且顯示它.

  準備發布實例遊戲

  J2ME Wireless Toolkit提供了KToolbar,一個非常有用的工具用於彙編,預查,打包和測試一個移動應用程序.KToolbar簡化了並且自動化大多數的這些任務.

  現在遊戲代碼已經準備好了,它需要在以下目錄結構圖中組織起來,用KToolbar(參見KToolbar's User Guide for "Operating with KToolbar").為了達到這個,啟動KToolbar並且創建一個新的項目,HardDriveGame,包括在J2ME Wireless Toolkit'的安裝文件夾里的遊戲文件夾下的HardDrive遊戲程序.

  

HardDriveGame (game project name, user-defined)

  |___src

  |

  |___bin

  |

  |___classes

  |

  |___res

  |

  |___lib

  |

  |___tmpclasses

  |

  |___tmplib

  現在, 簡單的複製遊戲程序的所有四個資源文件到src文件夾中和在res文件夾中的car.png和obstacle.png icon files.KToolbar會照顧好所有這一切.

  現在,以下操作將打開相應的HardDriveGame遊戲項目,構建它到compile(使用JDK complier),並且預先檢查遊戲程序.

  Open project button -> choose HardDriveGame -> Build button

  如果在構建處理中出現一些錯誤,他們會在KToolbar 窗口中顯示.在src文件夾中修改遊戲資源代碼,隨後要進行手動調試因為KToolbar不能提供調試設備.否則,如果沒有錯誤發生,"Build complete"信息就會在KToolbar中顯示.

  一旦遊戲項目構建成功,應該在Emulator(KToolbar的組成部分可以在手機上模擬應用程序的執行)中運行.

  遊戲程序現在完成了並且準備發布.為了發布用KToolbar將遊戲程序打包到.jar文件.按以下操作:

  Open project button -> choose HardDriveGame -> Project menu -> Package -> Create package / Create obfuscated package

  Create Package菜單選擇會創建一個標準的.jar文件,而Create Obfuscated Package創建一個比標準.jar 文件小的a .jar 文件.一旦打包完成,.jar的位置就會在KToolbar窗口中被顯示出來,還有.jad (Java Application Descriptor)文件,是在打包過程中自動創建的並且通過Emulator在運行遊戲程序時使用.

  Figure 1.1: Emulator running the example game app

  遊戲程序的midlet通過用以下操作在打包戶被簽名.

  Project menu -> Sign

  這個為.jar文件創建一個數字簽名並且把它添加到.jad文件中.

  現在,遊戲程序的.jar 和.jad文件,伴隨MANIFEST.MF文件,被KToolbar創建並且作為一個midlet suite整合在一起,準備發布了.

  這是如何用Java開發一個2D的手機遊戲.你可以根據本文的例子製作自己的遊戲.

  結論

  手機遊戲開發因為成倍增加的手機用戶和世界各地的手機玩家而變成利潤豐厚的產業.J2ME 和MIDP 2.0通過提供一個簡單,快捷,有效的開發手機遊戲平台幫助遊戲開發者利用這個行業的潛在性.MIDP 2.0致力於遊戲開發的整個API包,提供現成的基石來簡化和加快手機遊戲開發.




[火星人 via ] 開發基於Java語言的手機遊戲已經有75次圍觀

http://www.coctec.com/docs/java/show-post-61741.html