




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
PAGE基于J2ME平臺的手機游戲程序開發(fā)摘要隨著手機的日益普及、Java功能在移動設(shè)備上的實現(xiàn),Java應(yīng)用程序產(chǎn)生的手機增值服務(wù)逐漸體現(xiàn)出其影響力,對豐富人們的生活內(nèi)容、提供快捷的資訊起著不可忽視的作用。本篇論文共分為五個部分:包括引言、J2ME技術(shù)概覽、開發(fā)環(huán)境及相關(guān)技術(shù)、游戲設(shè)計和具體設(shè)計。其中具體設(shè)計是本篇論文的重點。整篇論文都是圍繞著這一部分來展開論述的,在這一部分里詳細(xì)介紹一款借助J2ME的MIDP類庫開發(fā)手機游戲的全過程。關(guān)鍵詞:手機游戲J2MEMIDPAbstractMobilephonevalue-addedservicehasbeenmakinganonnegligibleimpactonenrichingpeople'slivesandsupplyingfastinformationsasresultofincreasingpopularityofmobilephoneandimplementationofJavatechnologyonmobileequipment.Thispaperisdividedintofiveparts:includingintroduction,J2MEtechnologyoverview,developmentenvironmentandrelatedtechnology,gamedesign,andthespecificdesign.Onespecificdesignisthekeypartinthispaper.ThewholethesisisbasedonthisparttodiscusswhichdetailsthefullprocessofcellphonegamedevelopmentbasedontheMIDPclasslibraryofJ2ME.Keywords:mobilegameJ2MEMIDP
目錄1.緒論 11.1J2ME的背景與應(yīng)用現(xiàn)狀 11.2手機游戲的發(fā)展現(xiàn)狀 21.3研究目的與內(nèi)容 22.J2ME技術(shù)概覽 32.1J2ME簡介 32.2J2ME體系結(jié)構(gòu) 32.2.1 JVM(虛擬機) 32.2.2J2ME配置 42.2.3 J2ME簡表 42.3移動設(shè)備上游戲的限制 52.3.1 內(nèi)存 62.3.2 手機的界面 62.3.3 缺少庫文件支持 63.開發(fā)環(huán)境及相關(guān)技術(shù) 83.1游戲開發(fā)環(huán)境 83.2關(guān)于WirelessToolKit 84.《勇闖伏魔洞》RPG游戲設(shè)計 94.1游戲簡介 94.2游戲的流程和類結(jié)構(gòu) 94.2.1游戲的基本運行流程 94.2.2游戲的類結(jié)構(gòu) 94.3圖像和動畫渲染 104.3.1 GameCanvas 104.3.2 Layer 114.3.3 LayerManager 114.3.4 Sprite 114.3.5 TiledLayer 124.4游戲畫布類Game_Canvas的實現(xiàn) 124.4.1Game_Canvas繼承GameCanvas類,用來實現(xiàn)整個游戲的主界面 124.4.2此游戲畫布類中主要的實現(xiàn) 144.5游戲的運行 235.總結(jié) 25謝辭 26參考文獻(xiàn) 27XXXXXXXXXXX畢業(yè)論文-PAGE27-1.緒論1.1J2ME的背景與應(yīng)用現(xiàn)狀自Java問世以來,SunMicrosystems已成功地將Java平臺技術(shù)推廣到臺式機及服務(wù)器。隨著移動電話和個人數(shù)字助理(PDA)的日益普及和性能的不斷提高,將Java技術(shù)應(yīng)用于移動設(shè)備這個發(fā)展方向,將在未來得到更高的重視。J2ME(Java2MicroEdition)是為小型設(shè)備設(shè)計的Java平臺。它包含專門設(shè)計的輕量級虛擬機,一個最小化的核心庫和標(biāo)準(zhǔn)Java庫的輕量級替代物。J2ME是無線PDA和高性能的移動電話的理想移動客戶機平臺。SunMicrosystems將J2ME定義為“一種以廣泛的消費性產(chǎn)品為目標(biāo)的高度優(yōu)化的Java運行時環(huán)境,包括尋呼機、移動電話、可視電話、數(shù)字機頂盒和汽車導(dǎo)航系統(tǒng)?!弊詮?999年DeveloperConferencence上聲明之后,J2ME為小型設(shè)備帶來了Java語言的跨平臺功能,允許移動無線設(shè)備共享應(yīng)用程序。在另一方面,隨著移動通信技術(shù)的高速發(fā)展,移動設(shè)備的性能日益提高,同時用戶對于移動設(shè)備上應(yīng)用程序的需求也越來越多。但是,移動設(shè)備制造商本身的軟件開發(fā)能力和資源都有限,無法充分滿足用戶的需要。同時,由于以前主要移動設(shè)備上的程序主要用C語言開發(fā),并釆用專用的操作系統(tǒng),其他眾多軟件開發(fā)商也無法為其開發(fā)新的應(yīng)用程序。這種兩難的局面嚴(yán)重的限制了移動設(shè)備上新應(yīng)用的推廣于普及。Java技術(shù)的開放性、安全性和龐大的社會己有資源,以及其跨平臺性,即“編寫一次,到處運行”的特點,使Java技術(shù)成為智能手機軟件平臺的事實標(biāo)準(zhǔn)。采用Java技術(shù)后,編寫應(yīng)用程序和提供服務(wù)的人就不必關(guān)心接受其服務(wù)的手機采用的是什么操作系統(tǒng)和芯片,只要按照J(rèn)ava的要求寫出的程序就可以運行;同樣,生產(chǎn)手機的廠商也不必顧慮將來誰來提供增值服務(wù)??梢钥闯?,釆用Java技術(shù),可以建立完整、高效的無線數(shù)據(jù)增值服務(wù)產(chǎn)業(yè)鏈,從而為用戶提供靈活、個性化、內(nèi)容方式多樣的服務(wù)。如今支持Java己經(jīng)成了主流手機的標(biāo)準(zhǔn),支持下載新的Java應(yīng)用也是手機的一個重要賣點。到2005年6月,全世界已經(jīng)有大約1億部Java手機在使用,除中國大陸外共有53個移動運營商正式推出了基于Java技術(shù)的無線數(shù)據(jù)增值服務(wù)。在國內(nèi),中國移動通信集團已經(jīng)建立了無線Java增值服務(wù)體系,并推出了“百寶箱”等服務(wù)品牌,包括游戲百寶箱、娛樂百寶箱、商務(wù)百寶箱、生活百寶箱等,己經(jīng)于2003年中國聯(lián)通公司也正在其CDMAIX網(wǎng)絡(luò)上建立無線Java增值服務(wù)體系,目前系統(tǒng)正在建設(shè)過程中,并且2003年9月26日中國聯(lián)通、北京振戎融通公司和Sun公司在人民大會堂宣布聯(lián)合發(fā)起成立“UniJa技術(shù)聯(lián)盟”1.2手機游戲的發(fā)展現(xiàn)狀所謂“手機游戲”,就是依托移動通信網(wǎng)絡(luò)運行在手機終端上的游戲。從誕生到現(xiàn)在,手機游戲經(jīng)歷了從最初的簡單文字類游戲、簡單的圖形界面游戲到可下載的單機版游戲再到大型手機網(wǎng)絡(luò)游戲的發(fā)展歷程,手機游戲的業(yè)務(wù)形態(tài)日益成熟,展示出廣闊的市場前景。有關(guān)機構(gòu)預(yù)測,在未來5年里,手機游戲?qū)⒃跉W洲形成30億歐元的大市場。另據(jù)IDC預(yù)測,到2006年,手機游戲業(yè)務(wù)的軟件、硬件及服務(wù)所帶來的收入將達(dá)到40億美元。近兩年來,手機游戲業(yè)務(wù)在日韓等國已經(jīng)顯示出勃勃生機,成為一個潛力巨大的文化產(chǎn)業(yè)。以日本NTTDoCoMo目前的經(jīng)營狀況為例,移動游戲己經(jīng)成為該公司的重要收入來源。日本最大的游戲網(wǎng)站BanDai擁有200多萬用戶,每個用戶每月平均花2.75美元在i-mode手機上玩游戲,這為DoCoMo和BanDai帶來約550萬美元的收入。與日、韓等國相比,中國的手機游戲市場起步比較晚,但中國有一個巨大的手機用戶群,手機游戲擁有廣闊的市場前景。目前,在中國有8000多萬電腦網(wǎng)絡(luò)用戶,而中國的手機用戶卻已經(jīng)超過3億。與PC游戲不同,手機游戲擺脫了線纜的束縛,具有隨時、隨地、隨身的特點,更適合人們在移動中休閑和娛樂。顯然,手機游戲產(chǎn)業(yè)一旦啟動,其能量將不亞于目前的電腦網(wǎng)絡(luò)游戲。數(shù)據(jù)顯示,2004年中國手機游戲市場規(guī)模超過8億元人民幣,預(yù)計在2005年手機游戲產(chǎn)業(yè)市場規(guī)模將達(dá)到14.41億元人民幣。雖然目前手機游戲用戶數(shù)只占3億用戶的很小一部分,但隨著手機游戲產(chǎn)業(yè)發(fā)展環(huán)境的日益成熟,其發(fā)展速度將一日千里。1.3研究目的與內(nèi)容基于移動設(shè)備的應(yīng)用軟件,從以前的只提供基本的語音,通訊錄和SMS功能,到后來提供WAP(WirelessApplicationProtocol)等基本的附加應(yīng)用,再到目前逐漸豐富的各種應(yīng)用。J2ME平臺的出現(xiàn),為第三方軟件開發(fā)商為移動設(shè)備開發(fā)應(yīng)用軟件帶來了極大的便利,開發(fā)商可以方便的將應(yīng)用軟件移植到移動設(shè)備上。豐富的Java資源和Java開發(fā)人員,可以大大的縮短開發(fā)周期。同時也可以為移動應(yīng)用提供在線升級和動態(tài)下載的服務(wù)。本次研究的目的主要在于分析基于J2ME平臺進(jìn)行手機游戲開發(fā)所用到的核心技術(shù),如繪圖、圖形與動畫顯示,響應(yīng)用戶輸入,網(wǎng)絡(luò)通訊。并且還要針對J2ME平臺本身的缺點,以及具體的應(yīng)用,提出自己的改進(jìn)方法和解決方案。2.J2ME技術(shù)概覽2.1J2ME簡介SunMicrosystems公司將J2ME定義為“一種以廣泛的消費性信息產(chǎn)品為目標(biāo)的,高度優(yōu)化的java運行時環(huán)境”。它主要針對消費類電子設(shè)備,例如,蜂窩電話和可視電話、數(shù)字機頂盒、汽車導(dǎo)航系統(tǒng)等。J2ME技術(shù)在1999年的JavaOneDeveloperConference大會上正式推出,它將Java語言與平臺無關(guān)的特性移植到小型潛入式設(shè)備上,允許移動無線設(shè)備之間共享應(yīng)用程序。在消費電子和嵌入式設(shè)備領(lǐng)域,內(nèi)存從幾百KB到幾十MB,從沒有屏幕到Web-TV,CPU從低功耗的嵌入式處理器到幾百MHz的RISC處理器,硬件條件的差異是相當(dāng)大的。這就使得J2ME的標(biāo)準(zhǔn)需要有不同的層次和類別來適應(yīng)這個復(fù)雜的領(lǐng)域,因此相比之下J2ME就比J2SE和J2EE的標(biāo)準(zhǔn)要復(fù)雜得多。盡管如此,J2ME在適用于這些設(shè)備的同時也保留了Java的傳統(tǒng)特性,即代碼具有可移植性、部署靈敏性、安全的網(wǎng)絡(luò)傳輸性和代碼的穩(wěn)定性等。因此,J2ME目前已經(jīng)被廣泛應(yīng)用于消費類嵌入式設(shè)備,成為嵌入式開發(fā)的一種標(biāo)準(zhǔn)。2.2J2ME體系結(jié)構(gòu)從整體看,J2ME平臺由以下幾部分組成:●Java虛擬機,針對不同的嵌入式設(shè)備以及為了滿足不同的需要,提供了KVM和CVM兩大虛擬機。●配置(configuration),它是將某一類特定應(yīng)用范疇的設(shè)備的共性提取出來形成的規(guī)范。為開發(fā)人員提供了最基礎(chǔ),能在所有平臺上通用的核心API類庫?!窈啽恚╬rofile),它是將某一個特殊行業(yè)或領(lǐng)域內(nèi)的設(shè)備的特性提取出來,形成對特定領(lǐng)域特性的總結(jié),是作為配置的一個補充?!褚恍┛蛇x包,主要包括設(shè)備廠商提供的OEM的API類庫。其中前三項組成了J2ME的基本運行環(huán)境。其中Java虛擬機是運行環(huán)境的核心,其運行于設(shè)備中的操作系統(tǒng)之上,再往上是具體的J2ME配置,包括更具設(shè)備的資源需要而提供的基本核心API類庫,配置的上面是一個或者多個針對不同應(yīng)用領(lǐng)域而設(shè)置簡表。JVM(虛擬機)JVM是專門為微型電子設(shè)備與資源受限設(shè)備如:手機、尋呼機、移動互聯(lián)網(wǎng)設(shè)備、家用微電子設(shè)備等設(shè)計的一種輕便、緊湊的JAVA虛擬機。JVM可以為微型電子設(shè)備提供一個完整的JAVA運行環(huán)境,除了一些微型設(shè)備所必需的適當(dāng)?shù)墓δ苡兴煌猓怯蒍AVA虛擬機規(guī)范定義的真實的JAVA虛擬機。它是專門為那些受資源限制,只有幾百K字節(jié)內(nèi)存的微型設(shè)備設(shè)計的?;谏鲜鲈?,JVM具有以下幾個特點:(1)小,僅具有40KB至80KB的靜態(tài)內(nèi)存;(2)輕便、精巧;(3)模塊化并可定制;(4)盡可能完全緊湊的完成設(shè)計目的。2.2.2J2ME配置配置是將基本運行的環(huán)境定義為一套核心類和一個運行在特定類型設(shè)備上的特定的虛擬機。J2ME中提供了兩種配置:CLDC和CDC。CDC針對的設(shè)備主要是數(shù)字電視、機頂盒、網(wǎng)絡(luò)電話、車載計算設(shè)備,特點是有線連接,穩(wěn)定而持續(xù)的電源供應(yīng),設(shè)備資源比較受限。CLDC支持的設(shè)備主要包括無線電話、手機、PDA以及小型零售支付段等。處理能力較弱,只包含程序運行所需要的最小類庫。J2ME簡表簡表是面向配置之上縱向設(shè)備,建立在配置的頂部,定義了配置之上受支持設(shè)備的類型。目前J2ME領(lǐng)域里使用最廣泛的是移動信息設(shè)備簡表(MIDP),主要針對手機和其他雙向移動通信設(shè)備而設(shè)計的。MIDPlet的開發(fā)環(huán)境需要有java2SDK1.3版以上與MIDP的類庫、以及后述的運行前驗證工具三種。在J2MEWTK中除了包括MIDP的類庫、運行前驗證工具之外,還會把編譯與包裝(JAR文件化)、JAD文件的創(chuàng)建、模擬器的啟動等在開發(fā)MIDP需要用到的操作加以集成。當(dāng)完成了JDK1.4以及J2MEWTK的安裝以后,就可以開始對游戲項目進(jìn)行創(chuàng)建了。MIDlet開發(fā)的基本開發(fā)流程如下:(1)編寫MIDlet程序源代碼;(2)編譯MIDlet程序;(3)對編寫后的類文件進(jìn)行預(yù)校驗;(4)編寫清單文件MANIFEST.MF;(5)對MIDlet程序進(jìn)行打包;(6)編寫Java應(yīng)用程序描述符(jad)文件。MIDlet文件的構(gòu)成:(1)JAR(JavaARchive)文件:集成了ClassFile與圖像、聲音等內(nèi)容的數(shù)據(jù)文件,雖然與J2SE的文件相同,但是列表的文件內(nèi)容不同;(2)JAD(JavaApplicationDescriptor)文件:指定啟動的MIDlet類名稱或是數(shù)據(jù)文件大小、版本等信息;(3)KDDI的地方,使用組合了JAR文件與JAD文件的KDDI專用的KJK(KDDIJavaeXtension)。生命周期是指程序從開始執(zhí)行到退出的生命過程。MIDlet是以下列的生命周期來運行的:(1)系統(tǒng)調(diào)用繼承自MIDlet類的默認(rèn)構(gòu)造方法,創(chuàng)建對象;(2)系統(tǒng)進(jìn)入MIDlet生命周期的暫停狀態(tài),這個是MIDlet生命周期的第一個狀態(tài);(3)系統(tǒng)調(diào)用startAPP()方法,然后進(jìn)入MIDlet的運行狀態(tài),程序正常執(zhí)行;(4)如果在暫停轉(zhuǎn)臺或者運行狀態(tài)下發(fā)生錯誤,則程序會調(diào)用destoryAPP()方法,然后進(jìn)入銷毀狀態(tài)。整個過程如圖2-1所示:圖2-22.3移動設(shè)備上游戲的限制在開發(fā)J2ME移動游戲過程中,開發(fā)人員面對的最大的困難和障礙是,本來在PC機和控制臺上習(xí)以為常的應(yīng)用在移動設(shè)備上卻遇到各種限制,包括內(nèi)存的、屏幕尺寸的、甚至色彩的限制。由于游戲中的用戶輸入、圖形圖像、動畫、聲音和振動的高交互性,這種限制在移動游戲中表現(xiàn)得比移動應(yīng)用程序更加明顯。此外,不僅要注意不同制造商之間產(chǎn)品的不同,也要了解同一個制造商的不同移動設(shè)備模型的差別。不同手機的模式在內(nèi)存、色彩、屏幕尺寸和用戶界面等各個方面都有很多不同。內(nèi)存一般情況下,內(nèi)存被認(rèn)為是內(nèi)存區(qū)域中的堆棧,在游戲執(zhí)行的時候儲存信息,在游戲終止后被釋放。顯而易見,手機上可以使用的內(nèi)存總量要比PC機上少的多,因此在開發(fā)游戲的時候,要先查看所針對機型的內(nèi)存容量,注意自己程序內(nèi)存使用情況,已防止需要的內(nèi)存空間超過可以分配的大小。另外的存儲空間包括RMS(RecordManagementSystem)。它可以用來存儲玩家的最高分?jǐn)?shù)或者上次保存的設(shè)置。可供使用的RMS大小也是要注意的。PC機上的硬盤和內(nèi)存在使用一段時間后就會出現(xiàn)碎片,在手機的存儲空間上也會出現(xiàn)這種情況。例如需要寫一個大的對象到內(nèi)存中,但是卻找不到足夠的一整塊連續(xù)的空間,于是系統(tǒng)就將它分成幾塊分別存儲在內(nèi)存的各個空閑空間中。這不但會導(dǎo)致存儲空間訪問時間的增加,當(dāng)內(nèi)存中大的對象被清除后會留下很多內(nèi)存空洞,從而導(dǎo)致新的對象被存儲時也會遍布內(nèi)存各處。手機的界面最近幾年,各個手機制造商開始放棄傳統(tǒng)的手機界面,進(jìn)而追求更為個性化的按鍵和控制,這歸結(jié)于制造商對更加友好的用戶界面的孜孜不倦的追求。雖然一些制造商已經(jīng)意識到?jīng)]有絕對最好的用戶界面,只有對某些有特殊需求的特定的群體比較好的用戶界面,這主要取決于用戶除了使用手機打電話外還做什么,比如聽音樂、玩游戲、或這記錄商業(yè)事件。當(dāng)然,新界面的設(shè)計也擴展了手機市場的邊界和吸引力。這意味著又增加了開發(fā)者需要考慮的一個因素,比如,把數(shù)字鍵“5”設(shè)定為攻擊,但是也許在某些手機上這個鍵不是很方便就可以按到的。缺少庫文件支持由于J2ME是J2SE的子集,所以它并沒有包含所有的包和類。也就是說要么不使用這些類,要么自己擴展所需要的類。例如,J2ME中不支持浮點數(shù)(float),故不能進(jìn)行小數(shù)運算,也不能使用sin、cos和tan運算,但是在游戲開發(fā)中,小數(shù)是經(jīng)常要用到的。然而,可以用定點數(shù)學(xué)運算的方式來代替小數(shù)運算。比方說,如果想精確到小數(shù)點后三位,可以用1000來表示1.000。在變換的過程中要不斷的乘以或者除以10,以得到正確的結(jié)果。至于角度可以用0、30、60、90、120、150、180、210、240、270、300、330、360這種對應(yīng)角度值的整數(shù)值來代替,事實上由于移動設(shè)備的屏幕往往都很小,所以太精確的計算也是沒有意義的。3.開發(fā)環(huán)境及相關(guān)技術(shù)3.1游戲開發(fā)環(huán)境操作系統(tǒng):MicrosoftWindowsXP程序語言:Java2開發(fā)包:Java(TM)2StandardEdition(5.0)SunMicro.J2MEWirelessToolKit2.23.2關(guān)于WirelessToolKitWTK(WirelessToolKit)是Sun公司針對J2ME推出的用于手機和Palm等移動設(shè)備的開發(fā)包,是除手機廠商的專用開發(fā)包外唯一的手機模擬器開發(fā)包。它通用性高,開發(fā)出的應(yīng)用程序可保證能運行在大部分設(shè)備上,而不像專用廠商具有一定的不兼容性。雖然它沒有強大的功能和完善的調(diào)試手段,但它提供運行模擬器的最基本組件,是其他IDE需集成采用的必備元素。目前我們可以獲取的有四個版本,分別是1.0.4,2.0,2.1和2.2。每個版本都包括英語,日語,簡體中文,繁體中文4個語種包。(1)1.0.4版只能夠開發(fā)MIDP1.0(2)2.0版只能夠開發(fā)MIDP2.0應(yīng)用程序;(3)2.1版則可以同時開發(fā)MIDP1.0、JTWI(CLDC1.0,MIDP2.0,WMA1.1)可改用CLDC1.1或加入MMAPI1.1,自定義(自己隨機組合Configuration,Profile以及OptionalPackage)三種環(huán)境下的應(yīng)用程序;(4)2.2版中,WTK全面的支持JTWI規(guī)范。具體的說,即MIDP2.0,CLDC1.1,WMA2.0,MMAPI1.1,WebServices(JSR172),FileandPIMAPIs(JSR75),BluetoothandOBEXAPIs(JSR82),and3DGraphics(JSR184);同時您也可以使用該版本開發(fā)面向CLDC1.0和MIDP1.0的應(yīng)用程序。系統(tǒng)要求上,WTK2.2至少需要50MB可用硬盤,128MB系統(tǒng)RAM和800MHZPentiumIIICPU。4.《勇闖伏魔洞》RPG游戲設(shè)計4.1游戲簡介這是一款益智游戲與RPG角色扮演類的結(jié)合,主要還是以RPG類型為主,利用益智游戲的休閑可玩性和RPG角色扮演的故事擴展性相結(jié)合,把益智游戲的玩點和RPG的耐玩結(jié)合到一起,給玩家一個全新的感受。游戲的主要情節(jié)是游戲中的主角不經(jīng)意間通過一款網(wǎng)絡(luò)游戲穿越來到了西元一九五年的西涼召德村中,無意間卷入了一場鬼魅的陰謀之中,從此背負(fù)了一個巨大的使命——拯救所有被鬼魅抓走的人。游戲通過做指定的幾個任務(wù),完成任務(wù)通過游戲。游戲采用“踩地雷”遇敵方式,同時進(jìn)入戰(zhàn)斗場面,進(jìn)行游戲。游戲中玩家需要和各個NPC對話找到相應(yīng)的任務(wù)線索完成任務(wù),其中共有十一個NPC,主角根據(jù)NPC的對話找出線索完成任務(wù),其中與三個NPC對話會進(jìn)入相應(yīng)的任務(wù)場景,需要玩家自己和NPC對話找到。這樣設(shè)計是為了增加游戲的可玩性和故事性。為了增加游戲的難度我們特意設(shè)計了人工智能這個功能,在游戲戰(zhàn)斗的界面中加入了npc的行為判定,主動攻擊型,玩家進(jìn)入任務(wù)場景時敵人進(jìn)行追擊和攻擊。判斷檢測范圍,當(dāng)主角與敵人的距離小于64像素是敵人對主角進(jìn)行追擊,當(dāng)主角與敵人的距離小于16像素是敵人對主角進(jìn)行攻擊。這樣也增加了不同關(guān)卡游戲的難度性和可玩性。4.2游戲的流程和類結(jié)構(gòu)4.2.1游戲的基本運行流程本游戲的基本運行流程是在MIDlet啟動后把整個畫布作為一個線程,隨時準(zhǔn)備響應(yīng)用戶按鍵操作的KeyPressed()方法。在主角進(jìn)入到主場景時開啟與主場景NPC的對話方式,執(zhí)行主角行走移動方法。通過與NPC對話方式進(jìn)入任務(wù)場景1,當(dāng)主角擊敗人物場景1所有怪物時,開啟任務(wù)場景1NPC對話方式進(jìn)入任務(wù)場景2,失敗則游戲結(jié)束。當(dāng)主角進(jìn)入任務(wù)場景2時,擊敗所有敵人則通過任務(wù)場景2的NPC對話系統(tǒng)回到主場景。主角回到主場景后可加血后通過NPC進(jìn)入任務(wù)場景3.當(dāng)主角進(jìn)入任務(wù)場景3時,擊敗所有怪物則游戲勝利,反之游戲結(jié)束。4.2.2游戲的類結(jié)構(gòu)MyMIDlet:游戲的主入口,開始游戲Game_Canvas:游戲類,用于游戲運行的類,實現(xiàn)游戲中的顯示Player:主角類Enemy:敵人類MyMap:地圖類Dialog:對話類Music:音樂類,實現(xiàn)游戲所有音樂,包括初始化和播放。MyMIDMyMIDletMyCanvasGame_CanvasEenmyPlayerMusicDialogMyMap4.3圖像和動畫渲染MIDP2.0相對于1.0來說,最大的變化就是新添加了用于支持游戲的API,它們被放在javax.microedition.lcdui.game包中。游戲API包提供了一系列針對無線設(shè)備的游戲開發(fā)類。由于無線設(shè)備僅有有限的計算能力,因此許多API的目的在于提高Java游戲的性能,并且把原來很多需要手動編寫的代碼如屏幕雙緩沖、圖像剪裁等都交給API間接調(diào)用本地代碼來實現(xiàn)。各廠家有相當(dāng)大的自由來優(yōu)化它們。游戲API使用了MIDP的低級圖形類接口(Graphics,Image,等等)。整個game包僅有5個Class。GameCanvas這個類是LCDUI的Canvas類的子類,為游戲提供了基本的“屏幕”功能。除了從Canvas繼承下來的方法外,這個類還提供了游戲?qū)S玫墓δ?,如查詢?dāng)前游戲鍵狀態(tài)的能力,同步圖像輸出;這些功能簡化了游戲開發(fā)并提高了性能。GameCanvas類提供了基本的游戲用戶接口。除了從Canvas繼承下來的特性(命令,輸入事件等)以外,它還提供了專門針對游戲的功能,比如后備屏幕緩沖和鍵盤狀態(tài)查詢的能力。每個GameCanvas實例都會有一個為之創(chuàng)建的專用的緩沖區(qū)。因為每個GameCanvas實例都會有一個唯一的緩沖區(qū)??梢詮腉ameCanvas實例獲得其對應(yīng)的Graphics對象,而且,只有對Graphics對象操作,才會修改緩沖區(qū)的內(nèi)容。外部資源如其他的MIDlet或者系統(tǒng)級的通知都不會導(dǎo)致緩沖區(qū)內(nèi)容被修改。LayerLayer類代表游戲中的一個可視化元素,例如Sprite或TiledLayer是它的子類;這個抽象類搭好了層(Layer)的基本框架并提供了一些基本的屬性,如位置,大小,可視與否。出于優(yōu)化的考慮,不允許直接產(chǎn)生Layer的子類(不能包外繼承)。LayerManager對于有著許多Layer的游戲而言,LayerManager通過實現(xiàn)分層次的自動渲染,從而簡化了游戲開發(fā)。它允許開發(fā)者設(shè)置一個可視窗口(ViewWindow),表示用戶在游戲中可見的窗口;LayerManager自動渲染游戲中的Layer,從而實現(xiàn)期望的視圖效果。LayerManager管理一系列的Layer。LayerManager簡化了這染每個Layer的過程,每個添加的Layer都將在正確的區(qū)域并以正確的順序被渲染。LayerManager維護一個順序列表,以便管理如何追加、插入和刪除Layer。一個Layer的索引號關(guān)聯(lián)了它的Z軸位置(z-order);索引號為0的Layer最接近用戶,索引號越大的Layer離用戶越遠(yuǎn)。索引號永遠(yuǎn)是連續(xù)的,即,如果一個Layer被刪除,后面的Layer的索引號都將調(diào)整使得索引號保持連續(xù)。SpriteSprite又稱“精靈”,也是一種Layer,可以顯示一幀或多幀的連續(xù)圖像。但所有的幀都是相同大小的,并且由一個Image對象提供。Sprite通過循環(huán)顯示每—頓,可以實現(xiàn)任意順序的動畫;Sprite類還提供了許多變換(翻轉(zhuǎn)和旋轉(zhuǎn))模式和碰撞檢測方法,能大大簡化游戲邏輯的實現(xiàn)。Sprite是一個基本的可視元素,可以用存儲在圖像中的一幀或多幀來渲染它;輪流顯示不同的幀可以令Sprite實現(xiàn)動畫。翻轉(zhuǎn)和旋轉(zhuǎn)等幾種變換方式也能應(yīng)用于Sprite使之外觀改變。作為Layer子類,Sprite的位置可以改變,并且還能設(shè)置其可視與否。TiledLayerTiledLayer又稱“磚塊”,這個類允許開發(fā)者在不必使用非常大的Image對象的情況下創(chuàng)建一個大的圖像內(nèi)容。TiledLayer有許多單元格構(gòu)成,每個單元格能顯示由一個單一Image對象提供的一組貼圖中的某一個貼圖。單元格也能被動畫貼圖填充,動畫貼圖的內(nèi)容能非常迅速地變化;這個功能對于動畫顯示非常大的一組單元格非常有用,例如一個充滿水的動態(tài)區(qū)域。TiledLayer由一系列單元格組成,單元格可被一組貼圖填充。這個類允許不必使用特別大的圖像來創(chuàng)建大的虛擬層。這個技術(shù)在2D游戲中被廣泛用于創(chuàng)建特別大的可卷動的背景。在游戲中,某些方法如果改變了Layer,LayerManager,Sprite和TiledLayer對象的狀態(tài),通常并不能立刻顯示出視覺變化。因為這些狀態(tài)僅僅存儲在對象里,只有當(dāng)隨后調(diào)用我們自己的paimo方法時才會更新顯示。這種模式非常適合游戲程序,因為在一個游戲循環(huán)中,一些對象的狀態(tài)會更新,在每個循環(huán)的最后,整個屏幕才會被重繪?;谳喸円彩乾F(xiàn)在視頻游戲的基本結(jié)構(gòu)。由上面的這5個類就能夠?qū)崿F(xiàn)基本的圖像和動畫的顯示功能。由Sprite類來創(chuàng)建動畫元素,它可以顯示PNG格式文件的某一部分,作為動畫的某一幀。可以方便的對它進(jìn)行幀的切換,屏幕上位置的變化。以此來顯示游戲中人物、怪物等可移動的部分。用TiledLayer來創(chuàng)建游戲的背景。它能夠?qū)⑵聊环指畛傻却蟮娜舾刹糠?,每一部分都可以用PNG文件的一部分來填充。這就可以方便的畫出游戲需要的背景圖片。還可以根據(jù)某一塊部分時候填充了圖片,來和Sprite類進(jìn)行碰撞檢測。Sprite類和TiledLayer類都是Layer類的子類,而LayerManager可以管理這些Layer。它能夠添加和移除一個Layer,也可以對這些Layer進(jìn)行排序,從而在重畫的時候達(dá)到需要的疊加效果。這樣,對于一些小游戲來說,完全可以滿足要求,并且能夠提供相當(dāng)強的兼容性和可移植性。4.4游戲畫布類Game_Canvas的實現(xiàn)4.4.1Game_Canvas繼承GameCanvas類,用來實現(xiàn)整個游戲的主界面⑴顯示主場景的方法publicvoidpaint(Graphicsg){ }⑵圖層管理器publicvoidLayer_Manager(){ }⑶主場景掃描publicvoidsetViewWindow(){ }⑷主角移動publicvoidPlayer_Move(){ }⑸定義各場景碰撞層publicvoidcollides(){ }⑹主角碰撞后的移動publicvoidpz_move(){ }⑺主角與NPC的碰撞publicvoidcollides_npc(){ }⑻加載任務(wù)場景各圖層publicvoidLayer_renwu(){ }⑼繪制血量框publicvoiddraw_hp(){ }⑽怪物的碰撞檢測publicvoidguai_pz(){ }⑾主角攻擊怪物publicvoidpengzhuang_guai(){ }⑿顯示怪物publicvoidhuaguai(){ }⒀按鍵響應(yīng)publicvoidkeyPressed(intkey){ }4.4.2此游戲畫布類中主要的實現(xiàn)地圖的鋪設(shè)主場景和任務(wù)場景包括以下這些圖層:背景層(地表層)TiledLayertl_bj=null;碰撞層(建筑層)TiledLayertl_pz=null;NPC(N層)、主角層publicstaticint[]NPC1={0};主場景和任務(wù)場景地圖數(shù)組文件的制作:新建類MyMap,繼承自CameCanvaspublicclassMyMapextendsGameCanvas{ }定義主場景背景層和碰撞層數(shù)組publicstaticintmap_bj[][]={}publicstaticintmap_pz[][]={}顯示主場景:定義控制各場景是否可見的狀態(tài)變量booleanview_main=false; booleanview_renwu1=false; booleanview_renwu2=false; booleanview_renwu3=false;定義初始化主場景和任務(wù)場景的方法publicvoidinit_zhuchangjing(){ try{ map=Image.createImage("/dituw.png"); }catch(IOExceptione){ e.printStackTrace(); } tl_bj=newTiledLayer(53,20,map,16,16); tl_pz=newTiledLayer(53,20,map,16,16); for(inti=0;i<20;i++){ for(intj=0;j<53;j++){ if(map_bj[i][j]!=0){ tl_bj.setCell(j,i,map_bj[i][j]); } if(map_pz[i][j]!=0){ tl_pz.setCell(j,i,map_pz[i][j]);}}}}publicvoidinit_renwu(){ try{ map1=Image.createImage("/renwu1.png"); map2=Image.createImage("/renwu2.png"); map3=Image.createImage("/renwu3.png"); }catch(IOExceptione){ e.printStackTrace(); } if(view_renwu1){ tl1_bj=newTiledLayer(25,20,map1,16,16); tl1_pz=newTiledLayer(25,20,map1,16,16); for(inti=0;i<20;i++){ for(intj=0;j<25;j++){ if(renwu1_bj[i][j]!=0){ tl1_bj.setCell(j,i,renwu1_bj[i][j]); } if(renwu1_pz[i][j]!=0){ tl1_pz.setCell(j,i,renwu1_pz[i][j]); } } } tl1_bj.setPosition(53*16,0); tl1_pz.setPosition(53*16,0); } if(view_renwu2){ tl2_bj=newTiledLayer(25,20,map2,16,16); tl2_pz=newTiledLayer(25,20,map2,16,16); for(inti=0;i<20;i++){ for(intj=0;j<25;j++){ if(renwu2_bj[i][j]!=0){ tl2_bj.setCell(j,i,renwu2_bj[i][j]); } if(renwu2_pz[i][j]!=0){ tl2_pz.setCell(j,i,renwu2_pz[i][j]); } } } tl2_bj.setPosition(78*16,0); tl2_pz.setPosition(78*16,0); } if(view_renwu3){ tl3_bj=newTiledLayer(30,20,map3,16,16); tl3_pz=newTiledLayer(30,20,map3,16,16); for(inti=0;i<20;i++){ for(intj=0;j<30;j++){ if(renwu3_bj[i][j]!=0){ tl3_bj.setCell(j,i,renwu3_bj[i][j]); } if(renwu3_pz[i][j]!=0){ tl3_pz.setCell(j,i,renwu3_pz[i][j]); } } } tl3_bj.setPosition(103*16,0); tl3_pz.setPosition(103*16,0); } }④定義地圖資源圖片:map=Image.createImage("/dituw.png");map1=Image.createImage("/renwu1.png"); map2=Image.createImage("/renwu2.png"); map3=Image.createImage("/renwu3.png");實例化背景層和碰撞層(屏幕分割20*53,圖片切割16*16)tl_bj=newTiledLayer(53,20,map,16,16); tl_pz=newTiledLayer(53,20,map,16,16);填充背景層和碰撞層(填充圖層)for(inti=0;i<20;i++){ for(intj=0;j<53;j++){ if(map_bj[i][j]!=0){ tl_bj.setCell(j,i,map_bj[i][j]); } if(map_pz[i][j]!=0){ tl_pz.setCell(j,i,map_pz[i][j]); } } }將主場景加入圖層管理器:通過圖層管理器的方法setViewWindow()來設(shè)置可視窗口實例化地圖對象和圖層管理器MyMapmymap=newMyMap();LayerManagerlm=newLayerManager();各個圖層的切換是通過圖層管理器的remove()和append()方法來實現(xiàn)的將主場景的背景層和碰撞層加入圖層管理器lm.append(mymap.tl_pz);lm.append(mymap.tl_bj);與NPC的對話定義碰撞NPC的方法publicvoidpz_move(){ switch(orietation){ caseO_UP: player.spPlayer.move(0,6); break; caseO_DOWN: player.spPlayer.move(0,-6); break; caseO_LEFT: player.spPlayer.move(6,0); break; caseO_RIGHT: player.spPlayer.move(-6,0); break; } }確定要和哪些NPC對話,對話內(nèi)容publicstaticStringdlg[]=newString[]{ "主角:你好,這里是哪里???", "小兔:你好,歡迎來到西涼召德村,我是小兔。", "主角:我叫袁熙,我怎么在這里,太奇怪了,我好餓啊,請問哪里有吃的東西?", "小兔:前方有一家客棧,你可以在那里休息。", "主角:謝謝啊。", "主角:老板,你這里有什么吃的啊,我好餓?。。。?, "老板:孩子,這里只有牛肉面了,別的都剛剛賣完。", "主角:好吧,來3碗。", "老板:孩子,看你這么能吃,想必武功也很好吧?", "主角:還行吧,我練過點功夫。", "老板:太好了,最近村長遇到點麻煩,你去幫幫他吧。", "主角:好啊,吃飽了也該練練功夫了。", "主角:村長,我叫袁熙,我聽說您遇上了麻煩,我看看您怎么了?", "村長:哎,最近后山出現(xiàn)了很多妖怪,我們的村民都不敢去后山砍柴、采藥了,這可怎么辦??!", "主角:哦,我去后山看看吧。希望能幫助你們。", "村長:孩子,太謝謝你了。你和邊上的黑衣人說話,他會放你去后山的。", "主角:你好,我去后山幫村長殺妖怪,你讓我過去吧。", "黑衣人:好吧,后山山路崎嶇,你可要小心啊。", "主角:沒問題,呵呵。", "小姑娘:救命?。【让。。?!", "主角:小姑娘,你來這荒郊野嶺的地方干嘛,有什么能幫助你的嗎?", "小姑娘:我爸爸是村里的鐵匠,我來這里幫我爸爸找玄鐵,沒想到遇到了一群強盜把我找的玄鐵都搶走了,我們家就靠這點微薄的收入支撐生活了!你能幫幫我嗎?", "主角:好的,沒問題,你看到那些強盜從哪里逃走了嗎?","小姑娘:他們剛從這里的山洞逃走了,你快點去追吧!", "主角:好的,你先回到村里安全的地方吧,我一定幫你找回玄鐵的!", "主角:請問你是西涼召德村的李鐵匠嗎?","鐵匠:是。", "主角:這個給你,你的女兒讓我?guī)湍銖膹姳I那搶回玄鐵,她現(xiàn)在已經(jīng)回家了,你也快回家吧這里太不安全了!", "鐵匠:太感謝你了,你真是個好人啊!", "主角:呵呵,別這么說這都是我應(yīng)該做的!", "鐵匠:你回村找那個神秘人吧,他會在洞口等你的!", "神秘人:年輕人,你怎么受了這么重的傷啊,前面有個醫(yī)生你可以找她去看看!", "主角:謝謝了!", "主角:我受傷了你這有什么藥能給我治一治嗎?", "醫(yī)生:看你臉色這么蒼白一定是失血過多,趕快把這顆藥丸吃了吧!", "主角:謝謝!", "醫(yī)生:不客氣,東面武官門口有個村民好像很著急的在等人,不會是等你呢吧!", "主角:那我去看看!", "村民:鐵匠和他的女兒都安全的回家了,但是還有很多村民被鬼魅抓到了小島上,希望你能救救他們!", "主角:怎么才能去那個小島呢?", "村民:你就沿著這條小路走南拐就能看到有個碼頭了,你可以坐船去那個小島上。", "主角:好的,我一定會救出他們的!", "村民:謝謝你了,年輕人!", "主角:你能帶我去這附近的小島上嗎?", "船夫:那里很危險的,據(jù)說還著這一個很兇猛的怪物,你一定要去那里嗎?", "主角:我要去那里救人,很多村民都被那個怪物抓走了,我不能看他們就這樣被吃掉!", "船夫:那好吧,小伙子看你這么善良我就破例帶你去吧!",};一一檢測碰撞,通過布爾值區(qū)別碰到哪個NPC了游戲中一共十一個NPC,主角通過collidesWith()方法判斷是否與NPC碰撞,如碰撞上第一個NPC則開啟第一個NPC的對話功能。對話順序如下:knpc8,knpc4,knpc6,knpc5,knpc2,knpc11,knpc7,knpc9,Knpc1,knpc3。設(shè)置主角的碰撞區(qū)域player.spPlayer.defineCollisionRectangle(18,50,28,10);檢測碰撞并通過drawString()方法顯示對話內(nèi)容if(player.spPlayer.collidesWith(player.npc8,true)){ lm.insert(player.spPlayer,0); if(knpc8){ g.drawImage(duihuakuang,0,240,0); Dialog.DrawString(Dialog.dlg[count],font,230,g,7,246); if(this.getKeyStates()==GameCanvas.FIRE_PRESSED){ count++; if(count>=5){ knpc8=false; knpc4=true; } } }}敵人的人工智能判斷檢測范圍,檢測范圍內(nèi)敵人向主角移動if(this.getX()>(hero_x-64)&&this.getX()<(hero_x+64) &&this.getY()>(hero_y-64)&&this.getY()<(hero_y+64)){//在檢測范圍內(nèi) if(this.getX()<hero_x&&this.getY()<hero_y){//如果在左上角 //向右移 orietation=O_RIGHT; this.move(this.speed,0); this.Enemy_zhen(moveright); } if(this.getX()>hero_x&&this.getY()<hero_y){//如果在右上角 //向下移動 orietation=O_DOWN; this.move(0,this.speed); this.Enemy_zhen(mo
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 南京技術(shù)合同范本
- 信息服務(wù) 招標(biāo)合同范本
- 2025年遼寧省建筑安全員-C證(專職安全員)考試題庫
- 債務(wù)合同范本 法院
- 債務(wù)加入合同范本
- 小學(xué)音樂綜合性課堂的構(gòu)建方法
- 2025上海市安全員-C證考試(專職安全員)題庫附答案
- 勞務(wù)合同范本文檔
- 腸道菌群檢測的學(xué)習(xí)路徑預(yù)測?
- 勞務(wù)合同范本 英語
- 部編人教版四年級下冊道德與法治 第6課 有多少浪費本可避免 教學(xué)課件PPT
- 旅行社運營實務(wù)電子課件 5.2 旅行社內(nèi)部電子商務(wù)
- 精神衛(wèi)生醫(yī)聯(lián)體服務(wù)平臺
- 重慶市渝北區(qū)大灣鎮(zhèn)招錄村綜合服務(wù)專干模擬檢測試卷【共500題含答案解析】
- GB/T 5915-1993仔豬、生長肥育豬配合飼料
- GB/T 19518.2-2017爆炸性環(huán)境電阻式伴熱器第2部分:設(shè)計、安裝和維護指南
- 上海??茖哟巫灾髡猩荚嚵?xí)題集②(含答案)
- 壓花藝術(shù)課件
- 某市政道路施工交通疏導(dǎo)方案
- 世界主要國際組織課件
- 語言學(xué)綱要(新)課件
評論
0/150
提交評論