三、需求分析
這部分叫做需求分析,聽起來挺嚇人的,其實就是搞清楚我們要做什麼,做成什麼樣,那些不做。下面我引領著大家共同來完成這一步驟。首先,我們要做一個華容道的游戲,華容道的故事這裡不再贅述了,但其中的人物在這裡限定一下,如上面Images類裡的定義,我們這個版本只提供曹操(Caocao)、關羽(Guanyu)、張飛(Zhangfei)、趙雲(Zhaoyun)、黃忠(Huangzhong)、馬超(Machao)和卒(Zu)。我們這裡也限定一下游戲的操作方法:首先要通過方向鍵選擇一個要移動的區域(就是一張圖片),被選擇的區域用黑色方框框住;選好後按Fire鍵(就是確定鍵)將這塊區域選中,被選中的區域用綠色方框框住;然後選擇要移動到的區域,此時用紅色方框框住被選擇的區域;選好要移動到的區域之後按Fire鍵將要移動的區域(圖片)移到要移動到的區域,並去掉綠色和紅色的方框。這裡需要強調的概念有選擇的區域、選中的區域、要移動的區域和要移動到的區域,這四個概念請讀者注意區分,當然也應當把這一部分記入數據字典之中。
為了使文章的重點突出(介紹如何制作一個J2ME的收集游戲),我們這裡限定一些與本主題無關的內容暫不去實現:過關之後的動畫(實現時要用到TimerTask或Thread類,後續的系列文章中我會詳細介紹動畫方面的知識)、關面之間的切換(其實很簡單,當完成任務之後重新再做一邊)、暫停和保存等操作(這部分的內容介紹的資料很多,我也寫不出什麼新的東東來,難免抄襲,故此免掉)。
需求分析基本完成,離下午還有一段時間,馬上動手用ACDSee把從網上找來的BMP文件,調整其大小為271*177(我的這個圖片是兩個部分合在一起,所以比手機實際屏幕大了),另存為PNG格式。半天時間剛剛好,不但搞清楚了要做的東東,還把要用的圖片准備好了。
四、概要設計
概要設計是從需求分析過渡到詳細設計的橋梁和紐帶,這一部分中我們確定項目的實現方法和模塊的劃分。我們決定將整個項目分成五個部分,分別是前面介紹的Images、Draw,還有Map和Displayable1和MIDlet1。Images和Draw類功能簡單、結構固定,因此很多項目我們都使用這兩各類,這裡直接拿來改改就能用了,前面已經介紹過這裡不再贅述。Map類是用來從外部文件讀入地圖,然後保存在一個數組之中,這部分的內容是我們在本階段討論的重點。Displayable1是一個繼承了Canvas類的畫布,它用來處理程序的主要控制邏輯和一部分控制邏輯所需的輔助函數,主要函數應該包括用來繪圖的paint()函數、用來控制操作的keyPressed()函數、用來控制選擇區域的setRange()函數、用來控制選擇要移動到區域的setMoveRange()函數、用來移動選中區域的Move()函數和判斷是否完成任務的win()函數,更具體的分析,我們放到詳細設計中去細化。MIDlet1實際上就是一個控制整個J2ME應用的控制程序,其實也沒有什麼可特別的,它和我們前面介紹的"Hello World"程序大同小異,這裡就不展開來說了,後面會貼出它的全部代碼。
Map類主要應該有一個Grid[][]的二維數組,用來存放華容道的地圖,還應該有一個read_map()函數用來從外部文件讀取地圖內容填充Grid數據結構,再就是要有一個draw_map()函數用來把Grid數據結構中的地圖內容轉換成圖片顯示出來(當然要調用Draw類的paint方法)。說到讀取外部文件,筆者知道有兩種方法:一種是傳統的定義一個InputStream對象,然後用getClass().getResourceAsStream()方法取得輸入流,然後再從輸入流中取得外部文件的內容,例如
InputStream is = getClass().getResourceAsStream("/filename");
if (is != null) {
byte a = (byte) is.read();
}
這裡請注意文件名中的根路徑是相對於便以後的class文件放置的位置,而不是源文件(java)。第二種方法是使用onnector.openInputStream方法,然後打開的協議是Resource,但是這種方法筆者反復嘗試都沒能調通,報告的錯誤是缺少Resource協議,估計第二種方法用到J2ME的某些擴展類包,此處不再深究。由於以前已經做過一些類似華容道這樣的地圖,這裡直接給出Map類的代碼,後面就不再詳細解釋Map類了,以便於我們可以集中精力處理Displayable1中的邏輯。
Map類的代碼如下: