畢業(yè)設計---手機游戲(堡壘)的設計與開發(fā)_第1頁
已閱讀1頁,還剩23頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

1、<p>  手機游戲(堡壘)的設計與開發(fā)</p><p><b>  摘要</b></p><p>  隨著手機業(yè)務的迅速發(fā)展,手機游戲逐漸成為移動增值服務的興奮點。本畢業(yè)設計就著眼于J2ME技術(shù)的應用,設計與開發(fā)一款探險類手機游戲(堡壘)。</p><p>  該堡壘游戲是基于J2ME開發(fā)的手機RPG游戲,采用midp2.0技術(shù)實現(xiàn)

2、了菜單、地圖、主角動作及怪物動作和AI等,主要通過精靈間的碰撞檢測來觸動事件發(fā)生。游戲的主流程是玩家利用手機鍵盤操作主角在堡壘中拾取道具破解迷宮,并且隨著關(guān)數(shù)的增加,游戲的難度也逐漸增加。另外,游戲中還包括了排行榜,聲音設置,幫助等各種附加功能。其中充滿了趣味性和刺激性,是適合各年齡段的益智冒險類游戲。</p><p>  本論文介紹了J2ME的相關(guān)技術(shù)及該堡壘游戲程序的結(jié)構(gòu)分析和具體功能的實現(xiàn)。</p&g

3、t;<p>  關(guān)鍵詞:J2ME; 手機游戲; 堡壘</p><p>  The Design and Development of a Handset Game (Castle)</p><p><b>  Abstract</b></p><p>  With the rapid development of cell p

4、hone business, cell phone games have gradually become the hotspot of mobile value-added services. This graduate design which focuses on J2ME technology designs and develops a handset adventure game (castle).</p>&

5、lt;p>  This castle game is a handset RPG game based on J2ME which mainly examines the demon’s collision to touch off the event. It uses midp2.0 technology to achieve the menu, the map, the hero moves, monster AI etc.

6、The game has included the order list, the sound establishment, helps of function etc. Player operates the lead through the handset to collect the stage prop in the castle to break through the labyrinth. The difficulty of

7、 the game will gradually increase along with the increase of stage. Ot</p><p>  This paper introduces related technology of the J2ME and the structure analysis and the concrete function realization of this c

8、astle game procedure.</p><p>  Key words: J2ME;handset game;castle</p><p><b>  目 錄</b></p><p><b>  論文總頁數(shù):23頁</b></p><p><b>  1引 言1&l

9、t;/b></p><p>  2 手機游戲的現(xiàn)狀和J2ME的概況1</p><p><b>  2.1軟件現(xiàn)狀1</b></p><p>  2.2 J2ME概況2</p><p>  2.2.1 J2ME的由來2</p><p>  2.2.2 J2ME的3層體系結(jié)構(gòu)及MIDP簡

10、介2</p><p>  2.2.3 Configuration和Profiles3</p><p>  2.3 J2ME現(xiàn)狀和前景4</p><p>  2.4 手機游戲業(yè)務5</p><p>  3 開發(fā)環(huán)境介紹5</p><p><b>  3.1開發(fā)環(huán)境5</b></p&

11、gt;<p>  3.2 關(guān)于SonyEricsson Wireless Tool Kit5</p><p>  4手機游戲(堡壘)的開發(fā)5</p><p>  4.1 游戲的的思路、構(gòu)想5</p><p>  4.1.1 游戲想法的產(chǎn)生5</p><p>  4.1.2 對游戲設計的初步認識6</p>

12、<p>  4.1.3 模塊成型階段6</p><p>  4.2 程序的類結(jié)構(gòu)7</p><p>  4.3 游戲的流程圖7</p><p>  4.4 游戲的實現(xiàn)8</p><p>  4.4.1 主類GameMIDlet的實現(xiàn)8</p><p>  4.4.2 游戲畫布MyGame類的實現(xiàn)

13、13</p><p>  4.4.3 玩家精靈GamePlayer類的實現(xiàn)17</p><p>  4.4.5 SoundEffects類的實現(xiàn)19</p><p>  5 程序設計過程中遇到的一些重要問題19</p><p>  5.1 關(guān)于碰撞的問題19</p><p>  5.2 關(guān)于游戲畫面的顯示問題

14、20</p><p><b>  結(jié) 論20</b></p><p><b>  參考文獻20</b></p><p><b>  致 謝22</b></p><p><b>  聲 明23</b></p><

15、p><b>  1引 言</b></p><p>  Java語言是美國Sun Microsystem的James Gosling、Pratrick Naughton及Mike Sheridan等人于1991年精心設計出來的計算機編程語言,其構(gòu)想在于實現(xiàn)使用同一種編程語言所寫出來的程序可以在不同的平臺上運作。這種架構(gòu)對于消費性電子產(chǎn)品而言是具有革命性的,因為在消費性電子產(chǎn)品中的處理器

16、及操作系統(tǒng)各不相同,要在這些平臺上開發(fā)程序必須要了解各個平臺的特性,以及其提供的API使用方式,分別開發(fā)不同的版本才能執(zhí)行,影響應用程序的普及性。</p><p>  近幾年,由于微處理器性能的大幅提升,加上無線通訊技術(shù)的突破,手持式移動設備開始受到大眾的青睞。短短幾年內(nèi),手機已經(jīng)升級了幾代產(chǎn)品,普及率逐年攀升,生產(chǎn)效率不斷上升,產(chǎn)品價格比個人電腦的摩爾定律有更驚人的下調(diào),以至手機是大多是城市居民不可缺少的一件隨

