益智動(dòng)作游戲開(kāi)發(fā)——基于J2ME_第1頁(yè)
益智動(dòng)作游戲開(kāi)發(fā)——基于J2ME_第2頁(yè)
益智動(dòng)作游戲開(kāi)發(fā)——基于J2ME_第3頁(yè)
益智動(dòng)作游戲開(kāi)發(fā)——基于J2ME_第4頁(yè)
益智動(dòng)作游戲開(kāi)發(fā)——基于J2ME_第5頁(yè)
已閱讀5頁(yè),還剩20頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、目錄第一張 緒論.1第二章 平臺(tái)及J2ME體系結(jié)構(gòu)介紹1 2.2 J2ME平臺(tái)介紹2 2.3 MIDP4 2.4 J2ME的常用類(lèi)4 2.4.1 Display類(lèi)4 2.4.2 Canvas類(lèi)5 2.4.3 Graphics類(lèi)5 2.4.4 RMS記錄管理系統(tǒng)5 3.1 開(kāi)源的IDEeclipse6 3.2 eclipse插件eclipseME6 3.3 關(guān)于WTK6第四章 益智游戲推箱子的設(shè)計(jì)與制作7 4.1 游戲的策劃和準(zhǔn)備工作7 4.1.1 游戲策劃分析7 4.1.2 游戲準(zhǔn)備工作7 4.1.3 設(shè)計(jì)背景8 4.1.4 概要設(shè)計(jì)9 4.2 游戲架構(gòu)9 4.2.1 游戲的類(lèi)結(jié)構(gòu)9 4.2.

2、2 界面設(shè)計(jì)圖9 4.3 游戲關(guān)鍵技術(shù)實(shí)現(xiàn)12 4.3.1 GameMidlet類(lèi)12 4.3.3 GameChoose. 選關(guān)類(lèi)18第五張 系統(tǒng)調(diào)試和測(cè)試.22 5.1 程序調(diào)試23 5.2 系統(tǒng)的測(cè)試23結(jié)束語(yǔ)25致謝25參考文獻(xiàn)25第一章 緒論 無(wú)線(xiàn)通訊工業(yè)在過(guò)去的幾年中飛速發(fā)展,已經(jīng)成為世界上發(fā)展最快的技術(shù)領(lǐng)域之一。與此同時(shí),Internt的快速崛起已經(jīng)成為人們需求或辦公室的工作站來(lái)訪(fǎng)問(wèn)Internt。通過(guò)便捷方式,無(wú)限的設(shè)備訪(fǎng)問(wèn)Internt已經(jīng)成為人們需求的方向,這就更加增大了人們對(duì)無(wú)線(xiàn)設(shè)備的需求。同時(shí)手機(jī)的功能也變得豐富多彩,從以前的移動(dòng)電話(huà)逐漸變?yōu)榧ㄓ?短信,游戲,音頻和視頻

3、為一體的多功能掌上電腦。想必您一定使用過(guò)手機(jī)玩過(guò)游戲吧,是不是讓您真實(shí)感受到移動(dòng)游戲的驚奇體驗(yàn)。自己編寫(xiě)手機(jī)游戲,并把其移植到手機(jī)中無(wú)疑成為追求時(shí)尚的年輕人的新寵。SUN的J2ME平臺(tái)恰恰為我們提供了這樣的一個(gè)平臺(tái),只要掌握了基本的Java語(yǔ)言基礎(chǔ),就可以動(dòng)手為自己的手機(jī)開(kāi)發(fā)應(yīng)用程序,使手機(jī)開(kāi)發(fā)程序變的不再神秘。游戲作為人們?nèi)粘I畹囊粋€(gè)重要的娛樂(lè)項(xiàng)目,也帶動(dòng)了巨大的游戲相關(guān)產(chǎn)業(yè)市場(chǎng)的發(fā)展。游戲平臺(tái)從游戲機(jī)、電視游戲,到pc游戲,到手機(jī)游戲。隨著手機(jī)的日益普及,人們對(duì)手機(jī)的娛樂(lè)功能的需求也相應(yīng)增強(qiáng),尤其是近幾年手機(jī)2D、3D技術(shù)的日益成熟,大大地提高了手機(jī)游戲的娛樂(lè)性、操作性和方便性等多方面的

