【正文】
之后,中國(guó)移動(dòng)提供基于 Java 的百寶箱業(yè)務(wù),應(yīng)用產(chǎn)品遍及商務(wù)應(yīng)用、信息獲取、英漢互譯、游戲娛樂(lè)等多媒 體領(lǐng)域。隨著 J2ME 的應(yīng)用,它為移動(dòng)互聯(lián)引入了一種新的模型,既允許手機(jī)可以從互聯(lián)網(wǎng)上下載各種應(yīng)用程序,并在手機(jī)創(chuàng)造可執(zhí)行環(huán)境離線(xiàn)運(yùn)行這些程序。 2. 傳統(tǒng)手機(jī)訪(fǎng)問(wèn)互聯(lián)網(wǎng)是通過(guò) WAP(Wireless Application Protocal),所有網(wǎng)絡(luò)資源必須接通網(wǎng)絡(luò)才能在線(xiàn)訪(fǎng)問(wèn),非常耗時(shí)、費(fèi)用亦很高。但是,一套標(biāo)準(zhǔn)無(wú)法適應(yīng)各種不同的需求。 Micro Edition( J2ME,袖珍版):針對(duì)有限內(nèi)存,顯示和處理能力的設(shè)備,主要是消費(fèi)電子和嵌入式設(shè)備領(lǐng)域(這 實(shí)際正是 Java 語(yǔ)言設(shè)計(jì)最初的目標(biāo)領(lǐng)域)。 J2ME 的 3 層體系結(jié)構(gòu)及 MIDP 簡(jiǎn)介 J2ME 的 3 層體系結(jié)構(gòu)依照各種設(shè)備的資 源特性,將 J2ME 技術(shù)構(gòu)架分為簡(jiǎn)表( Profile)、配置( Configuration)和 Java Virtual Machine( JVM) 3 層,然 第 3 頁(yè) 共 23 頁(yè) 后再進(jìn)一步細(xì)分,這使 J2ME 能夠在每一類(lèi)設(shè)備的限制下工作,而同時(shí)提供最低限度的 Java 語(yǔ)言功能性。 Profile 是一組 API,在某 Configuration的基礎(chǔ)上擴(kuò)展了針對(duì)設(shè)備特定功能的 API,使得標(biāo)準(zhǔn)能夠完全適應(yīng)特殊的設(shè)備,徹底發(fā)揮設(shè)備的功能。 MIDP( Mobile Information Device Profile)定義了針對(duì)移動(dòng)信息處理設(shè)備(主要指智能手機(jī)和一部分具有無(wú)線(xiàn)通信功能的 PDA)的圖形界面,輸入和時(shí)間處理,持久性存儲(chǔ),無(wú)線(xiàn)電話(huà)網(wǎng)絡(luò)連接之上的一些消息處理(例如短消息),安全等等 API,并且考慮到了移動(dòng)信息設(shè)備的屏幕和內(nèi)存限制。 具備間斷網(wǎng)絡(luò)通訊能力的個(gè)人移動(dòng)信息設(shè)備:如手機(jī),雙向呼機(jī), PDA( Personal Digital Assistant,個(gè)人數(shù)字助理,也稱(chēng)掌上電腦)等等。第二類(lèi)設(shè)備一般是固定的,因此體積沒(méi)有太大限制。第一類(lèi)設(shè)備的 Configuration 稱(chēng)為CLDC( Connected, Limited Device Configuration),第二類(lèi)稱(chēng)為 CDC( Connected Device Configuration)。這里的 Java 平臺(tái)主要是指 Java 虛擬機(jī)( JVM)和核心庫(kù)。 Profile(譯為簡(jiǎn)表或者簡(jiǎn)檔)就是針對(duì)每一類(lèi)功能設(shè)備的特殊性定義的與設(shè)備特性相關(guān)的 API,建筑于 Configuration 之上,作為 Configuration 的擴(kuò)展和補(bǔ)充。 J2ME 現(xiàn)狀和前景 J2ME 已經(jīng)廣泛的應(yīng)用在了很多的移動(dòng)設(shè)備上,很多的移動(dòng)設(shè)備都實(shí)現(xiàn) MIDP的參考實(shí)現(xiàn),但不同的移動(dòng)設(shè)備還是有一些不同的地方,比如應(yīng)用與手機(jī)上的Profile 就不適合在 PDA 的 Profile。由于這些主要操作系統(tǒng)平臺(tái)都是開(kāi)放的,基本可以相信,主要的移動(dòng)信息設(shè)備操作系統(tǒng)都將一直提供 J2ME 的支持,但是具體支持哪個(gè)標(biāo)準(zhǔn)則并不一定 第 5 頁(yè) 共 23 頁(yè) 死板地按照 CLDC 和 CDC 的最初定義,和設(shè)備的 硬件條件和廠(chǎng)商的選擇有關(guān),或者可能同時(shí)實(shí)現(xiàn)多個(gè)標(biāo)準(zhǔn)。 雖然目前手機(jī)游戲還無(wú)法與 PC 游戲相比,其顯示功能和鍵盤(pán)輸入、聲音處理能力也形成一定制約。它通用性高,開(kāi)發(fā)出的應(yīng)用程序可保證能運(yùn)行在大部分設(shè)備上,而不像專(zhuān)用廠(chǎng)商具有一定的不兼容性。 游戲中玩家通過(guò)不斷的闖關(guān),來(lái)解救公主。 由于之前對(duì)手機(jī)游戲的編程知識(shí)以及游戲的設(shè)計(jì)只有初步的了解,因此,我們?cè)谟螒虻臉?gòu)架和思路上經(jīng)歷了幾個(gè)階段。 模塊成型階段 在進(jìn)一步熟悉了 J2ME 知識(shí)后,對(duì)框架做出了一些修改,逐步把游戲的基本功能確定。 ( 3)幫助 —— 介紹游戲的玩法。 游戲的主要模塊為: 1.游戲主 MIDlet( GameMIDlet) —— 對(duì)游戲生命周期的判斷;對(duì)畫(huà)布類(lèi)的調(diào)用;管理游戲程序中各個(gè)屏幕之間的轉(zhuǎn)換。 5. GamePlayer 類(lèi) —— 玩家控制的精靈類(lèi)。 程序的類(lèi)結(jié)構(gòu) 程序一共有 8 個(gè)主要類(lèi),其中菜單類(lèi)負(fù)責(zé)各個(gè)屏幕的切換。在菜單中選擇游戲說(shuō)明或者高分記錄,則進(jìn)入相應(yīng)的屏幕,他們都能用“后退”軟鍵返回菜單。 MIDlet 程序有三種狀態(tài): 1.暫停狀態(tài) 2.運(yùn)行狀態(tài) 3.銷(xiāo)毀狀態(tài) J2ME 程序都是從 MIDlet 類(lèi)開(kāi)始執(zhí)行,系統(tǒng)在執(zhí) 行 MIDlet 程序時(shí),首先構(gòu)造一個(gè) MIDlet 類(lèi)型的對(duì)象,然后使程序進(jìn)入到暫停狀態(tài),按照生命周期的規(guī)定,系統(tǒng)會(huì)自動(dòng)調(diào)用 MIDlet 對(duì)象的 startApp 方法使程序進(jìn)入到運(yùn)行狀態(tài),開(kāi)始程序的執(zhí)行。 = this。 控制屏幕的顯示。 } catch (Exception e) { (―創(chuàng)建數(shù)據(jù)庫(kù)失敗 ‖)。i=11。 } try { ()。 MIDP 中的存儲(chǔ)系統(tǒng)是實(shí)際為一個(gè)類(lèi)似于數(shù)據(jù)庫(kù)的系統(tǒng),而并不是簡(jiǎn)單的文件系統(tǒng),這個(gè)系統(tǒng)稱(chēng)為記錄管理系統(tǒng)( Record Management System, RMS)。 當(dāng)調(diào)用 destroyApp 這個(gè)方法的時(shí)候,則退出程序。 } 退出程序的時(shí)候,要實(shí)行垃圾回收,釋放掉不再使用的內(nèi)存。 final public static int MY_RMS = 4。 //流程執(zhí)行,獲得需要畫(huà)面的對(duì)象,并顯示在屏幕上 public static void show() 第 13 頁(yè) 共 23 頁(yè) { switch(current) { case MY_MENU: (())。 case MY_SET: (())。 case MY_RMS: (())。 } } 這樣,采用上面這個(gè)函數(shù),非常方便的實(shí)現(xiàn)了流程的轉(zhuǎn)換。在實(shí)際的使用過(guò)程,一般都通過(guò)繼承Canvas 來(lái)利用該類(lèi)提供的功能。這也是 GameCanvas 與 Canvas 相比所具有的兩個(gè)優(yōu)點(diǎn) .來(lái)看游戲畫(huà)面: 當(dāng)流程控制器轉(zhuǎn)到游戲運(yùn)行界面時(shí),則用到了 游戲畫(huà)布 MyGame 類(lèi)。 Graphics g = getGraphics()。 (0,0,0)。 (―第 ‖ + (stage 1)+ ― 關(guān) ‖,getWidth()/230,getHeight()/210,|)。 // 調(diào)用創(chuàng)建關(guān)卡的方法 try {(500)。 } catch(Exception e){} } st = ()。 //調(diào)用各種判斷和行動(dòng)的方法 movMing()。 } catch(Exception e){} }} 第 16 頁(yè) 共 23 頁(yè) if(isEndGame) //判斷是否輸?shù)粲螒? { if(islose) { EedGameTime = ()。 ((,RGE))。 } catch(Exception e){} // init_Game()。 (0,0,getWidth(),getHeight())。 flushGraphics()。 if (score 0) { GameName in = new GameName()。 ()。 調(diào)用刷新畫(huà)面的方法 movMing()。圖片可翻轉(zhuǎn)、顛倒、由一個(gè)主角 圖片就可以方便的得到所有方向的顯示狀態(tài),相比原先只能使用 Canvas 繪圖,需要將所有方向的主角圖像都繪制在 png 圖像中簡(jiǎn)化了許多。在有些情況下,控制主角的翻轉(zhuǎn),尤其是多幅圖片配合顯示的過(guò)程,如果將多圖的共享定位點(diǎn)設(shè)置在通常的左上角,將很不容易控制,因?yàn)樵S多翻轉(zhuǎn)都是以其他點(diǎn)為參考電的(比如,中心點(diǎn))。 第 18 頁(yè) 共 23 頁(yè) 在本程序中,由于 J2ME 中提供的 Sprite 類(lèi)功能有限,所以我自己寫(xiě)了一個(gè)GamePlayer 類(lèi)來(lái)繼承 Sprite 類(lèi),擴(kuò)充了更多的功能。 j 18。amp。 (―UP: ‖+getY())。amp。 } if( Length * j =x + () 1 amp。 10 + Length * i = y + ()/2 amp。amp。amp。 Length *(j + 1) = x + () 3 amp。 10 + Length *(i + 1) = y + ()) { ((), Length * (i 1))。在我們的游戲中當(dāng)然也不能沒(méi)有聲音。該方法中的 filename 是要播放聲音文件的相對(duì)路 徑, f 是播放音樂(lè)文件的格式, i 用來(lái)控制該音樂(lè)的播放次數(shù)。 5 程序設(shè)計(jì)過(guò)程中遇到的一些重要問(wèn)題 關(guān)于碰撞的問(wèn)題 在游戲中最先要解決的也是最重要的問(wèn)題就是碰撞檢測(cè)的實(shí)現(xiàn)以及碰撞后表現(xiàn)出的效果。這點(diǎn)表現(xiàn)效果還是很不錯(cuò)的。 到目前在我們經(jīng)過(guò)的多次測(cè)試中還沒(méi)有 出現(xiàn)判斷失誤以及無(wú)法判斷等錯(cuò)誤。一旦一 個(gè)線(xiàn)程 執(zhí)行完畢 ,這個(gè)實(shí)例就不能再重新啟動(dòng) ,只能重新生成一個(gè)新實(shí)例 ,再啟動(dòng)一個(gè) 線(xiàn)程。 結(jié) 論 本程序設(shè)計(jì)實(shí)現(xiàn)了手機(jī)上以 J2ME 為平臺(tái)的 堡壘 游戲的開(kāi)發(fā),具有一定的可玩性和復(fù)雜性。一個(gè)簡(jiǎn)單的菜單的背后卻有著不同的寫(xiě)法以及一些復(fù)雜的技術(shù)。 [2] 李振鵬,龔劍 .J2ME手機(jī)游戲開(kāi)發(fā)技術(shù)詳解 [M]. 北京:清華大學(xué)出版社 ,2021。 [6] 聞怡洋 .J2ME MIDP [M].北京:北京大學(xué)出版社, 2021。除非另有說(shuō)明,本文的工作是原始性工作。 ( 4)學(xué)校可允許學(xué)位論文被查閱或借閱。 there were many orchards of fruit trees and beyond the plain the mountains were brown and bare. There was fighting in the mountains and at night we could see the flashes from the artillery. In the dark it was like summer lightning, but the nights were cool and there was not the feeling of a storm ing. Sometimes in the dar k we heard the troops marching under the window and guns going past pulled by motor tractors. There was much traffic at night and many mules on the roads with boxes of ammunition on each side of their pac ksaddles and gray motor trucks that carried men, and other trucks w ith loads covered with canvas that moved slower in the traffic. There were big guns too that passed in the day drawn by tractors, the long barrels of the guns covered with green branches and green leafy br anches and vines laid over the tractors. To the north we could look across a valley and see a forest of chestnut trees and behind it another mountain on this side of the river. There was fighting for that mountain too, but it was not successful, and in the fall when the rains came the leaves all fell from the chestnut trees and the branches were bare and the trunks black w ith rain. The vineyards were thin and bare branched too and all the country wet and brown and dead with the autumn. There were mists over the river and clouds on the mountain and the truc ks splashed mud on the road and the troops were muddy and wet in their c