17、身設備。繼短信、彩信等服務之后,中國移動提供基于Java的百寶箱業(yè)務,應用產(chǎn)品遍及商務應用、信息獲取、英漢互譯、游戲娛樂等多媒體領域。</p><p>  為了適應移動數(shù)據(jù)的發(fā)展,推動無線電子商務等業(yè)務的發(fā)展,J2ME(Java 2 Micro Edition)既用于嵌入式系統(tǒng)的Java被引入無線領域。J2ME的出現(xiàn)實際上是Java技術(shù)的回歸。作為Java2平臺的一部分,J2ME與J2SE、J2EE一起,為無線應

18、用的客戶端和服務器端建立了完整的開發(fā)、部署環(huán)境。隨著J2ME的應用,它為移動互聯(lián)引入了一種新的模型,既允許手機可以從互聯(lián)網(wǎng)上下載各種應用程序,并在手機創(chuàng)造可執(zhí)行環(huán)境離線運行這些程序。由于定義了可執(zhí)行下載的標準,并在手機上創(chuàng)立了可執(zhí)行環(huán)境和程序開發(fā)語言,由此,在移動通信業(yè)第一次為軟件開發(fā)商創(chuàng)造了巨大的商業(yè)機會,手機用戶在得到豐富應用體驗的同時,也大大提高了運營商的網(wǎng)絡流量。</p><p>  2 手機游戲的現(xiàn)狀和

19、J2ME的概況</p><p><b>  2.1軟件現(xiàn)狀</b></p><p>  在信息社會中,手機及其他無線設備越來越多的走進普通百姓的工作和生活,隨著信息網(wǎng)絡化的不斷進展,手機及其他無線設備上網(wǎng)絡勢在必行。但是傳統(tǒng)手機存在以下弊端:</p><p>  1. 傳統(tǒng)手機出廠時均由硬件廠商固化程序,程序不能增加、刪除,有了錯誤也不能更新

20、、修改,若要增加新功能必須另換一部手機。</p><p>  2. 傳統(tǒng)手機訪問互聯(lián)網(wǎng)是通過WAP(Wireless Application Protocal),所有網(wǎng)絡資源必須接通網(wǎng)絡才能在線訪問,非常耗時、費用亦很高。</p><p>  而Java技術(shù)在無線應用方面的優(yōu)勢非常明顯:</p><p>  1. 應用程序可按需下載,而不是購買由硬件商提供的套件

21、,可升級空大。</p><p>  2. Java技術(shù)提供了一個類庫,它使的應用開發(fā)商可以創(chuàng)建更為直覺、豐富的用戶界面(GUI);</p><p>  3.Java技術(shù)使網(wǎng)絡帶寬的應用更為有效,因為應用程序可以下載到器件上,并在本地運行,僅僅是在連接到服務器時才會占用網(wǎng)絡帶寬。</p><p>  2.2 J2ME概況</p><p>  

22、2.2.1 J2ME的由來</p><p>  Java的最大目標和特點,就是“一次編寫,到處運行”的平臺無關(guān)性。但是,一套標準無法適應各種不同的需求。因此,Java技術(shù)目前共有三套,分別針對不同的平臺和應用。</p><p>  Standard Edition(J2SE,標準版):針對桌面端PC和工作站的個人和低端商務應用。 </p><p>  Enterpr

23、ise Edition(J2EE,企業(yè)版):針對服務器端企業(yè)級應用,支持Servlets, JSP和XML等等。</p><p>  Micro Edition(J2ME,袖珍版):針對有限內(nèi)存,顯示和處理能力的設備,主要是消費電子和嵌入式設備領域(這實際正是Java語言設計最初的目標領域)。</p><p><b>  圖1 java結(jié)構(gòu)</b></p>

24、<p>  在消費電子和嵌入式設備領域,內(nèi)存從幾百K到幾十M,從沒有屏幕Web-TV,CPU從低功耗的嵌入式處理器到206MHz的RISC處理器,硬件條件的差異是相當大的。這就使得J2ME的標準需要有不同的層次和類別來適應這個復雜的領域,因此相比之下J2ME就比J2SE和J2EE的標準要復雜得多。因此,清楚的理解J2ME的體系結(jié)構(gòu)的劃分才能更好的理解和掌握J2ME。</p><p>  2.2.2

25、J2ME的3層體系結(jié)構(gòu)及MIDP簡介</p><p>  J2ME的3層體系結(jié)構(gòu)依照各種設備的資源特性,將J2ME技術(shù)構(gòu)架分為簡表(Profile)、配置(Configuration)和Java Virtual Machine(JVM)3層,然后再進一步細分,這使J2ME能夠在每一類設備的限制下工作,而同時提供最低限度的Java語言功能性。</p><p>  關(guān)于J2ME的體系結(jié)構(gòu),可以

26、這樣來進行總結(jié):Configuration的分類是根據(jù)計算能力的不同來劃分的,同類設備的計算能力相近。Configuration是一個規(guī)范,定義了這類設備的共同Java平臺,定義與設備無關(guān)的Java虛擬機和核心庫,是平臺相容性的基礎。Profile的分類是根據(jù)設備功能劃分的,同類功能的設備其他各種硬件條件和需求也相近。Profile是一組API,在某Configuration的基礎上擴展了針對設備特定功能的API,使得標準能夠完全適應特