4、性能。而基于手機(jī)平臺(tái)的手機(jī)游戲也就擁有了巨大的市場(chǎng)空間,隨著3g的開(kāi)通和應(yīng)用,手機(jī)游戲必將迎來(lái)新的一輪游戲熱潮! J2ME在游戲開(kāi)發(fā)方面的優(yōu)勢(shì),由它開(kāi)發(fā)的各種軟件在手機(jī)上大規(guī)模的應(yīng)用將會(huì)刮起一陣勢(shì)不可擋的革命潮流。下面在本篇文章中就將詳細(xì)的介紹J2ME這一技術(shù)在手機(jī)游戲制作方面的具體過(guò)程和應(yīng)用。本文通過(guò)J2ME平臺(tái)下開(kāi)發(fā)一個(gè)推箱子的程序,并把它移植到手機(jī)上來(lái)學(xué)習(xí)無(wú)線(xiàn)設(shè)備的應(yīng)用程序開(kāi)發(fā)。同時(shí)對(duì)以前學(xué)過(guò)的課程操作系統(tǒng),Java語(yǔ)言等進(jìn)行鞏固。第二章 平臺(tái)及J2ME體系結(jié)構(gòu)介紹本文是在 J2ME這個(gè)大的平臺(tái)下進(jìn)行開(kāi)發(fā),這就要求我們先要了解J2ME,讓我們來(lái)看看JAVA2平臺(tái)的劃分。2.1 JAVA2

5、平臺(tái)的劃分和J2ME,J2AE 及J2EE 的關(guān)系 目前Java2平臺(tái)已經(jīng)正式劃分為3個(gè)部分它們分別是J2SE-Java2平臺(tái)標(biāo)準(zhǔn)版Java 2 platform standard Edition其被適用范圍最廣用于我們通常使用的臺(tái)式機(jī)desktop。J2EE-Java 2平臺(tái)企業(yè)版Java 2 Platform Enterprise Edition 被廣泛應(yīng)用于服務(wù)器上包括JSP Servlet EJB 以及目前炙手可熱的Web Service等技術(shù)。J2ME-Java2平臺(tái)微型版Java 2 Platform Micro Edition 被使用在資源受限小型消費(fèi)性電子設(shè)備上如電視機(jī)頂盒無(wú)線(xiàn)

6、電話(huà)掌上電腦等。如圖1所示: 圖2-1 Java版本的劃分和針對(duì)的設(shè)備 移動(dòng)設(shè)備PDA市場(chǎng)的繁榮發(fā)展照成了五花八門(mén)的廠(chǎng)商與品牌異常廣泛的設(shè)備,例如兩種設(shè)備也許具有相同的功能,但實(shí)現(xiàn)的方法可能有相當(dāng)大的區(qū)別。例如對(duì)PDA和手持電話(huà)來(lái)說(shuō)都具有顯示的功能, 但 屏幕的實(shí)際尺寸卻有很大的區(qū)別,支持的色深也不相同。重復(fù)的開(kāi)發(fā)工作以及移植的不便性使得開(kāi)發(fā)成本與開(kāi)發(fā)難度不斷提高,這就使得設(shè)備廠(chǎng)商需求擁有一個(gè)統(tǒng)一的開(kāi)發(fā)平臺(tái)。面對(duì)這個(gè)問(wèn)題Sun提出了J2ME的解決方法。2.2 J2ME平臺(tái)介紹 帶接入能力的消費(fèi)類(lèi) 電子設(shè)備,如手機(jī),傳呼機(jī),個(gè)人電子助理以及電視機(jī)頂盒之間有很多共同之處,但它們?cè)谛问?,功能和特性?/p>

7、又有很大的差異。信息產(chǎn)品總是趨向于特定用途和有限的功能。要適應(yīng)這些差異,對(duì)J2ME架構(gòu)的要求不僅僅是小,還是有模塊化能力和可定制能力。 J2ME結(jié)構(gòu)要設(shè)計(jì)成模塊化的和可縮的,以便它能支持客戶(hù)端和嵌入式設(shè)備市場(chǎng)的各種靈活的部署要求。為了達(dá)到這個(gè)目標(biāo),J2ME環(huán)境提供了一系列Java虛擬機(jī)技術(shù),分別為市場(chǎng)上各種常見(jiàn)的多種處理器和內(nèi)存布局作了優(yōu)化。 為了支持可定制能力和擴(kuò)展能力,J2ME架構(gòu)定義了三個(gè)基本的概念:Configuration,Profile和Optional Package。 如圖2-2所示: 圖2-2 Configuration和Proflie 設(shè)備的配置(Configuration

8、)為這些設(shè)備定義了一個(gè)基本的J2ME運(yùn)行環(huán)境,其中包括虛擬機(jī)和核心的java類(lèi)庫(kù)??梢园雅渲美斫鉃橐粋€(gè)針對(duì)某一類(lèi)設(shè)備的最小的Java平臺(tái),其中包括該類(lèi)設(shè)備的Java VM虛擬機(jī)功能最小子集和針對(duì)該類(lèi)設(shè)備的Java類(lèi)庫(kù)的最小集合。要注意的是 Configuration主要針對(duì)的是系統(tǒng)級(jí)的特性,如基本的Java語(yǔ)言的特性虛擬機(jī)的特性以及系統(tǒng)級(jí)的java核心類(lèi)庫(kù)等。J2ME配置Configuration包括兩種,分別是連接設(shè)備配置CDC和連接受限制設(shè)備配置CLDC。正如前面提到過(guò)的配置分別針對(duì)的是某一族系設(shè)備J2ME所支持的設(shè)備主要分為兩種分別通過(guò)CDC和CLDC支持。個(gè)人移動(dòng)信息設(shè)備指那些可以進(jìn)行

