J2ME遊戲開發例項講解(上)(轉)

post0發表於2007-08-12
J2ME遊戲開發例項講解(上)(轉)[@more@]

  一、序言

  

  昨天在網上閒逛,發現一篇講解用delphi實現華容道遊戲的文章,頗受啟發.於是,產生了將華容道遊戲移植到手機中去的衝動.現在手機遊戲琳琅滿目,不一而足,華容道的實現版本也很多.正巧不久前筆者對J2ME下了一番功夫,正想借這個機會小試牛刀。選用J2ME的原因還有一個就是目前Java開發大行其到,無線增殖業務迅猛發展,J2ME的應用日漸活躍起來,也希望我的這篇文章能夠為J2ME知識的普及和開發團隊的壯大推波助瀾。由於長期受ISO規範的影響,這次小試牛刀我也打算遵照軟體工程的要求,並採取瀑布式的開發模式來規劃專案,也希望藉此機會向各位沒有機會參與正式專案開發的讀者介紹一下軟體開發的流程。

  

  這裡我們先定義專案組的人員體制(其實只有我一個人):技術調研、需求分析、概要設計、詳細設計、編碼、測試均有筆者一人擔任;美工這裡我找了個捷徑,盜用網上現成的圖片,然後用ACDSee把它由BMP轉換成PNG格式(我出於講座的目的,未做商業應用,應該不算侵權吧);至於釋出工作,由於缺少OTA伺服器,此項工作不做(但是我會介紹這步如何做)。

  

  接下來,我們規劃一下專案實現的時間表,以我個人經驗,設想如下:技術調研用2天(這部分解決專案的可行性和重大技術問題,時間會長一些),需求分析用半天(畢竟有現成的東東可以參照,只要理清思路就行了,況且還有很多以前用過的設計模式和寫好的程式碼),概要設計再用半天(有了需求,概要只不夠是照方抓藥),詳細設計要用2天(這一步要把所有的問題想清楚,還要儘可能的準確描述出來),編碼用2天(其實1天就夠了,技術已經不是問題,多計劃出一天來應付突發事件),測試用2天(測試應該至少佔全部專案的四分之一,不過這個專案只是一個Demo,也太簡單了),釋出也要用上半天(儘管我們不去實際釋出它,但是還要花點時間搞清楚應該如何做),最後就是專案總結和開慶功會(時間待定)。

  

  

  二、利其器

  

  “公欲善其事,必先利其器”,做專案之前第一步是前期調研.我們要做的華容道這個東東隨處可見,我們要調研的是兩個方面:

  

  1、遊戲的內容:遊戲本身很簡單,就是有幾個格子,曹操佔據其中一個較大的格子,然後被幾個格子包圍,這些格子形狀不一定相同,但是擋住了曹操移動的方向.遊戲者需要挪動這些格子最終把曹操移動到一個指定的位置才算是過關.更具體的分析我們放在後面需求分析和概要設計中討論。

  

  2、技術儲備:談到技術,這裡簡單介紹一下J2ME.Java有三個版本,分別是J2ME(微型版).J2SE(標準版).J2EE(企業版).J2ME是一個標準,採用3層結構設計.最低層是配置層(Configuration)也就是裝置層,其上是簡表層(Profile),再上是應用層(Application).MIDP就是移動資訊裝置簡表,目前主流手機支援MIDP1.0,最新的是MIDP2.0,它比前一個版本增加了對遊戲的支援,在javax.microedition.lcdui.game包中提供了一些類來處理遊戲中的技術,比如我們後面會用到的Sprite類,它是用來翻轉圖片的.權衡再三,筆者決定使用MIDP2.0來做開發.首先需要安裝一個J2ME的模擬器,我們就用Sun公司的WTK2.0,我覺得Sun的東西最權威.當然你也可以使用Nokia.Siemens或是Motolora等其他模擬器,但是他們的JDK不盡相同,寫出來的程式移植是比較麻煩的.Sun公司的WTK2.0可以到<A href="下">下</A>載,當然要想成功下載的前提是你要先註冊成為Sun的會員(其實這樣對你是有好處的).當下來之後就是按照提示一步一步的安裝.安裝好了之後,我們用一個"Hello World"程式開始你的J2ME之旅.我們啟動WTK2.0工具集中的KToolBar,然後點選New Project按鈕,在彈出的輸入框中輸入Project Name為HelloWorld,MIDlet Class Name為Hello,然後點選Create Project,開始生成專案,工具會彈出MIDP配置簡表,這裡接受生成的預設值(以後還可以修改)點選OK,工具提示我們把寫好的Java源程式放到[WTK_HOME]appsHelloWorldsrc目錄之下.我們編輯如下程式碼,並儲存在上述目錄之下,檔名為Hello.java。

  

  import javax.microedition.midlet.*;

  import javax.microedition.lcdui.*;

  public class Hello extends MIDlet

  {

  private Display display;

  public Hello(){

  display =Display.getDisplay(this);

  }

  public void startApp(){

  TextBox t = new TextBox("Hello","Hello",256,0);

  display.setCurrent(t);

  }

  public void pauseApp(){

  }

  public void destroyApp(boolean unconditional){

  }

  }

  

  儲存好了之後,點選Build按鈕,工具會為你編譯程式,如無意外再點選Run按鈕,會彈出一個手機介面,剩下的就不用我教了吧(用滑鼠對手機按鍵一頓狂點)。呵呵,你的第一個J2ME程式已經OK了.什麼?你還一點都沒懂呢(真是厲害,不懂都能寫出J2ME程式來,果然是高手).我這裡主要是介紹WTK2.0工具的使用,程式並不是目的,不懂的話後面還會有詳細的解說,這裡只是帶你上路.什麼?你不懂Java!那也沒有關係,後面我再講得細一點。

  

  跳過J2ME,我們先來講點遊戲的理論.具體到華容道這個遊戲,主要有三個方面,貼圖.遊戲操作.邏輯判斷.這裡講講貼圖,其他兩方面放在概要設計和詳細設計裡講.所謂的貼圖,其實就是畫圖,就是在要顯示圖形的位置上輸出一副圖片,(要是牽扯到動畫就要麻煩一些,可以使用TimerTask.Thread或Rannable之類的技術),這副圖片可以是事先準備好的也可以是臨時處理的.在J2ME中有一個Image類,專門用於管理圖片,它有createImage()方法,可以直接讀取圖片檔案(J2ME只支援PNG格式的圖片),也可以擷取已有的圖片的一部分(這樣我們可以把很多圖片放在一起,然後一張一張的截下來,好處是節省儲存空間和檔案讀取時間,對於手機這兩者都是效能的瓶頸).J2ME還有一個Graphics類,專門用於繪圖,它有drawImage()方法,可以把一副圖片在指定的位置上顯示出來,它還有drawRect()方法和setColor()方法,這兩個方法在後面我們進行遊戲操作時就會用到,這裡先交代一下.有了圖片和繪圖的方法,還需要知道把圖畫到誰身上,J2ME提供了一個Canvas類,字面意思就是畫布,它有一個paint()方法用於重新整理頁面,還有一個repaint()方法用於呼叫paint()方法.聽著有些糊塗是吧,不要緊,我來結合具體程式講解一下.為了今後程式設計的方便,我們建立兩個類Images和Draw,Images用於儲存一些常量值和圖片,Draw主要是用於畫圖,這兩個類的原始碼如下。

  

  Images類的原始碼如下:

  

  package huarongroad;

  import javax.microedition.lcdui.*;

  import javax.microedition.lcdui.game.*;

  

  public class Images {//儲存常量

  //繪圖位置常量

  public static final int UNIT = 32;//方塊的單位長度

  public static final int LEFT = 10;//畫圖的左邊界頂點

  public static final int TOP = 9;//畫圖的上邊界頂點

  //地圖位置常量

  public static final int WIDTH = 4;//地圖的寬度

  public static final int HEIGHT = 5;//地圖的高度

  //地圖示記常量

  public static final byte CAOCAO = (byte) 'a'; <A href="file://曹">file://曹</A>操的地圖示記

  public static final byte MACHAO = (byte) 'b';//馬超的地圖示記

  public static final byte HUANGZHONG = (byte) 'c';//黃忠的地圖示記

  public static final byte GUANYU = (byte) 'd';//關羽的地圖示記

  public static final byte ZHANGFEI = (byte) 'e';//張飛的地圖示記

  public static final byte ZHAOYUN = (byte) 'f';//趙雲的地圖示記

  public static final byte ZU = (byte) 'g';//卒的地圖示記

  public static final byte BLANK = (byte) 'h';//空白的地圖示記

  public static final byte CURSOR = (byte) 'i';//游標的地圖示記

  //地圖組合標記常量

  public static final byte DLEFT = (byte) '1'; <A href="file://組">file://組</A>合圖形左邊標記

  public static final byte DUP = (byte) '2'; <A href="file://組">file://組</A>合圖形上邊標記

  public static final byte DLEFTUP = (byte) '3'; <A href="file://組">file://組</A>合圖形左上標記

  //圖片常量

  public static Image image_base;//基本圖片

  public static Image image_Zhaoyun;//趙雲的圖片

  public static Image image_Caocao;//曹操的圖片

  public static Image image_Huangzhong;//黃忠的圖片

  public static Image image_Machao;//馬超的圖片

  public static Image image_Guanyu;//關羽的圖片

  public static Image image_Zhangfei;//張飛的圖片

  public static Image image_Zu;//卒的圖片

  public static Image image_Blank;//空白的圖片

  public static Image image_Frame;//遊戲框架的圖片

  

  public Images() {//建構函式

  }

  

  public static boolean init() {//初始化遊戲中用到的圖片

  try {

  image_base = Image.createImage("/huarongroad/BITBACK.png");

  image_Frame = Image.createImage(image_base, 126, 0, 145, 177, Sprite.TRANS_NONE);

  //Sprite類是用來翻轉圖片的,是MIDP2.0新新增加的支援遊戲的特性

  image_Zhaoyun = Image.createImage(image_base, 0, 0, UNIT, 2 * UNIT, Sprite.TRANS_NONE);

  image_Caocao = Image.createImage(image_base, UNIT, 0, 2 * UNIT, 2 * UN

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8225414/viewspace-951692/,如需轉載,請註明出處,否則將追究法律責任。

相關文章