27、殊的設備,徹底發(fā)揮設備的功能。</p><p>  J2ME體系的一般結(jié)構(gòu)是:由Configuration定義的Java虛擬機運行于設備的宿主操作系統(tǒng)之上,構(gòu)成整個平臺的基礎。Configuration提供了基本的語言特性,Profile提供針對設備的特殊功能API和擴展類庫。應用程序的運行環(huán)境需要一個Configuration和至少一個Profile,多個Profile可以共存,也可以疊加。</p>

28、<p>  MIDP(Mobile Information Device Profile)定義了針對移動信息處理設備(主要指智能手機和一部分具有無線通信功能的PDA)的圖形界面,輸入和時間處理,持久性存儲,無線電話網(wǎng)絡連接之上的一些消息處理(例如短消息),安全等等API,并且考慮到了移動信息設備的屏幕和內(nèi)存限制。類似于J2SE中的Applet框架,MIDP提供了基于javax.microedition.midlet 包的M

29、IDlet應用程序框架。</p><p>  因為MIDP提出的比較早,目前重要的智能手機和PDA操作系統(tǒng)上都已有了相應的實現(xiàn),而且應用的也比較廣泛。</p><p>  2.2.3 Configuration和Profiles</p><p>  針對消費電子和嵌入式設備領域豐富多樣的設備和彼此相差極大的計算能力及各種硬件條件,J2ME首先根據(jù)最基本的一些特征把它

30、們劃分為兩類。</p><p>  具備間斷網(wǎng)絡通訊能力的個人移動信息設備:如手機,雙向呼機,PDA(Personal Digital Assistant,個人數(shù)字助理,也稱掌上電腦)等等。 有固定的不間斷網(wǎng)絡連接的共享連接信息設備:如置頂盒(set-top boxes),Web-TV,支持Internet的有屏幕電話,汽車娛樂/導航系統(tǒng)等等。 </p><p>  Sun對J2ME 有一

31、個很好的概括:J2ME技術(shù)有兩個設計中心——手持的設備,和可以插到墻上插座的設備。第一類設備往往是個人化的,移動的,使用電池,體積和功耗都有限制,因此功能和計算能力有限。第二類設備一般是固定的,因此體積沒有太大限制。由于固定,可以有持續(xù)電源供應,因此功耗沒有太大問題,計算能力相對充裕。</p><p>  計算能力是這兩類設備的主要區(qū)別,對其上可能的應用和環(huán)境顯然有著本質(zhì)影響,不同類別的設備不可能采用同樣的Jav

32、a平臺,必須分別定義。針對這兩大類設備的平臺規(guī)范就是Configuration。第一類設備的Configuration稱為CLDC(Connected, Limited Device Configuration),第二類稱為CDC(Connected Device Configuration)。</p><p>  屬于同一類的設備計算能力是相似的,但是其他功能和條件還有非常大的區(qū)別。作為Java平臺必須保證相容

33、性,這就必須舍棄所有的設備特殊性。因此,Configuration就是支持一組通用設備的最小Java平臺,作為這些設備的最小公分母來保證不同設備間的平臺相容性。這里的Java平臺主要是指Java虛擬機(JVM)和核心庫。</p><p>  在Configuration中舍棄了設備的特殊性來保證Java平臺的相容性,但是僅僅有Configuration顯然是不夠的,特殊的具體設備其獨有的功能和硬件條件都沒有得到支

34、持。為此,在Configuration的基礎上,根據(jù)設備具體功能再進行一次劃分,比如智能手機,PDA等等。功能的劃分也就是其他硬件條件的劃分,比如屏幕大小,內(nèi)存,計算能力,電力供應等等都是從屬于功能的,因此同功能的設備的硬件條件都是非常相似的。Profile(譯為簡表或者簡檔)就是針對每一類功能設備的特殊性定義的與設備特性相關(guān)的API,建筑于Configuration之上,作為Configuration的擴展和補充。例如MIDP(Mob

35、ile Information Device Profile,移動信息設備Profile)就定義了關(guān)于移動信息設備(主要指智能手機和一部分具有無線通信功能的PDA)的圖形界面,輸入和時間處理,持久性存儲,短消息等等的API,并且考慮到了移動信息設備的屏幕和內(nèi)存限制。而正在制定中的PDA Profile則定義了針對PDA的API,其屏幕,內(nèi)存條件都要大于MIDP,但是網(wǎng)絡方面的要求則顯</p><p>  2.3

36、J2ME現(xiàn)狀和前景</p><p>  J2ME已經(jīng)廣泛的應用在了很多的移動設備上,很多的移動設備都實現(xiàn)MIDP的參考實現(xiàn),但不同的移動設備還是有一些不同的地方,比如應用與手機上的Profile就不適合在PDA的Profile。有一些系統(tǒng),比如Symbian實現(xiàn)了CLDC和MIDP,作為智能手機的操作系統(tǒng),是理想的MIDP應用平臺。其他的系統(tǒng),如在Compaq的iPaq上已經(jīng)實現(xiàn)了CDC,IBM的WebSpher