9、間隙性網(wǎng)絡(luò)連接的設(shè)備,如移動(dòng)電話(huà),雙向?qū)ず魴C(jī),PDA等這類(lèi)設(shè)備從性能上來(lái)講屬于地段設(shè)備由CLDC支持。共享連接信息設(shè)備指那些網(wǎng)絡(luò)連接固定不中斷的設(shè)備,如電視機(jī)頂盒,互聯(lián)網(wǎng)電視可視電話(huà)等這類(lèi)設(shè)備從性能上來(lái)講屬于高端設(shè)備由CDC支持。如圖2-3所示: 圖2-3 CDC,CLDC和J2SE的關(guān)系 CLDC為那些資源受限制不足以支持整個(gè)J2SE虛擬機(jī)環(huán)境以及J2ME核心類(lèi)庫(kù)的設(shè)備提供了運(yùn)行Java程序的基礎(chǔ)。然而作為一位應(yīng)用程序開(kāi)發(fā)者如果您只能通過(guò)CLDC提供的API來(lái)進(jìn)行編程是幾乎不可能的。因?yàn)镃LDC中并沒(méi)有提供給我們與用戶(hù)存儲(chǔ)設(shè)備網(wǎng)絡(luò)直接交互的工具。CLDC是一個(gè)技術(shù)層,其上層可以架設(shè)一系列的描

10、述(profiles)層來(lái)提供CLDC所缺失的功能。每一種profile被設(shè)計(jì)成適應(yīng)某種類(lèi)型的設(shè)備的形式,而移動(dòng)信息設(shè)備描述Mobile Information Device Protile-MIDP就是這些profile中的一種。MIDP是位于CLDC上層的Profile,是目前J2ME平臺(tái)中發(fā)展相對(duì)最成熟最廣為人知的Profile。如同MIDP的名字所描述的針對(duì)的是移動(dòng)信息設(shè)備Mobile Information Device。MID這類(lèi)設(shè)備通常指手機(jī)或是PDA,它們?cè)谄聊粌?nèi)存處理器等硬件特性上有諸多限制,所以說(shuō)在MID上開(kāi)發(fā)應(yīng)用程序必須要考慮一些技術(shù)上的特殊點(diǎn)。 所以在開(kāi)發(fā)此程序時(shí)我選擇

11、了集成有CLDC和MIDP開(kāi)發(fā)包的工具WTK。WTK共分為1.0.4,2.0以及2.1三個(gè)版本,針對(duì)本程序的特點(diǎn),我選擇2.0版本。由于篇幅的原因,詳細(xì)和查閱J2ME無(wú)線(xiàn)設(shè)備程序設(shè)計(jì)和Java手機(jī)/PDA程序設(shè)計(jì)入門(mén)。2.3 MIDP 這里主要針對(duì)的是CLDC設(shè)備。MIDP包含三個(gè)生命周期和事件處理等機(jī)制。三個(gè)生命周期:Pause狀態(tài):程序處于暫停狀態(tài),方法:pauseApp();Actived狀態(tài):程序處于運(yùn)行活動(dòng)狀態(tài),方法:startApp()。Destroy狀態(tài):程序銷(xiāo)毀前的狀態(tài),方法destroyApp。2.4 J2ME的常用類(lèi)2.4.1 Display類(lèi) Display類(lèi)代表了系統(tǒng)顯

12、示屏和輸入設(shè)備的管理器,包含用來(lái)獲取設(shè)備屬性的方法,以及要求在設(shè)備上顯示對(duì)象的方法,其他處理設(shè)備的方法主要應(yīng)用在 Canvas對(duì)象。Display類(lèi)直接從Object繼承而來(lái)。2.4.2 Canvas類(lèi) 為了能有程序開(kāi)發(fā)人員控制接口的外觀(guān)和行為,需要使用大量的初級(jí)用戶(hù)接口類(lèi),尤其在游戲程序中,幾乎完全依賴(lài)的就是Canvas 抽象類(lèi)進(jìn)行繪圖。從程序開(kāi)發(fā)的觀(guān)點(diǎn)看,Canvas類(lèi)可與高級(jí)Screen 類(lèi)交互,程序可在需要時(shí)在Canvas 中摻入高級(jí)類(lèi)的組件。Canvas 提供了鍵盤(pán)事件、指點(diǎn)桿事件(如果設(shè)備支持),并定義了允許將鍵盤(pán)按鍵映射為游戲控制鍵的函數(shù)。鍵盤(pán)事件由鍵代碼指定,但這樣控制游戲會(huì)導(dǎo)

