【摘要】隨著手機的日益普及、Java功能在移動設備上的實現(xiàn),本論文利用J2ME技術,設計了一款可商用的手機游戲程序,以及介紹了J2ME的相關技術及本程序的結構分析和具體功能的實現(xiàn),為更流行的硬件平臺提供應用參考。
【關鍵詞】J2ME手機飛行游戲
一、引言
在信息社會中,手機及其他無線設備越來越多的走進普通百姓的工作和生活,隨著信息網(wǎng)絡化的不斷進展,手機及其他無線設備上網(wǎng)絡勢在必行。但是傳統(tǒng)手機存在以下弊端:傳統(tǒng)手機出廠時均由硬件廠商固化程序;傳統(tǒng)手機訪問網(wǎng)絡資源必須接通網(wǎng)絡才能在線訪問,非常耗時、費用亦很高。而Java技術在無線應用方面的優(yōu)勢非常明顯:應用程序可按需下載,而不是購買由硬件商提供的套件,可升級空間大;Java技術提供了一個類庫,它使的應用開發(fā)商可以創(chuàng)建更為直覺、豐富的用戶界面(GUI);Java技術使網(wǎng)絡帶寬的應用更為有效,因為應用程序可以下載到器件上,并在本地運行,僅僅是在連接到服務器時才會占用網(wǎng)絡帶寬。
二、J2ME技術
Java平臺演進到Java2后,Java平臺分別針對不同領域的需求被分成四個版本,亦即J2EE、J2SE、J2ME以及JavaCard。其中J2ME定位在消費性電子產(chǎn)品的應用上。這個版本針對資源有限的電子消費產(chǎn)品的需求精簡核心類庫,并提供了模塊化的架構讓不同類型產(chǎn)品能夠隨時增加支持的能力。這個版本的應用層面相當廣泛,會是未來Java平臺發(fā)展的重點項目。
J2ME在1999年的JavaOne開發(fā)人員大會上初次亮相,它的目標是面向智能無線設備和小型計算機設備的開發(fā)人員。J2ME的一個關鍵優(yōu)點是,J2ME與所有支持Java的設備都是兼容的。支持Java的設備就是任何運行Java虛擬機器的計算機。Motorola、Nokia等生產(chǎn)廠商都生產(chǎn)支持Java的設備。
目前,J2ME中有兩個最主要的配置,分別是Connected Limited Devices Configuration(CLDC)和Connected Devices Configuration(CDC)。
作為第一個面對小型設備的Java應用開發(fā)規(guī)范,CLDC是由包括Nokia,Motorola和Siemens在內(nèi)的18家全球知名公司共同協(xié)商完成的。CLDC是J2ME核心配置中的一個,可以支持一個或多個profile。其目標主要面向小型的、網(wǎng)絡連接速度慢、能源有限(主要是電池供電)且資源有限的設備,如手機、PDA等。
三、游戲設計
3.1本程序需要解決的主要技術問題
游戲程序是一項精度要求很高的程序系統(tǒng),因為其代碼利用率很高。一個實時運行的最終作品,每秒都會運行成千上萬行程序,繪圖事件、鍵盤事件都會以極高的頻率在后臺等待響應,若有絲毫的差別都將很容易導致程序在運行不久后可能出現(xiàn)嚴重錯誤,甚至死循環(huán)。因此,其邏輯設計應當相當嚴謹,需將所有可能發(fā)生的事件及意外情況考慮在設計中。
游戲中為了美觀,適用性強,可能需要采用外部文件引入的圖片貼圖,有關貼圖,在MIDP2.0中提供了用于增強游戲功能的game包,使得解決靜態(tài)或動態(tài)、畫面背景、屏幕刷新的雙緩沖等都有較好的解決方案。
玩家飛機的運行可以通過鍵盤響應事件控制,但敵方則因為是自動運行,就需要有一定的智能性;敵人飛機的運行算法也要進行相關的設置,已免游戲過于簡單。
對于雙方發(fā)射的子彈應該賦予不同的速度,同時,程序應該設定敵人飛機的子彈不與敵人的飛機進行碰撞檢測,已增加游戲的可玩性。
雙方的飛機在前進時也需要考慮到是否碰撞到對方飛機,以免重疊運行,造成許多物理上不可能的情況,缺乏真實感。每一次刷新頁面、每前進一步都需要進行相關的碰撞檢測。
為了增加界面的美觀,在程序中添加了白云。由于手機屏幕大小有限,所以白云的數(shù)量和出現(xiàn)的位置要經(jīng)過相關的設置,才能實現(xiàn)白云不規(guī)則出現(xiàn)的效果。
游戲的地圖不可能通過繪圖來解決。否則,不僅難于控制和處理過多的元素,也會因過多的大型圖片而不能限制程序的大小,失去手機上程序的原則和Java的優(yōu)勢。
Java是基于虛擬機的半解釋型編譯系統(tǒng),其執(zhí)行效率較C++等完全編譯后的程序會低很多,程序如果不進行精簡和優(yōu)化,將可能導致運行的不流暢。除開發(fā)過程中對結構上的控制、變量的使用、算法的優(yōu)化等優(yōu)化外,還可以使用混淆器(Obfuscator)進行程序打包后的優(yōu)化。
游戲的結束、開始、動態(tài)信息畫面作為構成一個程序都是必不可少的重要部分。良好的用戶界面更是吸引用戶的硬指標,相關的美術構圖和人性化設置也需要有一定的考慮。
以上相關技術細節(jié)和整體流程將分別在以下小節(jié)闡述。
3.2程序流程
MIDlet suite是MIDP應用程序的最小單位,JAM負責將手機內(nèi)的MIDlet suite以圖形化的方式呈現(xiàn),讓用戶能夠選取欲執(zhí)行的MIDlet suite,一旦選取了某個MIDlet suite,操作系統(tǒng)就會激活KVM執(zhí)行里面的MIDlet。MIDlet及相關的支持類組成了MIDP應用程序的實際內(nèi)容。而每個MIDlet都必須繼承javax.microedition.midlet.MIDlet這個抽象類。在MIDP規(guī)范中定義了MIDlet的生命周期,以及可以存在的三種狀態(tài),包括Paused、Active以及Destroyed,每一個MIDlet在任何時刻只可能處于其中的一個狀態(tài)。這三種狀態(tài)的轉換關系如圖1所示:MIDlet有三個狀態(tài),分別是pause、active和destroyed。
在啟動一個MIDlet的時候,應用管理軟件會首先創(chuàng)建一個MIDlet實例并使得他處于pause狀態(tài),當startApp( )方法被調(diào)用的時候MIDlet進入active狀態(tài),也就是所說的運行狀態(tài)。在active狀態(tài)調(diào)用destroyApp (boolean unconditional)或者pauseApp( )方法可以使得MIDlet進入destroyed或者pause狀態(tài)。值得一提的是destroyApp(boolean unconditional)方法,事實上,當destroyApp( )方法被調(diào)用的時候,AMS通知MIDlet進入destroyed狀態(tài)。在destroyed狀態(tài)的MIDlet必須釋放了所有的資源,并且保存了數(shù)據(jù)。如果unconditional為1的時候,MIDlet可以在接到通知后拋出MIDletStateChangeException而保持在當前狀態(tài),如果設置為true的話,則必須立即進入destroyed狀態(tài)。
本程序采用面向?qū)ο蟮脑O計模式,對游戲中的所有物體賦予對象的概念和屬性。運行程序后允許用戶選擇執(zhí)行選項菜單,在開始游戲后將先從外部文件載入地圖文件,對背景的所有物體進行繪圖。在主程序運行的線程中,畫面刷新將以一定的頻率采用雙緩沖技術對屏幕重繪,實時反映整個游戲的進行狀態(tài)。
游戲開始后先繪制地圖,并將各個對象實例化。在主程序運行的線程中,游戲中所有的對象都應該運行在同一個線程下。當敵人或者用戶的子彈達到射程范圍后,并不刪除子彈對象,而是使用setVisable(1)使其不能顯示,當用戶或敵人再次發(fā)射子彈時,只需使用setVisable(true)設置成可以顯示即可。在屏幕重繪的主程序中,將在每次的循環(huán)中判斷若干事件,以便程序進入相關的分支執(zhí)行相關的反應代碼。
程序為需要完成獨立功能的模塊設置了單獨的類。 lzhhdm類繼承自Midlet,gameScrenn類、MenuScreen類繼承自GameCanvas,mybullets繼承自Sprite類。載入程序后首先啟動的是程序介紹的信息畫面。點擊ok后調(diào)用MenuScreen類實現(xiàn)菜單。
如果選擇進入游戲,則調(diào)用gameScreen類,并且中止MenuScreen類中的線程運行,已提高運行速度。
Mybullets類為玩家子彈類。
四、游戲的實現(xiàn)
游戲?qū)崿F(xiàn)界面如2圖所示,下面針對幾個比較重要的類進行簡單介紹。
游戲主類gameScreen類是游戲控制的基本類,是控制游戲各個模塊的監(jiān)聽類,決定著敵人何時出現(xiàn),控制著敵人出現(xiàn)的方法,判斷敵人及玩家是否被擊中等。它運行在獨立的線程中,以恒定的頻率刷新畫面。
Mybullets類繼承自Sprite類,以實現(xiàn)玩家子彈的相關功能。首先,創(chuàng)建子彈狀態(tài)數(shù)組private int[][] bullets,其中,[i][0]代表子彈的X坐標,[i][1]代表子彈的Y坐標,[i][2]代表子彈Y方向速度,[i][3]代表子彈存活狀態(tài)。類中定義的方法setfirstposition( )起到定義玩家子彈發(fā)射坐標的作。方法newposition( )實現(xiàn)的功能為更新玩家的子彈位置,并且檢測玩家子彈與普通敵人的碰撞及記錄玩家戰(zhàn)果。mybullets類在gameScreen中建立了對象數(shù)組huokebullet[9],代表玩家所能發(fā)射的9發(fā)子彈。
使用createBackGround ( )函數(shù)創(chuàng)建地圖數(shù)組時,用(row+1)*16-getHeight( )語句對整型變量row2賦值,其中row+1代表地圖有多少列,16為地圖片的高度,而減去getHeight ( )是因為要留出一個屏幕的可視區(qū)域,由于J2ME規(guī)定坐標系中下方向為正,所以使用語句y1=-row2將row2的數(shù)值變?yōu)樨摂?shù)。
每個創(chuàng)建Command實例的J2ME的應用程序也必須創(chuàng)建實現(xiàn)CommandListener接口的實例。每當用戶通過commandAction( )方法的方式與命令進行交互的時候,就會通過CommandLIstener.所以實現(xiàn)CommandListener的類必須實現(xiàn)commandAction( )方法。
當玩家通關時或者任務失敗時,將顯示相應信息,并使用上面的方法將“暫停”鍵變?yōu)椤胺祷亍辨I盤,當點擊“返回”鍵時,將返回主菜單選項,調(diào)用類lzhhdm里的方法menuscreensecond( ),在此方法中,實例化一個MenuScreen類對象,并且使選項“新游戲”改變?yōu)椤爸匦麻_始”。完成此項功能的語句子為MenuScreen.mainmenu [0] =“重新開始”。當選擇“重新開始”時,使用gamescreen=new gameScreen(this)將使所有變量重新被初始化,如地圖的繪制、敵人出現(xiàn)位置的重置、敵人的數(shù)量、玩家飛機的當前位置等。使用gamescreen.start( )重新開始程序的循環(huán)。
五、結論
本文設計了完整的以J2ME為平臺的飛行射擊游戲的開發(fā),游戲運行的方式由程序進行控制,具有一定的可玩性和復雜性。經(jīng)過了細心的調(diào)試和排錯解決了絕大部分的問題,對J2ME游戲開發(fā)有著一定指導作用。
參考文獻
[1] Joshua Bloce著.潘愛民譯. Effective Java中文版.2004年7月第4版.機械工業(yè)出版社.
[2] Bruce Eckel.侯捷譯.Java編程思想. 2005年3月第1版.機械工業(yè)出版社出版社
[3]王森著.Java手機/PDA程序設計入門.2005年2月第3版.電子工業(yè)出版社.
[4] James Keogh著.潘穎王磊譯.J2ME開發(fā)大全.2004年2月第1版清華大學出版社.
[5] Ian Sommerville著.程成等譯.軟件工程.2003年1月第1版.機械工業(yè)出版社.
[6]陳立偉張克非黎秀紅著.精通JAVA手機游戲與應用程序設計.中國青年出版社,2005年5月
[7]飛思科技產(chǎn)品研發(fā)中心.精通Jbuilder9.電子工業(yè)出版社,2004年