37、e Micro Environment在Pocket PC上實現(xiàn)了CLDC,CDC和MIDP??梢姡谟布l件較好的PDA上都可以實現(xiàn)CDC的標準。由于這些主要操作系統(tǒng)平臺都是開放的,基本可以相信,主要的移動信息設備操作系統(tǒng)都將一直提供J2ME的支持,但是具體支持哪個標準則并不一定死板地按照CLDC和CDC的最初定義,和設備的硬件條件和廠商的選擇有關(guān),或者可能同時實現(xiàn)多個標準。所以說J2ME的還是在快速的發(fā)展的。</p>

38、<p>  2.4 手機游戲業(yè)務 </p><p>  手機游戲是移動多媒體時代最有價值的應用。這是因為,游戲是多媒體應用中集大成的業(yè)務,圖像、音樂、互動都能在游戲中實現(xiàn),能充分滿足用戶各方面的需求。</p><p>  雖然目前手機游戲還無法與PC游戲相比,其顯示功能和鍵盤輸入、聲音處理能力也形成一定制約。但是隨時隨地可操作可聯(lián)網(wǎng)的特性大大拓展了人們娛樂休閑的時間和空間,以游戲

39、功能為主的手機終端在市場上漸被認可,多媒體功能正向手機的標配功能演進,制約手機游戲發(fā)展的技術(shù)瓶頸將被打破。當前的手機游戲產(chǎn)業(yè)盡管仍然存在很多制約其發(fā)展的瓶頸,但手機游戲已顯示出非比尋常的發(fā)展速度,其市場潛力十分巨大,將成為移動增值服務市場新的增長點。</p><p><b>  3 開發(fā)環(huán)境介紹 </b></p><p><b>  3.1開發(fā)環(huán)境</

40、b></p><p>  操作系統(tǒng):Microsoft Windows XP</p><p>  程序語言:Java 2</p><p>  開發(fā)平臺:Java 2 Micro Edition</p><p>  開發(fā)工具: Wireless Tool Kit 2.1+ UltraEdit-32_12.00a+1_SC</p>

41、;<p>  3.2 關(guān)于SonyEricsson Wireless Tool Kit</p><p>  SonyEricsson WTK(Wireless Tool Kit)是SonyEricsson公司針對J2ME推出的用于手機和Palm等移動設備的開發(fā)包,是手機廠商的專用開發(fā)包。它通用性高,開發(fā)出的應用程序可保證能運行在大部分設備上,而不像專用廠商具有一定的不兼容性。雖然它沒有強大的功能和

42、完善的調(diào)試手段,但它提供運行模擬器的最基本組件,是其他IDE需集成采用的必備元素。</p><p>  當前的最新Release的版本為J2ME WTK2.2。</p><p>  4手機游戲(堡壘)的開發(fā)</p><p>  4.1 游戲的的思路、構(gòu)想</p><p>  4.1.1 游戲想法的產(chǎn)生</p><p>

43、  相信大家一定都在8位機機上玩過《冒險島》這款游戲,非常有趣味性。</p><p>  游戲中玩家通過不斷的闖關(guān),來解救公主。在每個關(guān)都很很多的怪物阻擋著你,所以需要運用各種機關(guān)或者秘籍來殺死它們。殺死他們的同時還可以獲得各種獎勵,加生命,加血等,增加了游戲的趣味性。</p><p><b>  如圖2所示:</b></p><p><

44、b>  圖2 游戲截圖</b></p><p>  這款《冒險島》游戲的實現(xiàn)相對于其他RPG或者網(wǎng)絡版手機游戲稍簡單一些,適合初學者作為練習,所以我決定編寫一款類似的手機游戲。</p><p>  由于之前對手機游戲的編程知識以及游戲的設計只有初步的了解,因此,我們在游戲的構(gòu)架和思路上經(jīng)歷了幾個階段。</p><p>  4.1.2 對游戲設計的初

45、步認識</p><p>  剛開始我們只對J2ME有初步的了解。這時我們只是模仿之前在PC上看到的游戲,用語言把游戲的實現(xiàn)感性的描述為幾大部分:</p><p>  游戲界面系統(tǒng):包括游戲開始界面;游戲開局界面;游戲運行界面;游戲結(jié)束界面。</p><p>  游戲元素:菜單類;畫布類;人物類;排行榜類。</p><p>  4.1.3 模塊

46、成型階段</p><p>  在進一步熟悉了J2ME知識后,對框架做出了一些修改,逐步把游戲的基本功能確定。游戲依次進入加載界面;主菜單;游戲運行界面;游戲結(jié)束界面。</p><p>  具體實現(xiàn)的功能為: </p><p>  1.主菜單,有如下選項:</p><p> ?。?)開始游戲——進入游戲界面。</p><p&

47、gt;  (2)聲音——設置聲音的有無選項。</p><p>  (3)幫助——介紹游戲的玩法。</p><p> ?。?)排行榜——玩家所得分數(shù)的排行榜。</p><p>  (5)關(guān)于——用來顯示說明信息以及背景圖片。</p><p>  2.游戲運行界面,包括:</p><p>  游戲界面;目前游戲得分;游戲關(guān)

48、數(shù);生命次數(shù);</p><p>  3.游戲結(jié)束界面:游戲結(jié)束后,顯示一行說明信息,然后退回到菜單。</p><p><b>  游戲的主要模塊為:</b></p><p>  1.游戲主MIDlet(GameMIDlet)——對游戲生命周期的判斷;對畫布類的調(diào)用;管理游戲程序中各個屏幕之間的轉(zhuǎn)換。</p><p>  