13、致缺乏通用性,并不是每個(gè)設(shè)備的鍵盤(pán)布局都適合游戲的操作。應(yīng)當(dāng)將鍵代碼轉(zhuǎn)換為游戲鍵的代碼,以便硬件開(kāi)發(fā)商能定義他們自己的游戲鍵布局。 2.4.3 Graphics類(lèi) Graphics 是圖形處理的基礎(chǔ)類(lèi),提供了簡(jiǎn)單的2D 繪圖功能。使用Graphics 類(lèi)可以在屏幕上繪制圖片、線(xiàn)條、文字等多種低級(jí)的界面。它具有 24 位深度色彩的繪制能力,以三原色分別各占一個(gè)字節(jié)表示其顏色。程序只能在 paint() 函數(shù)中使用 Graphics 繪制, GameCanvas 可調(diào)用 getGraphics()函數(shù)直接繪制在緩沖區(qū)上,可以在任何時(shí)間請(qǐng)求傳輸?shù)角芭_(tái)。其對(duì)象會(huì)被傳給Canvas的paint()函數(shù),

14、以便最終顯示。2.4.4 RMS記錄管理系統(tǒng) 移動(dòng)信息設(shè)備框架(Mobile Information Device Profile)和 移動(dòng) Java 應(yīng)用程序的平臺(tái)為MIDP應(yīng)用程序提供一種跨多個(gè)調(diào)用持久存儲(chǔ)數(shù)據(jù)的機(jī)制。這種持久存儲(chǔ)機(jī)制可以被視為一種簡(jiǎn)單的面向記錄的數(shù)據(jù)庫(kù)模型,被稱(chēng)為記錄管理系統(tǒng)(record management system(RMS)。通過(guò)這種機(jī)制,MIDlet 能夠持久存儲(chǔ)數(shù)據(jù),并在以后檢索數(shù)據(jù)。在面向記錄的方法中,J2ME RMS 由多個(gè)記錄存儲(chǔ)構(gòu)成。 可以將每個(gè)記錄存儲(chǔ)想像成一個(gè)記錄集合,它將跨多個(gè) MIDlet 調(diào)用持久存在。設(shè)備平臺(tái)負(fù)責(zé)在平臺(tái)正常使用的整個(gè)過(guò)程(

15、包括重新啟動(dòng)、換電池等)中,盡全力維護(hù) MIDlet 的記錄存儲(chǔ)的完整性。記錄存儲(chǔ)在與平臺(tái)相關(guān)的位置(比如非易失性設(shè)備存儲(chǔ)器)創(chuàng)建,這些位置不直接公開(kāi)給 MIDlet。RMS 類(lèi)調(diào)用特定于平臺(tái)的本機(jī)代碼,這種本機(jī)代碼使用標(biāo)準(zhǔn) OS 數(shù)據(jù)管理器函數(shù)來(lái)執(zhí)行實(shí)際的數(shù)據(jù)庫(kù)操作。 記錄存儲(chǔ)實(shí)現(xiàn)確保所有單個(gè)的記錄存儲(chǔ)操作都是原子的、同步的以及序列化的,因此多個(gè)訪(fǎng)問(wèn)將不會(huì)出現(xiàn)數(shù)據(jù)毀壞。記錄存儲(chǔ)被蓋上時(shí)間戳來(lái)指示它上次被修改的時(shí)間。記錄存儲(chǔ)還維護(hù)版本(version),它是一個(gè)整數(shù),修改記錄存儲(chǔ)內(nèi)容的操作每發(fā)生一次,這個(gè)數(shù)加一。版本和時(shí)間戳對(duì)于同步目的很有用。當(dāng) MIDlet 使用多個(gè)線(xiàn)程訪(fǎng)問(wèn)一個(gè)記錄存儲(chǔ)時(shí),

16、協(xié)調(diào)該訪(fǎng)問(wèn)是 MIDlet 的責(zé)任;如果它不能這樣做,可能出現(xiàn)無(wú)法意料的結(jié)果。同樣,如果一個(gè)平臺(tái)使用試圖同時(shí)訪(fǎng)問(wèn)記錄存儲(chǔ)的多個(gè)線(xiàn)程執(zhí)行記錄存儲(chǔ)的同步,那么對(duì) MIDlet 及其同步引擎之間的記錄存儲(chǔ)實(shí)施排外訪(fǎng)問(wèn)是平臺(tái)的責(zé)任。 記錄存儲(chǔ)中的每個(gè)記錄是一個(gè)字節(jié)數(shù)組,并且有唯一的整數(shù)標(biāo)識(shí)符。第三章 開(kāi)發(fā)工具相關(guān)3.1開(kāi)源的IDEeclipse Eclipse 是一個(gè)開(kāi)放源代碼的、基于Java的可擴(kuò)展開(kāi)發(fā)平臺(tái)。就其本身而言,它只是一個(gè)框架和一組服務(wù),用于通過(guò)插件組件構(gòu)建開(kāi)發(fā)環(huán)境。幸運(yùn)的是,Eclipse 附帶了一個(gè)標(biāo)準(zhǔn)的插件集,包括Java開(kāi)發(fā)工具(Java Development Kit,JDK)。

17、 雖然大多數(shù)用戶(hù)很樂(lè)于將 Eclipse 當(dāng)作 Java 集成開(kāi)發(fā)環(huán)境(IDE)來(lái)使用,但 Eclipse 的目標(biāo)卻不僅限于此。Eclipse 還包括插件開(kāi)發(fā)環(huán)境(Plug-in Development Environment,PDE),這個(gè)組件主要針對(duì)希望擴(kuò)展 Eclipse 的軟件開(kāi)發(fā)人員,因?yàn)樗试S他們構(gòu)建與 Eclipse 環(huán)境無(wú)縫集成的工具。由于 Eclipse 中的每樣?xùn)|西都是插件,對(duì)于給 Eclipse 提供插件,以及給用戶(hù)提供一致和統(tǒng)一的集成開(kāi)發(fā)環(huán)境而言,所有工具開(kāi)發(fā)人員都具有同等的發(fā)揮場(chǎng)所。 Eclipse最初主要用來(lái)Java語(yǔ)言開(kāi)發(fā),但是目前亦有人通過(guò)插件使其作為其他計(jì)算機(jī)

18、語(yǔ)言比如C+和Python的開(kāi)發(fā)工具。Eclipse的本身只是一個(gè)框架平臺(tái),但是眾多插件的支持使得Eclipse擁有其他功能相對(duì)固定的IDE軟件很難具有的靈活性。許多軟件開(kāi)發(fā)商以Eclipse為框架開(kāi)發(fā)自己的IDE。 Eclipse 最初由OTI和IBM兩家公司的IDE產(chǎn)品開(kāi)發(fā)組創(chuàng)建,起始于1999年4月。IBM提供了最初的Eclipse代碼基礎(chǔ),包括Platform、JDT 和PDE。目前由IBM牽頭,圍繞著Eclipse項(xiàng)目已經(jīng)發(fā)展成為了一個(gè)龐大的Eclipse聯(lián)盟,有150多家軟件公司參與到Eclipse項(xiàng)目中,其中包括Borland、Rational Software、Red Hat及

19、Sybase等。Eclipse是一個(gè)開(kāi)發(fā)源碼項(xiàng)目,它其實(shí)是Visual Age for Java的替代品,其界面跟先前的Visual Age for Java差不多,但由于其開(kāi)放源碼,任何人都可以免費(fèi)得到,并可以在此基礎(chǔ)上開(kāi)發(fā)各自的插件,因此越來(lái)越受人們關(guān)注。近期還有包括Oracle在內(nèi)的許多大公司也紛紛加入了該項(xiàng)目,并宣稱(chēng)Eclipse將來(lái)能成為可進(jìn)行任何語(yǔ)言開(kāi)發(fā)的IDE集成者,使用者只需下載各種語(yǔ)言的插件即可。 本文使用的eclipse為Indigo版本。3.2 eclipse插件eclipseME EclipseME是一個(gè)用來(lái)開(kāi)發(fā)J2ME應(yīng)用程序的Eclipse插件。EclipseME集

20、成了“無(wú)線(xiàn)工具包”,讓您可以專(zhuān)注于開(kāi)發(fā)應(yīng)用程序,不必?fù)?dān)心J2ME開(kāi)發(fā)的特殊需求。同時(shí)EclipseME集成了Eclipse現(xiàn)有的java editor功能,提高代碼的編寫(xiě)效率。本文使用的eclipseME版本為1.7.9。3.3 關(guān)于WTK WTK 的全稱(chēng)是Sun J2ME Wireless Toolkit Sun的無(wú)線(xiàn)開(kāi)發(fā)工具包。這一工具包的設(shè)計(jì)目的是為了幫助開(kāi)發(fā)人員簡(jiǎn)化j2me的開(kāi)發(fā)過(guò)程。使用其中的工具可以開(kāi)發(fā)與 Java Technology for the Wireless Industry (JTWI, JSR 185) 規(guī)范兼容的設(shè)備上運(yùn)行的j2me 應(yīng)用程序。它通用性高,開(kāi)發(fā)出的