49、2.游戲畫布(MyGame)——對游戲所用變量,常量的設定;游戲的初始化;游戲中精靈運動軌跡的控制;精靈與磚塊的碰撞檢測以及磚塊狀態(tài)的控制;游戲中各關(guān)卡的基本設定;游戲中對按鍵狀態(tài)的處理。</p><p>  3.菜單類——游戲中菜單事件的處理。</p><p>  4.GameOgre類——游戲中怪物的類。</p><p>  5.GamePlayer類——玩家控

50、制的精靈類。</p><p>  6.GameRMS類——用于實現(xiàn)分數(shù)排行榜。</p><p>  7.PlayMusic類——用于實現(xiàn)音樂的播放。</p><p>  8.MySet類——聲音大小的設置。</p><p>  4.2 程序的類結(jié)構(gòu)</p><p>  程序一共有8個主要類,其中菜單類負責各個屏幕的切換

51、。程序的類結(jié)構(gòu)如圖3所示:</p><p><b>  圖3 類結(jié)構(gòu)</b></p><p>  4.3 游戲的流程圖</p><p>  進入游戲菜單。初始情況下,游戲菜單有5個選項,它們分別是開始游戲、游戲說明和排行榜、設置、關(guān)于。選擇開始新游戲則進入游戲,在游戲中如果按下非游戲鍵則中斷游戲返回菜單,此時菜單中增加了一個繼續(xù)游戲的選項,

52、可以返回游戲也可以重新開始新的游戲。在菜單中選擇游戲說明或者高分記錄,則進入相應的屏幕,他們都能用“后退”軟鍵返回菜單。菜單中的退出選項用于退出程序。游戲的流程如圖4所示:</p><p>  圖4 游戲的流程圖</p><p><b>  4.4 游戲的實現(xiàn)</b></p><p>  游戲一共實現(xiàn)了幾個類,包括用于游戲外部的、菜單類、排行

53、榜屏幕類、聲音設置屏幕類、結(jié)束屏幕類,以及用于游戲本身的游戲畫布類、聲音效果類。</p><p>  4.4.1 主類GameMIDlet的實現(xiàn)</p><p>  MIDlet是最核心的類。MIDlet程序有三種狀態(tài):</p><p><b>  1.暫停狀態(tài)</b></p><p><b>  2.運行狀態(tài)

54、</b></p><p><b>  3.銷毀狀態(tài)</b></p><p>  J2ME程序都是從MIDlet類開始執(zhí)行,系統(tǒng)在執(zhí)行MIDlet程序時,首先構(gòu)造一個MIDlet類型的對象,然后使程序進入到暫停狀態(tài),按照生命周期的規(guī)定,系統(tǒng)會自動調(diào)用MIDlet對象的startApp方法使程序進入到運行狀態(tài),開始程序的執(zhí)行。</p><p

55、>  下圖是運行時顯示的畫布對象:</p><p>  圖5 屏幕之間的切換</p><p>  首先,先要創(chuàng)建MIDlet類型的對象,下面我們來看對象的構(gòu)造方法:</p><p><b>  //主程序構(gòu)造方法</b></p><p>  public GameMIDlet()</p><p&

56、gt;<b>  {</b></p><p>  rs = null;</p><p>  RecordName = “GameRMS”;</p><p>  GameMenu.display = Display.getDisplay(this) ;</p><p>  GameMenu.midlet = this;&l

57、t;/p><p><b>  }</b></p><p>  在這個構(gòu)造器中,創(chuàng)建了一個Display對象用于顯示,然后,把當前程序的引用傳給菜單類中的靜態(tài)變量。</p><p>  Display類有兩個最主要的作用:</p><p>  1、 獲得屏幕的屬性。例如屏幕是否是彩色的,以及支持的顏色數(shù)量等信息。</p

58、><p>  2、 控制屏幕的顯示。例如使屏幕顯示某個指定界面或者獲得當前的顯示界面等。</p><p>  其中,特別是第二個作用使用的更加頻繁。</p><p>  當程序啟動的時候,則調(diào)用了程序的startApp方法,用來顯示畫面:</p><p>  public void startApp()</p><p>

59、<b>  {</b></p><p>  //程序開始,打開數(shù)據(jù)庫,如果數(shù)據(jù)庫沒有數(shù)據(jù)就添加10筆空白數(shù)據(jù),最后關(guān)閉數(shù)據(jù)庫</p><p><b>  try {</b></p><p>  rs = RecordStore.openRecordStore(RecordName,true);</p><

60、;p>  } catch (Exception e) </p><p><b>  {</b></p><p>  System.out.println(“創(chuàng)建數(shù)據(jù)庫失敗”);</p><p><b>  }</b></p><p>  GameRMS rd = new GameRMS(“pl

61、ayer”,0);</p><p>  byte tem[] = rd.encode();</p><p><b>  try </b></p><p><b>  {</b></p><p>  if(rs.getNumRecords()==0)</p><p><b

62、>  {</b></p><p>  for(int i=1;i<=11;i++)</p><p><b>  {</b></p><p><b>  try</b></p><p><b>  {</b></p><p>  

63、rs.addRecord(tem,0,tem.length);</p><p>  }catch(Exception e)</p><p><b>  {</b></p><p>  System.out.println(“添加數(shù)據(jù)失敗”); </p><p><b>  }</b></p&g

64、t;<p><b>  }</b></p><p><b>  }</b></p><p><b>  } </b></p><p>  catch (Exception e1) </p><p><b>  {</b></p>

65、<p>  System.out.println(“得到數(shù)據(jù)庫大小失敗”);</p><p><b>  } </b></p><p><b>  try</b></p><p><b>  {</b></p><p>  rs.closeRecordSto

66、re();</p><p>  }catch(Exception e)</p><p><b>  {</b></p><p>  System.out.println(“關(guān)閉數(shù)據(jù)庫失敗”);</p><p><b>  }</b></p><p>  //將畫面設為主畫面M