21、應(yīng)用程序可保證能運(yùn)行在大部分設(shè)備上,而不像專(zhuān)用廠(chǎng)商具有一定的不兼容性。雖然它沒(méi)有強(qiáng)大的功能和完善的調(diào)試手段,但它提供運(yùn)行仿真器的最基本組件,是其他IDE需集成采用的必備元素。第四章 益智游戲推箱子的設(shè)計(jì)與制作4.1游戲的策劃和準(zhǔn)備工作4.1.1游戲策劃分析 推箱子游戲是一款經(jīng)典而又益智的游戲,本文設(shè)計(jì)的推箱子游戲是一個(gè)基于J2ME的游戲,并且對(duì)以往推箱子游戲使用優(yōu)化方法提高了游戲的性能,主要包括:雙緩存技術(shù)、游戲關(guān)卡設(shè)計(jì)優(yōu)化、圖片優(yōu)化、部分重繪、簡(jiǎn)化碰撞檢測(cè)。本系統(tǒng)主要是完成推箱子游戲的基礎(chǔ)操作。用戶(hù)可以自己練習(xí)和娛樂(lè)。本系統(tǒng)需要滿(mǎn)足以下幾點(diǎn)要求: (1)利用方向鍵來(lái)改變小人的運(yùn)行方向; (2

22、)可以自行選擇游戲的關(guān)卡; (3)完成一關(guān)會(huì)出現(xiàn)下一關(guān)的入口。 圖4-1.1推箱子游戲界面4.1.2 游戲準(zhǔn)備工作 游戲過(guò)程中使用的圖,如圖所示,包括主角、箱子和地形圖片。 圖4-1.2.游戲過(guò)程中使用的圖片4.1.3 設(shè)計(jì)背景 首先,一定要有個(gè)主應(yīng)用程序類(lèi),相信大家都應(yīng)改知道;其次,不可避免,一定要有畫(huà)布,為了把程序的畫(huà)面呈現(xiàn)出來(lái);其中,我覺(jué)得還是把地圖跟畫(huà)布分開(kāi),這樣對(duì)地圖管理比較容易,而且增加或修改地圖比較方便;然后一定要有主角對(duì)吧,總要找個(gè)推箱子的人;說(shuō)到箱子,也許箱子也需要管理吧。 先拋開(kāi)箱子(BoxSprite)和推箱子的人(PlayerSprite)兩個(gè)類(lèi),把全部經(jīng)歷集中到繪制地

23、圖上(其實(shí)不過(guò)是第一幅地圖)。 1.這其中需要先了解幾個(gè)類(lèi),GameCanvas 、LayerManager和TiledLayer等幾個(gè)類(lèi)。我們這里主要用TiledLayer這種方法構(gòu)造背景。 GameCanvas 類(lèi):GameCanvas實(shí)際上就是屏幕上一個(gè)可繪制區(qū)域。但每個(gè)GameCanvas類(lèi)都有一個(gè)獨(dú)立的buffer,從而不但減少了堆的使用率,也可以使用單獨(dú)的堆控制程序。 LayerManager 類(lèi):這個(gè)類(lèi)用來(lái)管理圖像的各個(gè)層,它將按正確的位置和次序渲染所有在它控制下的土層。 TiledLayer 類(lèi):通過(guò)使用這個(gè)函數(shù)可以定義游戲背景的特定區(qū)域,并且可以重復(fù)利用它們生成一個(gè)完整的圖像

24、。 2. Image類(lèi)是用于保存圖形圖像數(shù)據(jù)。最主要的特點(diǎn)就是不可修改,即一旦創(chuàng)建就不能再被修改,位于Alert、Choice、ImageItem對(duì)象中的Image都要求不可修稿的。還有個(gè)特點(diǎn)就是可修改,比如使用Image.createImage(int width,int height)可以創(chuàng)建一個(gè)修改Image。 3. MIDP2.0新增的GameCanvas包GameCanvas類(lèi)是Canvas的子類(lèi)。它代表了游戲的基本界面。在GameCanvas上進(jìn)行繪制代替了直接在Canvas繪畫(huà)。GameCanvas自動(dòng)實(shí)現(xiàn)了雙緩沖,并提供了輪詢(xún)鍵盤(pán)輸入事件的方法。GameCanvas類(lèi)繼承自Ca

25、nvas,所以具有Canvas的功能,還額外增加了一些便于游戲設(shè)計(jì)功能。比如:GameCanvas類(lèi)直接提供了getKeyStates(),使程序員可以同一個(gè)線(xiàn)程自己偵測(cè)按鍵狀態(tài)。GameCanvas類(lèi)提供flushGraphics()的功能,實(shí)現(xiàn)了雙緩沖技術(shù)。4.1.4 概要設(shè)計(jì) 本程序共AllMap.java,Continue.java, GameChoose.java, GameMain.java, GameMidlet.java, ImageAction.java, Map.java6個(gè)java源文件:AllMap.java:設(shè)計(jì)了所有推箱子的地圖數(shù)組;Continue.java:游戲

26、是否繼續(xù);GameChoose.java:選關(guān);GameMain.java:主游戲進(jìn)入游戲狀態(tài); GameMidlet.java:該文件是MIDlet父類(lèi)的子類(lèi);ImageAction.java;圖片運(yùn)行及顯示;Map.java:設(shè)置地圖長(zhǎng),寬,高等參數(shù)及游戲角 色;4.2游戲架構(gòu)4.2.1 游戲的類(lèi)結(jié)構(gòu) 整個(gè)游戲共由6個(gè)類(lèi)組成。游戲的GameMidlet類(lèi)負(fù)責(zé)保持display對(duì)象,顯示游戲畫(huà)布并啟動(dòng)游戲線(xiàn)程。GameMidlet繼承自MIDlet,程序從它的構(gòu)造函數(shù)GameStart()被調(diào)用開(kāi)始,通過(guò)它的destroyApp(boolean arg()方法結(jié)束。所有的可視對(duì)象都必須調(diào)用它

27、的setDisplayable(Displayable displayable)方法使自己出現(xiàn)在屏幕上。所有類(lèi)以MyGameCanvas類(lèi)為核心,該類(lèi)實(shí)現(xiàn)了游戲的所有用戶(hù)界面。GameMap類(lèi)是用來(lái)描述游戲關(guān)卡的專(zhuān)用數(shù)據(jù)結(jié)構(gòu),該類(lèi)中定義了地圖布局。 4.2.2界面設(shè)計(jì)圖 (1)開(kāi)始顯示初始化游戲界面,主界面顯示各種鍵的功能以及菜單-新游戲和選關(guān)。(如圖4-2.2所示) (2)如果選關(guān),則出現(xiàn)選關(guān)界面,按確定開(kāi)始選關(guān),進(jìn)入游戲界面,取消則返回初始化界面。(如圖4-2.3所示) (3)開(kāi)始玩游戲,如果贏了可進(jìn)入下一關(guān)或重來(lái)。采用確定和取消來(lái)實(shí)現(xiàn)以上功能。(如圖4-2.4、圖4-2.5所示) 圖4-

28、2.2:初始化界面 圖4-2.3:選關(guān)界面 圖4-2.4:開(kāi)始游戲界面 圖4-2.5:過(guò)關(guān)出現(xiàn)的界面進(jìn)入游戲界面選關(guān)新游戲下一關(guān)重玩返回主界面主程序模塊內(nèi)容使用取消確定恭喜過(guò)關(guān)確定取消取消確定 圖10:系統(tǒng)結(jié)構(gòu)框圖 代碼的實(shí)現(xiàn)/* * GameMidlet.java*/package gamepackage;import javax.microedition.midlet.*;import javax.microedition.lcdui.*;public class GameMidlet extends MIDlet /繼承MIDlet類(lèi)的GameMidlet private Display

29、 display=null; private GameChoose choice=null; public GameMidlet() choice=new GameChoose(this); display=Display.getDisplay(this);/要使組件能在屏幕上顯示 public void startApp()/ display.setCurrent(choice);/把choice設(shè)置為當(dāng)前界面 public void pauseApp() /暫停 public void play(Displayable displayable) display.setCurrent(dis

30、playable);/ 把displayable設(shè)置為當(dāng)前界面 public void destroyApp(boolean unconditional) /銷(xiāo)毀4.3 游戲關(guān)鍵技術(shù)實(shí)現(xiàn)4.3.1 GameMidlet類(lèi) 游戲的GameMidlet類(lèi)負(fù)責(zé)保持display對(duì)象,顯示游戲畫(huà)布并畫(huà)布啟動(dòng)游戲線(xiàn)程。GameMidlet繼承自MIDlet,程序從它的構(gòu)造函數(shù)GameStart()被調(diào)用開(kāi)始,通過(guò)它的destroyApp(boolean unconditional)方法銷(xiāo)毀。所有的可視對(duì)象都必須調(diào)用它的setDisplayable(Displayable displayable)方法使自

31、身出現(xiàn)在屏幕上。4.3.2 ImageAction.圖片運(yùn)行及顯示類(lèi)package gamepackage;import javax.microedition.lcdui.*;/* * * author bense */public class ImageAction /* Creates a new instance of ImageAction */ public ImageAction() public static Image getImage(String url) Image img=null; try img=Image.createImage(url); catch(Excep

32、tion e) e.printStackTrace(); return img; 4.3.2 Map地圖類(lèi) Map類(lèi)主要用來(lái)載入游戲的地圖信息。首先,場(chǎng)景地圖通過(guò)精美圖片來(lái)貼塊。package gamepackage;import javax.microedition.lcdui.Graphics;import javax.microedition.lcdui.game.*;/* * * author bense */public class Map private Sprite sp1=new Sprite(ImageAction.getImage("/1.png");

33、private Sprite sp2=new Sprite(ImageAction.getImage("/2.png"); private Sprite sp3=new Sprite(ImageAction.getImage("/3.png"); private Sprite sp4=new Sprite(ImageAction.getImage("/4.png"); private Sprite sp5=new Sprite(ImageAction.getImage("/5.png"); private int

34、length=ImageAction.getImage("/1.png").getHeight(); private boolean finish; private Graphics g; private GameMain game=null; private int box; private int container; private int map; private int x,y; private int w,h; /* Creates a new instance of Map */ public Map(GameMain game,Graphics g,int

35、index) this.game=game; this.g=g; initMap(index); public void initMap(int index) AllMap all=new AllMap(); map=all.getMap(index); box=new intall.getBoxLength(index, 3)2; container=new intall.getBoxLength(index, 2)2; finish=false; init(2); init(3); init(4); setXY(); private void setXY() x=(game.getWidt

36、h()-map0.length*length)/2; y=(game.getHeight()-map.length*length+10)/2; private void setBox() int findex=0; for(int i=0;i<container.length;i+) for(int j=0;j<box.length;j+) if(containeri0=boxj0&&containeri1=boxj1) Sp(containeri1,containeri0,5); findex+; finish=(findex=container.length);

37、 public boolean isFinish() return finish; public void Sp(int w,int h,int index) switch(index) case 1: sp1.setPosition(x+w*length,y+h*length); sp1.paint(g); break; case 2: sp2.setPosition(x+w*length,y+h*length); sp2.paint(g); break; case 3: sp3.setPosition(x+w*length,y+h*length); sp3.paint(g); break;

38、 case 4: sp4.setPosition(x+w*length,y+h*length); sp4.paint(g); break; case 5: sp5.setPosition(x+w*length,y+h*length); sp5.paint(g); break; public void paint() g.setColor(0x6A4055); g.fillRect(x,y,length*map0.length,length*map.length); setContainer(); setMap(); setMan(); setBox(); private void setCon

39、tainer() for(int i=0;i<container.length;i+) Sp(containeri1,containeri0, 2); private void setMap() for(int i=0;i<map.length;i+) for(int j=0;j<map0.length;j+) Sp(j,i,mapij); private void setMan() Sp( w, h, 4); private void set(int x1,int y1,int x2,int y2) mapy1x1=0; mapy2x2=3; for(int i=0;i&l

40、t;box.length;i+) if(boxi0=y1&&boxi1=x1) boxi0=y2; boxi1=x2; private boolean isEmpty(int w,int h) return maphw=0; public void getKey(int keyCode) switch(keyCode) case 1: if(isEmpty(w, h-1) h-=1; else if(h>1&&maph-1w!=1&&isEmpty(w, h-2) set(w, h-1, w, h-2); h-=1; break; case

41、 3: if(isEmpty(w, h+1) h+=1; else if(h<map.length-2&&maph+1w!=1&&isEmpty(w, h+2) set(w, h+1, w, h+2); h+=1; break; case 2: if(isEmpty(w-1, h) w-=1; else if(w>1&&maphw-1!=1&&isEmpty(w-2, h) set(w-1, h, w-2, h); w-=1; break; case 4: if(isEmpty(w+1, h) w+=1; else i

42、f(w<map0.length-2&&maphw+1!=1&&isEmpty(w+2, h) set(w+1, h, w+2, h); w+=1; break; public void init(int index) int in=0; for(int i=0;i<map.length;i+) for(int j=0;j<map0.length;j+) if(mapij=index) switch(index) case 3: boxin0=i; boxin1=j; in+; break; case 2: containerin0=i; con

43、tainerin1=j; in+; mapij=0; break; case 4: w=j; h=i; mapij=0; break; case 5: containerin0=i; containerin1=j; boxin0=i; boxin1=j; mapij=3; in+; break; 游戲時(shí)的場(chǎng)景如圖 如圖4-3.2游戲時(shí)的場(chǎng)景4.3.3 GameChoose. 選關(guān)類(lèi) 游戲在玩下一個(gè)關(guān)時(shí),會(huì)出現(xiàn)選擇你想要的下一關(guān)。package gamepackage;import javax.microedition.lcdui.*;/* * * author bense */public c

44、lass GameChoose extends Canvas private GameMidlet midlet=null; private boolean ok; private boolean select; private boolean ok2; private int select2; private int index; private int w,h; private GameMain game=null; public GameChoose(GameMidlet midlet) this.midlet=midlet; init(); public void init() reset(); public void reset() ok=true; select=false; ok2=false; select2=0; index=-1; public void show() midlet.play(this); public void paint(Graphics g) h=getHeight(); w=getWidth(); g.setColor(0xffffff); g.fillRect(0,0, w,h); g.setFon

溫馨提示

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

評(píng)論

0/150

提交評(píng)論