67、AIN SCREEN</p><p>  new Thread(this).start(); </p><p><b>  }</b></p><p>  程序開始,打開數(shù)據(jù)庫,如果數(shù)據(jù)庫沒有數(shù)據(jù)就添加10筆空白數(shù)據(jù),最后關(guān)閉數(shù)據(jù)庫,然后開始一個新的線程,啟動菜單。</p><p>  MIDP中的存儲系統(tǒng)是實際為一個類

68、似于數(shù)據(jù)庫的系統(tǒng),而并不是簡單的文件系統(tǒng),這個系統(tǒng)稱為記錄管理系統(tǒng)(Record Management System,RMS)。RMS實現(xiàn)數(shù)據(jù)的持久性管理,提供了數(shù)據(jù)存儲的功能,可以在程序下次啟動是再次使用。</p><p>  記錄存儲是面向記錄的數(shù)據(jù)庫,可把一個記錄存儲看作一個數(shù)據(jù)庫文件,由許多記錄組合而成,這些記錄將持久保存并支持跨多個MIDlet的請求。在系統(tǒng)平臺的整個常規(guī)應用期間,包括重啟,更換電池等,

69、MIDlet的記錄存儲都由系統(tǒng)平臺負責維護,系統(tǒng)會盡可能維持記錄的完整性。</p><p>  當調(diào)用destroyApp 這個方法的時候,則退出程序。</p><p>  public void destroyApp(boolean unconditional) </p><p><b>  {</b></p><p>

70、;<b>  exit();</b></p><p><b>  }</b></p><p>  public void exit() </p><p><b>  {</b></p><p>  System.gc();</p><p>  notif

71、yDestroyed();</p><p><b>  }</b></p><p>  退出程序的時候,要實行垃圾回收,釋放掉不再使用的內(nèi)存。</p><p>  2.屏幕切換,如圖6:</p><p><b>  圖6 屏幕切換</b></p><p>  菜單的圖形切換采

72、用的是流程控制器,非常方便,簡潔的實現(xiàn)了屏幕畫面的切換,下面是關(guān)鍵實現(xiàn)代碼:</p><p><b>  //導航器</b></p><p>  //設置4個常量分別代表主畫面,游戲畫面,幫助畫面和排行榜畫面</p><p>  final public static int MY_MENU = 1;</p><p> 

73、 final public static int MY_GAME = 2;</p><p>  final public static int MY_HELP = 3;</p><p>  final public static int MY_RMS = 4;</p><p>  final public static int MY_ABOUT = 5;</p

74、><p>  final public static int MY_SET = 6;</p><p>  采用靜態(tài)變量來對畫面進行標識。</p><p>  //流程執(zhí)行,獲得需要畫面的對象,并顯示在屏幕上</p><p>  public static void show()</p><p><b>  {&l

75、t;/b></p><p>  switch(current)</p><p><b>  {</b></p><p>  case MY_MENU:</p><p>  display.setCurrent(MyMenu.getInstance());</p><p><b> 

76、 break;</b></p><p>  case MY_GAME:</p><p>  display.setCurrent(MyGame.getInstance());</p><p><b>  break;</b></p><p>  case MY_SET:</p><p>

77、;  display.setCurrent(MySet.getInstance());</p><p><b>  break;</b></p><p>  case MY_HELP:</p><p>  display.setCurrent(MyHelp.getInstance());</p><p><b>

78、;  break;</b></p><p>  case MY_RMS:</p><p>  display.setCurrent(MyRms.getInstance());</p><p><b>  break;</b></p><p>  case MY_ABOUT:</p><p&

79、gt;  display.setCurrent(MyAbout.getInstance());</p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  這樣,采用上面這個函數(shù),非常方便

80、的實現(xiàn)了流程的轉(zhuǎn)換。實現(xiàn)屏幕的切換。</p><p>  4.4.2 游戲畫布MyGame類的實現(xiàn)</p><p>  在J2ME游戲編程中,Canvas類是最常用的類之一,該類提供了獲得手機屏幕屬性、繪制界面以及事件處理等很多實用的功能。</p><p>  Canvas類是Displayable的子類,主要用來需要處理低級事件,例如鍵盤按鍵事件等,以及需要繪制屏

81、幕的程序。在實際的使用過程,一般都通過繼承Canvas來利用該類提供的功能。Canvas類是一個抽象類,繼承該類的時候必須覆蓋paint方法。</p><p>  GameCanvas 類提供了基本的游戲用戶接口。除了從Canvas 繼承下來的特性(命令,輸入事件等)以外,它還提供了專門針對游戲的功能,比如后備屏幕緩沖和鍵盤狀態(tài)查詢的能力。這也是GameCanvas與Canvas相比所具有的兩個優(yōu)點.來看游戲畫面

82、:</p><p>  當流程控制器轉(zhuǎn)到游戲運行界面時,則用到了游戲畫布MyGame類。</p><p><b>  下面是游戲截圖:</b></p><p><b>  圖7 游戲截圖</b></p><p><b>  下面來看類的聲明:</b></p>&l

83、t;p>  public class MyGame extends GameCanvas implements Runnable</p><p><b>  {</b></p><p><b>  }</b></p><p>  我們所用的畫布程序,正是繼承了GameCanvas這個類,同時派生了Runnable接口

84、,來實現(xiàn)生成一個新的線程的功能。</p><p><b>  程序的run方法:</b></p><p>  public void run() </p><p><b>  {</b></p><p>  long st = 0;</p><p>  long et = 0

85、;</p><p>  Graphics g = getGraphics();</p><p>  for(stage = 2;stage <= 4;stage++)</p><p><b>  {</b></p><p>  flag = true;</p><p>  g.setColo

86、r(0,0,0);</p><p>  g.fillRect(0,0,getWidth(),getHeight());</p><p>  g.setColor(255,255,0); g.setFont(Font.getFont(Font.FACE_PROPORTIONAL,Font.STYLE_BOLD,Font.SIZE_LARGE));</p><

87、;p>  g.drawString(“第 ” + (stage -1)+ “ 關(guān)”,getWidth()/2-30,getHeight()/2-10,Graphics.TOP|Graphics.LEFT);</p><p>  flushGraphics();</p><p>  try { Thread.sleep(1000);} </p><p>  

88、catch (InterruptedException e1) {}</p><p>  CREAT_STAGE(); //調(diào)用創(chuàng)建關(guān)卡的方法</p><p>  try {Thread.sleep(500);} </p><p>  catch (InterruptedException e1) {}</p><p>  mpaint

89、(g);</p><p>  isKey = true;</p><p>  while(flag) //游戲正式開始</p><p><b>  {</b></p><p>  while(ispause) //判斷是否按下暫停</p><p><b>  {</b>

90、</p><p>  try{ Thread.sleep(100); }</p><p>  catch(Exception e){}</p><p><b>  }</b></p><p>  st = System.currentTimeMillis();</p><p>  StartGam

91、eTime = System.currentTimeMillis();</p><p>  INPUT_KEY(); //調(diào)用按鍵方法</p><p>  PENG_ZHUANG(); //調(diào)用各種判斷和行動的方法</p><p>  movMing(); //調(diào)用刷新畫面的方法</p><p>  mpaint(g)

92、;</p><p>  et = System.currentTimeMillis();</p><p>  if((et-st)<rest)</p><p><b>  {</b></p><p>  try { Thread.sleep(rest-(et-st)); }</p><p>

93、  catch(Exception e){}</p><p><b>  }}</b></p><p>  if(isEndGame) //判斷是否輸?shù)粲螒?lt;/p><p><b>  {</b></p><p>  if(islose)</p><p><b

94、>  {</b></p><p>  EedGameTime = System.currentTimeMillis();</p><p>  g.setColor(0,0,0);</p><p>  g.fillRect(0,0,getWidth(),getHeight());</p><p>  g.setColor(25

95、5,255,0); g.setFont(Font.getFont(Font.FACE_PROPORTIONAL,Font.STYLE_PLAIN,Font.SIZE_LARGE));</p><p>  g.drawString(“你失敗了!”,getWidth()/2-40,getHeight()/2-20,Graphics.TOP|Graphics.LEFT);</p>&l

96、t;p>  flushGraphics();</p><p>  try { Thread.sleep(3000); }</p><p>  catch(Exception e){}</p><p>  // init_Game();</p><p><b>  break;</b>

97、</p><p><b>  }}} </b></p><p>  if(isEndGame) //判斷是否贏得游戲</p><p><b>  {</b></p><p>  if(!islose)</p><p><b>  {</b>&l

98、t;/p><p>  EedGameTime = System.currentTimeMillis();</p><p>  g.setColor(0,0,0);</p><p>  g.fillRect(0,0,getWidth(),getHeight());</p><p>  g.setColor(255,255,0);</p>

99、<p>  g.setFont(Font.getFont(Font.FACE_PROPORTIONAL,Font.STYLE_PLAIN,Font.SIZE_LARGE));</p><p>  g.drawString(“你勝利了!”,getWidth()/2-40,getHeight()/2-20,Graphics.TOP|Graphics.LEFT);</p><p>

100、  flushGraphics();</p><p>  try {Thread.sleep(3000); }</p><p>  catch(Exception e){}</p><p>  // init_Game();</p><p><b>  } </b></p><

101、p>  // GetScore();</p><p>  if (score > 0)</p><p><b>  {</b></p><p>  GameName in = new GameName();</p><p>  GameMenu.display.setCurrent(in);&

102、lt;/p><p>  in.start();</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  GameMenu.current = GameMenu.MY_M

103、ENU;</p><p>  GameMenu.show();</p><p><b>  }} } }</b></p><p><b>  在線程中,通過</b></p><p>  1、調(diào)用創(chuàng)建關(guān)卡的方法CREAT_STAGE();</p><p>  2、判斷是否按下

104、暫停while(ispause)</p><p>  3、調(diào)用按鍵方法INPUT_KEY();</p><p>  4、調(diào)用各種判斷和行動的方法PENG_ZHUANG();</p><p>  5、調(diào)用刷新畫面的方法movMing();</p><p>  6、判斷是否輸?shù)粲螒騣f(isEndGame)</p><p>

105、;  7、判斷是否贏得游戲if(isEndGame)</p><p>  來對游戲進行不斷監(jiān)控。</p><p>  4.4.3 玩家精靈GamePlayer類的實現(xiàn)</p><p>  Sprite類是繼承自Layer的用于存儲多幀的基本可視元素。不同的frame可交相顯示,構(gòu)成動態(tài)的效果。圖片可翻轉(zhuǎn)、顛倒、由一個主角圖片就可以方便的得到所有方向的顯示狀態(tài),相比原

106、先只能使用Canvas繪圖,需要將所有方向的主角圖像都繪制在png圖像中簡化了許多。Sprite也可以從整合的圖像中讀圖,讀圖時將把大圖分解為若干等寬等高的小圖。每個小圖按照其排列順序有相應的序號,在程序中調(diào)用其序號,就可以繪制出相應的圖片。本程序中的玩家、怪物都由Sprite繼承得到。在有些情況下,控制主角的翻轉(zhuǎn),尤其是多幅圖片配合顯示的過程,如果將多圖的共享定位點設置在通常的左上角,將很不容易控制,因為許多翻轉(zhuǎn)都是以其他點為參考電的

107、(比如,中心點)。由此,引入?yún)⒖键c的概念。參考點由defineReferencePixel函數(shù)確定未翻轉(zhuǎn)圖片狀態(tài)時的坐標。默認是(0,0)點,如果需要,可將參考點設置在畫面邊界之外。</p><p>  在本程序中,由于J2ME中提供的Sprite類功能有限,所以我自己寫了一個GamePlayer類來繼承Sprite類,擴充了更多的功能。</p><p>  public class Ga

108、mePlayer extends Sprite</p><p><b>  {</b></p><p><b>  }</b></p><p>  在游戲中和背景的碰撞檢測始終是個難點,在本程序中是這樣實現(xiàn)的:</p><p>  public void isPeng(int x,int y,int

109、 Array[][],int N)</p><p><b>  {</b></p><p>  for(int i = 0; i < 20; i++)</p><p><b>  {</b></p><p>  for(int j = 0; j< 18; j++)</p>

110、;<p><b>  {</b></p><p>  if(Array[i][j] == N)</p><p><b>  {</b></p><p>  if (!MyGame.isU)</p><p><b>  {</b></p>&l

111、t;p>  if( Length * j <= x + this.getWidth() /2 && Length *(j + 1) >= x + this.getWidth() /2 && 10 + Length * i <= y && 10 + Length *(i + 1) >= y)</p><p><b>  {&

112、lt;/b></p><p>  this.setPosition(this.getX(), 20 + Length *(i + 1));</p><p>  System.out.println(“UP: ”+getY());</p><p><b>  }</b></p><p><b>  //左

113、</b></p><p>  if( Length * j <= x + 1 && Length *(j + 1) >= x + 1 && 10 + Length * i <= y + this.getHeight()/2 && 10 + Length *(i + 1) >= y + this.getHeight()/2)<

114、/p><p><b>  {</b></p><p>  this.setPosition( Length * (j + 1),this.getY());</p><p><b>  }</b></p><p>  if( Length * j <=x + this.getWidth() - 1

115、&& Length *(j + 1) >= x + this.getWidth() –1 && 10 + Length * i <= y + this.getHeight()/2 && 10 + Length *(i + 1) >= y + this.getHeight()/2)</p><p><b>  {</b><

116、/p><p>  this.setPosition(Length * j - this.getWidth() ,this.getY());</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  //左下</b></p>

117、;<p>  if( Length * j <= x + 3&& Length *(j + 1) >= x + 3 && 10 + Length * i <= y + this.getHeight() && 10 + Length *(i + 1) >= y + this.getHeight())</p><p><b&g

118、t;  {</b></p><p>  this.setPosition(this.getX(), Length * (i -1));</p><p><b>  }</b></p><p><b>  //右下</b></p><p>  if( Length * j <= x

119、 +this.getWidth() -3 && Length *(j + 1) >= x + this.getWidth() -3 && 10 + Length * i <= y + this.getHeight() && 10 + Length *(i + 1) >= y + this.getHeight())</p><p><b>

120、;  {</b></p><p>  this.setPosition(this.getX(), Length * (i - 1));</p><p>  Length * i:+Length * (i-1));</p><p><b>  }</b></p><p><b>  }</

121、b></p><p><b>  }</b></p><p>  通過查看背景數(shù)組和玩家坐標,來實現(xiàn)和背景的碰撞檢測。</p><p>  4.4.5 SoundEffects類的實現(xiàn)</p><p>  聲音效果是一個游戲中必不可少的部分,沒有了生動的音樂效果,游戲的體驗就會大打折扣。在我們的游戲中當然也不能

122、沒有聲音。</p><p>  在我們的游戲程序中的PlayMusic類就是游戲中的音效類。該類的主要功能為使用MIDP2.0 Media API播放游戲中的聲音效果:背景音樂和游戲結(jié)束的提示音。</p><p>  我們用private Player createPlayer(String filename, String f, int i) 創(chuàng)建播放器。該方法中的filename是要播

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論