基于j2me技術的手機游戲開發-瘋狂賽車_第1頁
基于j2me技術的手機游戲開發-瘋狂賽車_第2頁
基于j2me技術的手機游戲開發-瘋狂賽車_第3頁
基于j2me技術的手機游戲開發-瘋狂賽車_第4頁
基于j2me技術的手機游戲開發-瘋狂賽車_第5頁
已閱讀5頁,還剩75頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

南京工程學院畢業設計說明書(論文)專業:電子信息科學與技術題目:基于J2ME技術的手機游戲開發――瘋狂賽車

畢業設計(論文)原創性聲明和使用授權說明原創性聲明本人鄭重承諾:所呈交的畢業設計(論文),是我個人在指導教師的指導下進行的研究工作及取得的成果。盡我所知,除文中特別加以標注和致謝的地方外,不包含其他人或組織已經發表或公布過的研究成果,也不包含我為獲得及其它教育機構的學位或學歷而使用過的材料。對本研究提供過幫助和做出過貢獻的個人或集體,均已在文中作了明確的說明并表示了謝意。作者簽名:日期:指導教師簽名:日期:使用授權說明本人完全了解大學關于收集、保存、使用畢業設計(論文)的規定,即:按照學校要求提交畢業設計(論文)的印刷本和電子版本;學校有權保存畢業設計(論文)的印刷本和電子版,并提供目錄檢索與閱覽服務;學校可以采用影印、縮印、數字化或其它復制手段保存論文;在不以贏利為目的前提下,學校可以公布論文的部分或全部內容。作者簽名:日期:

學位論文原創性聲明本人鄭重聲明:所呈交的論文是本人在導師的指導下獨立進行研究所取得的研究成果。除了文中特別加以標注引用的內容外,本論文不包含任何其他個人或集體已經發表或撰寫的成果作品。對本文的研究做出重要貢獻的個人和集體,均已在文中以明確方式標明。本人完全意識到本聲明的法律后果由本人承擔。作者簽名: 日期:年月日學位論文版權使用授權書本學位論文作者完全了解學校有關保留、使用學位論文的規定,同意學校保留并向國家有關部門或機構送交論文的復印件和電子版,允許論文被查閱和借閱。本人授權大學可以將本學位論文的全部或部分內容編入有關數據庫進行檢索,可以采用影印、縮印或掃描等復制手段保存和匯編本學位論文。涉密論文按學校規定處理。作者簽名: 日期:年月日導師簽名:日期:年月日

指導教師評閱書指導教師評價:一、撰寫(設計)過程1、學生在論文(設計)過程中的治學態度、工作精神□優□良□中□及格□不及格2、學生掌握專業知識、技能的扎實程度□優□良□中□及格□不及格3、學生綜合運用所學知識和專業技能分析和解決問題的能力□優□良□中□及格□不及格4、研究方法的科學性;技術線路的可行性;設計方案的合理性□優□良□中□及格□不及格5、完成畢業論文(設計)期間的出勤情況□優□良□中□及格□不及格二、論文(設計)質量1、論文(設計)的整體結構是否符合撰寫規范?□優□良□中□及格□不及格2、是否完成指定的論文(設計)任務(包括裝訂及附件)?□優□良□中□及格□不及格三、論文(設計)水平1、論文(設計)的理論意義或對解決實際問題的指導意義□優□良□中□及格□不及格2、論文的觀念是否有新意?設計是否有創意?□優□良□中□及格□不及格3、論文(設計說明書)所體現的整體水平□優□良□中□及格□不及格建議成績:□優□良□中□及格□不及格(在所選等級前的□內畫“√”)指導教師:(簽名)單位:(蓋章)年月日評閱教師評閱書評閱教師評價:一、論文(設計)質量1、論文(設計)的整體結構是否符合撰寫規范?□優□良□中□及格□不及格2、是否完成指定的論文(設計)任務(包括裝訂及附件)?□優□良□中□及格□不及格二、論文(設計)水平1、論文(設計)的理論意義或對解決實際問題的指導意義□優□良□中□及格□不及格2、論文的觀念是否有新意?設計是否有創意?□優□良□中□及格□不及格3、論文(設計說明書)所體現的整體水平□優□良□中□及格□不及格建議成績:□優□良□中□及格□不及格(在所選等級前的□內畫“√”)評閱教師:(簽名)單位:(蓋章)年月日教研室(或答辯小組)及教學系意見教研室(或答辯小組)評價:一、答辯過程1、畢業論文(設計)的基本要點和見解的敘述情況□優□良□中□及格□不及格2、對答辯問題的反應、理解、表達情況□優□良□中□及格□不及格3、學生答辯過程中的精神狀態□優□良□中□及格□不及格二、論文(設計)質量1、論文(設計)的整體結構是否符合撰寫規范?□優□良□中□及格□不及格2、是否完成指定的論文(設計)任務(包括裝訂及附件)?□優□良□中□及格□不及格三、論文(設計)水平1、論文(設計)的理論意義或對解決實際問題的指導意義□優□良□中□及格□不及格2、論文的觀念是否有新意?設計是否有創意?□優□良□中□及格□不及格3、論文(設計說明書)所體現的整體水平□優□良□中□及格□不及格評定成績:□優□良□中□及格□不及格(在所選等級前的□內畫“√”)教研室主任(或答辯小組組長):(簽名)年月日教學系意見:系主任:(簽名)年月日PAGE畢業設計說明書(論文)中文摘要J2ME虛擬機在手機上的普及為手機游戲的發展提供了最適合的土壤。隨著MIDP2.0包的發布,使得手機游戲開發者可以更專注于游戲性的增強而不再是繁瑣的動畫處理與地圖設計,而開發過程變得更加方便迅捷。本文完整地描述了在Eclipse平臺應用J2ME技術,特別是MIDP2.0中新增加的GameAPI在手機上實現一個瘋狂賽車游戲。核心在于其游戲引擎的構建,其中涉及到的技術有Midlet框架、賽道產生算法、游戲狀態機和精靈等。關鍵字J2MEMIDP2.0GameAPIEclipse瘋狂賽車 畢業設計說明書(論文)外文摘要TitleDevelopmentofCellPhoneGameBasedOnJ2ME――CrazyRacingCarAbstractWidespreaduseofKVMonthecellphonepromotesthedevelopmentofcellphonegame.ThereleaseofMIDP2.0enablesgameproducertoconcentratemoreonimprovementofgameperformancethaneffortinanimationprocessingandmapdesign.Andthedevelopmentprogressbecomesrapiderandmoreconvenient.ThethesisintroducestheJ2MEtechnologyofbasedontheintegrateddevelopmentenvironmentofEclipse.Itismainlyabouttheimplementationofagame—CrazyRacingCar.Thecoreofthethesisfocusesonthegameengineconstruction.ThetechnologyconcernedincludestheMIDletclass,thread,spiritsetc.KeywordsJ2ME,MIDP2.0,GameAPI,Eclipse,CrazyRacingCar -PAGE68-目錄TOC\o"1-2"\h\z第一章緒論 11.1移動游戲的文化和業務 11.2移動平臺簡介 21.3關于本課題 4第二章開發環境與主要技術 52.1開發平臺 52.2主要技術 62.3術語及相關縮寫解釋 14第三章系統需求分析 153.1運行平臺 153.2界面要求 153.3速度要求 153.4游戲具體需求 15第四章系統設計與實現 184.1整體框架 184.2游戲的啟動管理 204.3游戲的主類的實現 234.4游戲閃屏的實現 274.5游戲菜單的實現 304.6游戲畫布的實現 334.7賽道產生算法 364.8鍵控處理算法 374.9碰撞檢測算法 394.10游戲角色的AI策略設計 414.11游戲引擎的實現 42第五章游戲測試 455.1打包 455.2下載測試 465.2BUG發現與測試總結 48第六章結束語 496.1畢業設計的難點與創新 496.2畢業設計的收獲 49致

謝 51參考文獻 52附錄:英文技術資料翻譯 53南京工程學院畢業設計說明書(論文)第一章緒論本章主要對發展中的移動游戲進行介紹,并對當前流行的移動平臺進行簡單的介紹。1.1移動游戲的文化和業務移動游戲的發展遠遠落后與相應的PC機上的游戲,主要的困難在于移動設備的處理能力。但是由于掌上電腦和手機的最新發展正在快速改變這種現象,它們具備真正的計算能力但卻小得可以放到隨身口袋中。當前的移動游戲已經形成自己獨有的文化和業務。1.1.1短消息已經從全球范圍內把我們聯系起來,它的直接性超出了我們的想象;同樣,手機游戲也搭建了一個舞臺對視頻游戲的全部概念進行轉換,其效果會令人震驚。這些話是不是有些過分夸張?我們來考慮一下這樣一種情形:你能夠和來自世界各地的人們一起參加一個大型的網絡化的多玩家游戲,你可能是在一次郊游的休息時來做這件事。這個情形說明了一個關鍵問題,手機游戲能夠通過一個移動介質,在任何時候把任何地點的人們連接起來讓他們一起娛樂。現在這已經不是一個不切實際的夢想,這種游戲隨著3G時代的到來已經悄然的在我們的身邊出現。現在全球范圍的多玩家網絡游戲的思想并非新東西,人們在他們的桌面電腦上干這種事情已經很多年了。但那需要網絡連接到其他的計算機,而這些計算機都很大無法自由移動。即使最輕巧的筆記本電腦也需要放置到平緩的表面上,還需要接入某種無線網絡。手機則能夠裝入的口袋中,并且默認地處于無線連接狀態。它們使得輕松地加入和退出多玩家網絡游戲成為可能。通過創建一個讓游戲玩家來去更加自由的環境,隨著游戲和相關技術的成熟,手機游戲的公共性方面可能成為最大的吸引力之一。手機痛信已經使得世界變得很小,而手機游戲則充當允許人們一起玩游戲而不關心其實際位置,從而使這種情況達到一種新的水平。手機游戲不但能夠克服地理位置的障礙,而且能夠突破語言和文化的障礙。人們不需要說相同的語言,也能夠一起玩貪吃蛇。人們會設計出更多更富創意的游戲,從而游戲玩家之間的文化差異變得最小化。1.1.2移動游戲縱觀IT產業的歷史,計算機游戲已經成為技術創新背后的動力之一。1998年諾基亞公司年發布了全球第一款手機游戲—“變色龍6110”,內置貪食蛇、記憶力和邏輯猜圖三款游戲,受到了全世界的歡迎,其他廠商紛紛跟進。計算機游戲者渴望更加強大的硬件計算能力;渴望不受不同的軟件的限制——無論是將圖形強制在人工智能(AI)上還是網絡安全性。游戲開發者和玩家常常是前沿計算機技術的最早的采用者。由于他們的創新天性,游戲不再是由大型采購公司控制的技術產品——游戲領域總是有充足的空間給那些在這方面有天分的單個創新者。手機已經與現代生活方式緊緊地結合在一起。他們是最普遍攜帶的個人用品中僅次于鑰匙和錢包的東西。傳統的臺式機游戲將目標鎖定在低級趣味的人和青少年身上,而手機游戲則每個人都可以訪問得到——隨時隨地。盡管每個手機游戲的價格都不貴,但是巨大的使用量(如:每人每星期一個新游戲)將使得這個市場商機無限。但是,對于開發者來說,將控制臺游戲遷移到手機游戲工程很大。因為他們所面向的對象、生活方式和分布式模型都有著極大的區別。1.2移動平臺簡介盡管手機游戲的格局的確會風云突變,但是占據主流的移動平臺,因而在某種程度上是相當穩定的。主流的移動平臺主要有:Java2MicroEdition(J2ME);BinaryRuntimeEnvironmentforWirless(BREW);Symbian;WindowsMobileSmartphone。所有這四種平臺都得到了當前手機的支持,并且它們都以免費文檔和工具的方式提供對開發者的支持。接下來將詳細地討論每個平臺,介紹它們之間的區別。1.J2ME是Sun微系統公司流行Java編程語言的緊湊版本。J2ME包括一組開發工具和豐富的應用程序接口(API)以供開發手機應用程序,人們稱為MIDlet。J2ME也包括K虛擬機,它負責協助Java字節碼在每個手機上的執行,依靠通用的字節碼而不是本地應用程序代碼,J2ME能夠開發的游戲程序的基本代碼,并且能夠移植到不同的手機而不需要太大力氣[01]。事實上,如果不需要改變屏幕尺寸和圖形顯示能力,在J2ME手機之間移植一個游戲所需的工作幾乎是零。下面章節將詳細介紹J2ME技術。1.J2ME得到廣泛支持,與此不同的是BREW則是一個專門以基于高通公司的CDMA(CodeDivisionMultipleAccess,碼分多址)技術的手機為目標的平臺。這并不是說BREW不能得到相對較多的手機的支持。BREW開發者通常使用C或C++結合BREWAPI來開發BREW設備所需要的手機游戲。BREW也支持其他的軟件開發技術,如XML甚至Java。和J2ME一樣,BREW能夠作為游戲和底層手機操作系統之間的一個中介。和J2ME不一樣的是BREW也支持本地代碼,這意味著游戲能夠專門針對某一個手機的處理器而編譯。本地代碼游戲通常比它們對應的解釋版本要快許多,但是在設備之間移植它們需要技巧。BREW已經流行開來并且在亞洲的部分國家有數量驚人的用戶群,包括在日本和韓國。在美國,Alltel和VersionWireless是支持BREW手機的領頭無線通信服務提供商。1.Symbian是和BREW采取完全不同的方式的一種手機操作系統。它是一種開放的操作系統,任何設備制造商都能夠獲得使用許可。Symbian是由Symbian有限公司開發,該公司是由包括Motorola、Nokia、Panasonic/Ericsson在內的手機制造商組成的聯合公司。Symbian當前得到眾多手機的廣泛支持,主要是因為它相對容易獲得許可[02]。為Symbian設備開發手機游戲會有很多選擇,因為Symbian支持C++、Java和VisualBasic等編程語言。當前的大多數商業Symbian游戲都是用C++開發并作為本地Symbian應用程序的,這使得它們和Java開發的游戲相比更快一些。事實上,Java已經使得Java程序和本地程序之間的性能差距漸漸縮小,但是一個純粹的本地應用程序往往總是比一個Java程序的效率更高。這一點對于游戲程序來說特別重要,它們對額外的處理能力的要求是很刻的。1.2.4WindowMicrosoft公司的WindowsMobile操作系統多部署在PocketPC這樣的手持計算機和Smartphone這樣的高級設備上,微軟公司已經從中看到了一些成功的跡象。盡管一些PocketPC有相當大的屏幕(240×320),大都通過手寫筆供用戶輸入。Microsoft公司是在等待時機直到手機技術能夠跟上它們,因為它們最近發布的Smartphone,這是WindowsMobile操作系統的手機版本。這個操作系統的有趣之處在于,它并非是PocketPC的縮微版本,它和前者的顯著不同是用戶界面根據手機的小屏幕和沒有手寫筆的特點而做出的變化。從手機游戲的開發者的角度來看,這就意味著可以使用在編寫PocketPC游戲時用到的工具和API。這通常意味著要使用C、C++或C#編程語言并結合使用WindowsMobileAPI。PocketPC游戲開發到現在已經發展了好幾年,因此,從某些方面講,Smartphone是一個顯著的飛躍,盡管對于市場來說它是比較新的力量。在美國,Motorola和Samsung都是Smartphone手機的制造商,并且它們目前都得到AT&TWireless和VerizonWireless的支持。1.3關于本課題本課題將在手機上實現一個單機版的賽車游戲,該游戲模擬PC機上的賽車游戲《速度與激情》,實現玩家與電腦的對戰。本游戲使用J2ME技術構建了一個基本的游戲引擎,并利用人工智能技術實現了電腦的智能策略。

第二章開發環境與主要技術本章主要對以Eclipse為核心的J2ME開發環境進行介紹,并對該課題開發過程中需要的J2ME技術、游戲人工智能技術和游戲基礎進行詳細介紹。2.1開發平臺本游戲的開發平臺為:操作系統:MicrosoftWindowsXP程序語言:Java開發包:Java(TM)2StandardEdition(5.1)模擬器:SunMicro.J2MEWirelessToolKit2. NokiaSeries405thEditionSDKIDE工具:Eclipse—SDK—3.3.1IDE插件:EclipseME1.7.5關于本游戲的開發環境安裝配置過程比較簡單,在此不再贅述。總體來說,JDK提供了虛擬機來運行應用程序,而WTK提供了模擬器,Eclipse及其它插件提供了個開發測試程序代碼的IDE集成開發環境2.Eclipse是一個開放源代碼的、基于Java的可擴展開發平臺。Eclipse相關的許可證是大多數基于CommonPublicLicense(CPL),CPL是一個為OpenSourceInitiative(OSI)所認可的許可證。由于EclipseFoundation的建立,Eclipse的許可證將逐漸趨向于使用EclipsePublicLicense(EPL),EPL是一個與CPL相類似的許可證,正在進行OSI的認證工作[03]。盡管Eclipse是使用Java語言開發的,但它的用途并不限于Java語言;例如,支持諸如C/C++、COBOL和Eiffel等編程語言的插件已經可用,或預計會推出。Eclipse框架還可用來作為與軟件開發無關的其他應用程序類型的基礎,比如內容管理系統。Eclipse是一個開放源代碼的、基于Java的可擴展開發平臺。就其本身而言,它只是一個框架和一組服務,用于通過插件組件構建開發環境。2.1.EclipseME作為Eclipse一個插件,致力于幫助開發者開發J2ME應用程序。EclipseME并不為開發者提供無線設備模擬器,而將各手機廠商的實用模擬器緊密連接到Eclipse開發環境中,為開發者提供一種無縫統一的集成開發環境。通過安裝它以使得我們可以在Eclipse下開發J2ME應用。我們可以像建立普通JavaProject一樣建立一個J2MEMidletSuite,并調用WTK下的模擬器來運行或者調試它。2.1.3WTK(WirelessToolKit)是Sun公司針對J2ME推出的用于手機和Palm等移動設備的開發包,是除手機廠商的專用開發包外唯一的手機模擬器開發包。它通用性高,開發出的應用程序可保證能運行在大部分設備上,而不像專用廠商具有一定的不兼容性。雖然它沒有強大的功能和完善的調試手段,但它提供運行模擬器的最基本組件,是其他IDE需集成采用的必備元素。2.1.手機中負責調配程序運行資源的管理后臺是JavaApplicationManager。它所使用的傳輸媒體可以是紅外線、網絡、以及其他可用來傳輸的媒體。JavaApplicationManager會從網絡上下載代表該ApplicationSuite的JAR檔,接著在手機上安裝此MIDletSuite,然后在手機開始執行該應用程序。2.2主要技術2.1999年6月,Sun正式向Java團體推出了J2me,并重新劃分了Java2的體系結構,目前主要包括面向桌面應用開發的Java2平臺標準版(Java2PlatformStandardEdition,J2SE)、面向企業應用開發的Java2平臺企業版(Java2PlatformEnterpriseEdition,J2EE)、面向消費產品和嵌入式設備應用開發的Java2平臺微型版(Java2PlatformMicroEdition,J2ME)和Java卡平臺。Java技術的體系結構如圖2-1所示。圖2-1Java技術的體系結構J2EE、J2SE和J2ME構成了Java的完整構架。至此,Java已經由單純的編程語言發展到一種平臺的高度。這三者的結合,可以將從服務器到臺式機到移動設備的應用開發集中到一種技術之下。J2ME平臺由多種配置(Configuration)、簡表(Profile)和可選包(OptionalPackage)組成。平臺的實現者和應用程序的開發者可以從中選擇并組合出一個完整的Java運行環境來滿足特定范圍內的設備需求。每種組合都應該使用這一系列設備的內存、處理器和I/O能力達到最優化。J2ME專家組之所以采取這種靈活的設計結構主要是為了滿足市場上不同種類的嵌入式設備的需求,這些設備在軟件和硬件特性上都存在巨大的差異,一種規范很難將它們統一起來。目前,J2ME平臺主要包括兩個配置:CLDC和CDC。CLDC是兩個配置中較小的一個,為具有間斷性聯網能力、較慢的處理器和有限內存的設備設計的。這些設備包括移動電話、雙工呼叫器和入門級的PDA,它們通常具有16位或32位的CPU、128KB~512KB可用于Java平臺實現和相關應用程序的內存。CDC是為處理器能力較強、內存空間更大、聯網能力更出色的設備設計的。這些設備包括電視機頂盒、車載娛樂系統和高端PDA等。CDC包括一個具有完備特性的Java虛擬機,比CLDC更大的J2SE平臺的子集。CDC的目標設備通常具有32位或者64位的處理器,2MB以上的可用于Java平臺實現和相關應用程序的內存。移動信息設備簡表(MIDP)是為移動電話和入門級PDA設計的。它為移動應用程序提供了所需的全部核心功能,包括應用程序模型、用戶界面、持久性數據儲存、聯網能力(在CLDC中定義,在MIDP中實現)及應用程序管理。目前應用非常廣泛的MIDlet就是在MIDP中定義的。CLDC與MIDP組成的完備Java運行環境提升了手持設備的能力,并且盡可能最小化了設備內存和電源的消耗。2.2MIDP規范是一套規則,它描述了在移動設備中進行Java編程的特性和局限性,其中主要是一套用于MIDlet編程的標準類和接口。MIDP規范詳細描述了可用于MIDlet開發的API,CLDC也提供了其他的API。MIDPAPI建立在CLDCAPI的基礎之上,以提供更加針對移動信息設備的類和接口。可以認為CLDC為聯網設備提供通用的JavaAPI,而MIDP則進一步提供了更加詳細的API,以填補CLDCAPI針對小型無線設備諸如手機和尋呼機所遺留的技術細節。2.2.2CLDCAPI中的大多數類直接引自標準的J2SEAPI。這些類和接口實際上等同于在傳統的Java編程中所熟悉的那些類和接口。這部分CLDCAPI位于與J2SE中名稱相似的包中,諸如Java.lang和Java.util。除了直接借用于J2SEAPI的類和接口外,CLDCAPI還有幾個特殊接口。這幾個主要針對網絡,盡管網絡是J2SEAPI的一部分,但對于手機這類特殊的網絡設備來說,這些接口更是不可缺少的。CLDC定義了一套接口,它們便于實現通用的網絡,而把實施這些接口的細節留給了MIDPAPI。因此CLDCAPI邏輯上分成兩部分:一系列作為J2SEAPI的子集的包;一套通用的網絡接口。CLDC與J2SE的不同之處在于它支持網絡的部分,網絡接口的描述羅列在一個叫做GCF[01](GeneralConnectionFramwork,通用連接框架)的通用網絡框架中。GCF的目的是定義一個通用的網絡體系結構,以支持聯網的I/O,它極其靈活因此具有可擴展性。GCF被設計成J2SE網絡類的功能子集,這意味著在GCF中描述的功能也能在J2SE中找到。GCF主要由一套連接接口組成,還有一個用于建立各種連接的Connetor。Connector類和連接接口均位于包Javax.microeditin.io中。2.2.2在設備配置的基礎上設備框架會提供更具體的功能,以便給定的設備完成重要的任務。對MIDP而言,這種設備就是無線移動設備,如手機或尋呼機。因此MIDPAPI的任務是利用CLDCAPI并在它的基礎上建立必要的類和接口,從而使構建一流的MIDlet變為可能。與CLDCAPI相似,MIDPAPI也分為兩部分:直接從J2SEAPI繼承來的兩個類;一系列包,包括只用于MIDP開發的類和接口。與CLDCAPI相似,MIDPAPI也借用于標準J2SEAPI。而大部分MIDPAPI是專為MIDlet編程使用而設計的新類和接口。雖然這些類和接口的作用與J2SEAPI中的一些類和接口相似,但他們是MIDPAPI獨有的,是專為解決MIDlet具體的問題而設計的。這部分MIDPAPI包含在名字以Javax.microedition為前綴的幾個包中。由于手機自今還沒有硬盤驅動器或實質性的文件系統,不能依靠文件來存儲持久的MIDlet數據。MIDPAPI描述了一個全新的方法去存儲和檢索持久的MIDlet數據,即RMS(RecordManagementSystem,記錄管理系統)。MIDPRMS提供了一個簡單的基于記錄的數據庫API,以持久存儲數據,如最高分清單和需保存的游戲數據等。組成RMS的類和接口位于包javax.microedition.rm中。2.2.MIDlet是用J2MEAPIs開發的程序,用于移動計算環境中。MIDlet需要一個特殊的運行環境。這個環境主要包含一個應用程序管理器,它為在移動設備上選擇和運行MIDlet提供方便。每個MIDlet都是從同一個標準類中派生出來的。這個標準類是MIDPAPI的組成部分,位于包javax.microedition.midlet中,叫做MIDlet類。MIDlet類定義了幾個方法,其中3個方法對開發MIDlet特別重要:startApp()—啟動MIDlet;pauseApp()—暫停MIDlet;destroyApp()—銷毀MIDlet;MIDlet對應三個狀態:Active(激活)、Paused(掛起)和Destroyed(銷毀),它們決定了MIDlet如何發揮作用。這些狀態直接對應上述三個方法。消減狀態消減狀態(Destroyed)停止狀態(Paused)運行狀態(Active)StartApp()DestroyApp()呼叫MIDlet的構造函數DestroyApp()PauseApp()圖2-2MIDlet的流程MIDletsuite是MIDP應用程序的最小單位,JAM負責將手機內的MIDletsuite以圖形化的方式呈現,讓用戶能夠選取欲執行的MIDletsuite,一旦選取了某個MIDletsuite,操作系統就會激活KVM執行里面的MIDlet。MIDlet及相關的支持類組成了MIDP應用程序的實際內容。而每個MIDlet都必須繼承javax.microedition.midlet.MIDlet這個抽象類。在MIDP規范中定義了MIDlet的生命周期,以及可以存在的三種狀態,包括Paused、Active以及Destroyed,每一個MIDlet在任何時刻只可能處于其中的一個狀態。這三種狀態的轉換關系如圖2-2所示:MIDlet有三個狀態,分別是pause、active和destroyed。在啟動一個MIDlet的時候,應用管理軟件會首先創建一個MIDlet實例并使得他處于pause狀態,當startApp()方法被調用的時候MIDlet進入active狀態,也就是所說的運行狀態。在active狀態調用destroyApp(booleanunconditional)或者pauseApp()方法可以使得MIDlet進入destroyed或者pause狀態。值得一提的是destroyApp(booleanunconditional)方法,事實上,當destroyApp()方法被調用的時候,AMS通知MIDlet進入destroyed狀態。在destroyed狀態的MIDlet必須釋放了所有的資源,并且保存了數據。如果unconditional為false的時候,MIDlet可以在接到通知后拋出MIDletStateChangeException而保持在當前狀態,如果設置為true的話,則必須立即進入destroyed狀態。為了能有程序開發人員控制接口的外觀和行為,需要使用大量的初級用戶接口類,尤其在游戲程序中,幾乎完全依賴的就是Canvas抽象類進行繪圖。從程序開發的觀點看,Canvas類可與高級Screen類交互,程序可在需要時在Canvas中摻入高級類的組件。Canvas提供了鍵盤事件、指點桿事件(如果設備支持),并定義了允許將鍵盤按鍵映射為游戲控制鍵的方法。鍵盤事件由鍵代碼指定,但這樣控制游戲會導致缺乏通用性,并不是每個設備的鍵盤布局都適合游戲的操作。應當將鍵代碼轉換為游戲鍵的代碼,以便硬件開發商能定義他們自己的游戲鍵布局。2.2.在沒有MIDP2.0前,游戲繪圖一般需要手動編程使用雙緩沖。需要在paint()方法內將所想要畫的圖形畫在一張預先準備好的背景上,等所有繪圖操作都完成后再將背景的數據拷貝到實際的屏幕上。Image類提供了一個建立背景的靜態方法createImage(intwidth,intheight),再利用getGraphics()方法取得屬于這個背景的Graphics對象,所進行的繪圖操作都會作用在背景上,等到全部的繪圖操作完成后,再調用drawImage()方法將背景的數據復制到實際顯示的屏幕上。這樣的技術在繪制動畫時特別有用。繪制動畫時經常需要不斷地更新畫面,而更新畫面的操作就是先將屏幕以fillRect()的方式清除,再將下一張圖片畫在屏幕上,然而反復的清除及重繪會造成屏幕的閃爍現象(flicker)。因此使用雙重緩沖的好處就是在后臺進行這個清除及重繪的操作,再將完成的繪圖拷貝到屏幕上。由于用戶看不到清除的操作,因此就不會出現閃爍的現象了。不過在某些MIDP的實現上已經加上了雙重緩沖的支持,因此在處理前應先利用Canvas類的isDoubleBuffer()方法來判斷。在MIDP2.0版本發布后,游戲移植性問題初步得到了解決。MIDP2.0新加入了GameCanvas、Sprite、Layer、LayerManager、TiledLayer五個與游戲開發相關的類,其中Layer類一般不會直接用到。GameCanvas類繼承自Canvas,所以具有Canvas所具有的功能,還額外增加了一些便于游戲設計的功能。比如:GameCanvas類直接提供了getKeyStates(),使程序員可以在同一個線程自己偵測按鍵的狀態。GameCanvas類提供了flushGraphics()的功能,實現了雙緩沖技術。Sprite類是繼承自Layer的用于存儲多幀的基本可視元素。不同的frame可交相顯示,構成動態的效果。圖片可翻轉和顛倒,由一個游戲圖片就可以方便的得到所有方向的顯示狀態,相比原先只能使用Canvas繪圖,需要將所有方向的游戲圖像都繪制在png圖像中簡化了許多。Sprite也可以從整合的圖像中讀圖,讀圖時將把大圖分解為若干等寬等高的小圖。每個小圖按照其排列順序有相應的序號,在程序中調用其序號,就可以繪制出相應的圖片。2.2.5當前的主流游戲分類方式,主要是從玩家角度來分類的[02],手機游戲也不例外,主要包括:RPG(角色扮演)類,如Nokia的同名RPG(角色扮演)游戲《Nokia》,大宇的《仙劍奇俠傳Mobile》;FTG(格斗)類,如Siemens的《BattleMail》,日本的《街頭霸王》移動電話版,Sony的摔跤游戲《斗魂列傳》,《拳皇(KOF)》;電影改版類,如Intel和高通公司投資的Jamdat的《角斗士》;SPG(運動)類,如蘇格蘭公司DigitalBridges推出的幻想足球世界作品;棋牌類,如跳棋、斗地主、接龍、五子棋和麻將等游戲;動作類,如月球反擊戰、空軍大戰、賽車坦克大戰和超級瑪麗等游戲;益智類,如挖地雷、推箱子和數字吃豆等游戲;冒險類,如Nokia的《speed》;模擬類,如大宇的《大富翁系列》;戰略模擬,由于當前手機的限制,此類游戲還沒有較好地實現,但是PC機上的帝國世界,星際爭霸都是此類游戲的代表;FPS游戲(第一人稱視角游戲),這個游戲最具代表性的是CS。所有成功游戲的主要要素就是游戲的構思、可玩性、圖形的設計、聲音的設計和性能。在設計開發游戲時把握住這些要素,然后加入新的個性,也能夠開發出一款成功的游戲。2.開發游戲的時候所面臨的最大的挑戰就是:要給玩家制造挑戰[04]。在有些游戲中。只要使敵人不斷涌向玩家就可以形成挑戰,而在其他一些游戲中,卻需要開發出的代碼使得游戲也像人類玩家一樣思考。讓游戲思考也就是我們要討論的人工智能(ArtificialIntelligence,AI)策略。人工智能可以定義為一種在計算機中模擬人類思維過程的技術。AI是一非常廣泛的研究領域,而和游戲相關的AI只是整個AI知識的一個相對較小的子集。近年來的游戲AI策略研究集中在兩個領域:一個特別有意義的領域就是模糊邏輯,它嘗試做出“最佳猜測”決策而不是傳統AI的具體決策;另一個有趣的AI研究就是基因算法,它所嘗試建模的進化論思想和科學家所認為的基因自然進化理論相似[04]。使用基因算法的游戲理論上都會有一個計算機對手在游戲過程中不斷的學習,為人類玩家提供好似源源不斷的挑戰。2.根據如何滿足特定游戲的應用需求,和游戲相關的AI劃分為三種基本的類型:漫游AI—確定一個游戲對象如何在一個虛擬的游戲世界中漫游;行為AI—確定跟蹤或追逐在一個游戲對象多個游戲對象后面的另一個游戲對象是多么具有攻擊性;策略AI—在一個策略游戲中,從一組固定的實現定義的漫游規則中確定最佳的移動方案;由于本游戲的設計只涉及到前兩種,所以這里我們就只討論前兩種AI。2.漫游AI指的是對游戲對象建模的AI,也就是,游戲對象做出決定,確定它們如何在一個虛擬世界中漫游。基本上,對于計算機控制的對象,不論是它必須做出決定改變當前路徑,還是要在游戲中實現需要的結果,或者只是簡單地遵守某種特定的移動方式,都要用到漫游AI。實現漫游AI通常都比較簡單,一般包括根據一個對象的位置或速度,改變另一個對象的速度或位置。對象的漫游移動也可以由隨機的或預定以的方式的影響。有三種類型的漫游AI:追逐、躲避和模式。追逐是這樣一種漫游AI:一個游戲對象跟蹤或是追逐另外一個對象或多個游戲對象。一般是根據被追逐對象的速度或位置來追逐,來改變追逐對象的速度或位置,在其中必須能夠利用好隨機方法使追逐變得平緩。逃避和追逐在邏輯上是相對的,它是另一種方式的漫游AI,其中一個游戲對象專門試圖擺脫另一個對象,它們的實現方式是相似的。模式移動指的是對游戲對象使用一組預定義的移動的一種漫游AI類型。模式包括圓圈、八字形、Z字形或者更加復雜的移動。模式通常存儲為一個速度或位置偏移量的數組,當模式移動需要它的時候會將其應用到一個對象上。2.2.6盡管漫游AI策略本身確實很有用,實際的游戲場景中常常需要混合使用這三種AI。行為AI是另外一種基本的游戲AI類型,它常常用一種混合的漫游AI算法來賦予游戲對象特定的行為。使用行為AI的另一個合理的原因就是要改變游戲的難度。例如,可以借助追逐算法而不是隨機移動或模式移動來使得攻擊者在游戲中的較高級別中更具攻擊性。要實現行為AI,還需要建立一組攻擊者或游戲角色的行為。賦予游戲對象行為并不是很難。通常需要為系統總的每一種行為建立一個級別,然后將它們應用到每一個對象。例如在游戲具有攻擊性的角色一般具有一下的幾種行為:追逐、躲避、模式移動和隨機移動。行為AI的效果非常好,并且由于它實現簡單,利用它往往收獲頗豐。典型的實現就是使用一個switch語句或者嵌套的if—else語句來選擇一個特定的行為。行為的創建和分配具有廣闊的創新性。創建游戲對象行為的想法的最好的來源是動物世界中常見的初級反應。2.3術語及相關縮寫解釋IDE:全稱IntegratedDevelopmentEnvironment,集成開發環境;WTK:全稱WirelessToolkit,是Sun公司發布的J2ME應用開發套件;JAR:全稱JavaArchiveFile,是Java的一種文檔格式。本文中用以代指J2ME程序經編譯后的執行文件,可以傳至手機中直接運行;NPC:全稱NonPlayerCharacter,即“非玩家控制角色;FPS:全稱FramesPerSecond,即每秒刷新幀數;AI:全稱ArtificialIntelligence,即人工智能。

第三章系統需求分析本章主要對系統的運行平臺、界面、速度和游戲的各種規則進行需求分析。3.1運行平臺本游戲屬于一款單屏幕動作類游戲,目標運行平臺為所有支持CLDC1.1、MIDP2.0,屏幕分辨率不小于320×240的手機設備,并要求在各型號手機上均有良好的兼容性。3.2界面要求參照PC機上的賽車游戲,要求精致、美觀,游戲角色形象可愛。所有界面均須使用低級UI繪制。3.3速度要求要求在滿足平臺需求的各手機上運行時畫面流暢,聲音播放正常,操作無明顯延遲感。3.4游戲具體需求3.4.1要求游戲具有“閃屏”(Splash)、“菜單”、“游戲主界面”、“幫助”和“關于游戲”等界面。3.4.2要求顯示游戲菜單前,必須先自動、連續顯示兩個閃。第一個閃屏用于顯示南京工程學院徽標、南京工程學院校名和畢業設計等信息;第二個閃屏用于顯示所設計的程序的圖標和程序名稱及版本等。兩個閃屏的顯示由時間控制,自動消失,也可以接受用戶的按鍵事件,用戶在任何一個閃屏按任意鍵,當前閃屏自動消失。閃屏圖案排列要考慮顯示全部圖案,且游戲菜單無論在大、小屏幕都要垂直、水平居中。3.4.3游戲者可通過菜單界面可選擇開始游戲、繼續游戲(但暫停后恢復時自動添加)、游戲選項、游戲等級、幫助、關于和退出游戲。3.4.游戲者可通過主菜單進入游戲等級選擇界面查看游戲的各個等級,該界面必須實現上下鍵滾動屏幕或翻頁功能和按鈕事件的響應,以實現玩家選擇的相應的等級。3.4.5游戲者可通過主菜單進入幫助或關于界面查看游戲規則與基本操作及關于信息,該界面必須實現中英文的換行顯示及上下鍵滾動屏幕或翻頁功能。3.4.游戲者可通過主菜單進入選項界面關于音樂開關及手機震動的啟動與否,該界面必須實現中英文的換行顯示及上下鍵滾動屏幕。3.4.7游戲有玩家與敵人(后文中均NPC指代)兩種游戲角色,玩家只能有一個,由游戲者控制,敵人可能有多個,由游戲人工智能控制。角色出生時具有基本的移動速度,這些屬性可在游戲中改變。角色可以在賽道地圖允許的框架內沿著賽道左右進行移動。如果玩家移動方向鍵,則該角色按該方向沿著賽道前進。所有角色唯一的死亡方式為沒能量或被對方撞死。3.玩家賽車與游戲賽車在賽道上比賽,在行駛過程中會遇到各種各樣的行車,玩家要盡量避開NPC不與他們碰撞,因為每次碰撞都會減少生命值。每個賽車都有相同的生命值和能量值(汽油)。玩家在車速已經到達120時,可以啟動火箭引擎,迅速達到該車所能達到的最大值,但是每一次啟動都會消耗正常行駛時能量值的三倍。在雙方都未到達終點以前,無論哪個賽車生命值生命值為零或能量值為零,該賽車就算失敗。玩家在每次開始時都有四種車型可以選擇,每輛車的最高速度都不一樣。3.4.游戲應該具有暫停功能;游戲過程中可隨時呼出菜單進行操作。

第四章系統設計與實現本章主要對游戲的整體框架進行設計,并實現游戲的主類、游戲的閃屏類、游戲菜單、游戲畫布、碰撞檢測、鍵控處理和游戲的人工智能策略等。4.1整體框架4.1.1為了有效應對需求的變化,程序需求具有可擴展性,為了調試方便,程序需要具有清晰的結構。本程序采用三層程序架構,業務表現層、業務邏輯層和數據持久層。業務表現層[02]。主要是游戲界面的繪制,通過指定的接口繪制,與游戲的邏輯分離。在本游戲中屬于該層的有SplashCanvas類、MyInfoCanvas類、MainMenu類、MenuGameLevel類、MenuOption類、StringPrint類、MenuStringPrint類、OnOffMenu類、SoundEffects類和CarSelect類等。業務邏輯層。主要是游戲角色的動作和碰撞檢測的處理,這個與表現層無關,需要調用定義好的接口與邏輯通信,而起這樣作用的接口主要是在MIDlet類中定義的。本游戲中屬于該層的有GameScreen類、GameSprite類、ArroundRoad類和Enemy類等。數據持久層。保存游戲中的數據,在入游戲中需要的一些歷史數據,與程序的邏輯無關。本游戲中屬于該層的主要是GameRecord類。從游戲的功能劃分,游戲中基本的功能應該包括菜單處理、程序邏輯處理、持久性處理和掛起恢復處理。關于菜單的處理,包括可以選擇的進入游戲、繼續游戲、游戲等級、歷史數據、幫助和游戲選項等。程序的邏輯處理就是涵蓋了程序中除菜單外幾乎所有的功能。持久性處理就是游戲相關數據的保存、資源的載入和游戲的進度保存。關于掛起恢復處理,是每一個商用程序必須要處理的問題。在有電話呼入或者收到短信時,需要保存當前的狀態,當用戶處理完畢,精確恢復程序到原來的狀態。這兩種劃分方法,在功能上可能有重復,但是是按照完全不同的兩種思想來會劃分的,一個是程序的架構,另一個是從程序的表現方面來說的[05]。4.本游戲的主要流程圖如下所示。圖4-1游戲界面間切換4.1.3游戲游戲開發過程完全基于面向對象思想,使各個模塊的功能盡可能的獨立,游戲共設計16個類。這些類在com.yly.crazyCar包中,類的結構如圖4-2所示。圖4-2游戲類結構圖4.本游戲的文件層次結構如圖4-3所示。圖4-3游戲文件層次結構圖4.2游戲的啟動管理游戲的最終形式是一個JAR格式的文件,這個文件實際上是一個以ZIP格式的壓縮文件。它與ZIP的唯一區別在于其中有一個META-INF的目錄,其中有一個MANIFEST.MF文件用以描述該項目,符合格式標準的內容可以被自動識別,在程序運行中我們也可以使用Midlet.getAppProperty(“屬性的名字”)的方法來獲得該文件的屬性值。本游戲的MANIFEST.MF清單文件內容如下圖所示。圖4-4MAINIFEST.MF第一行“Manifest-Version:1.0”第二行“MicroEdition-Configuration:CLDC-1.1”定義了配置為CLDC-1.1第三行定義了程序的名稱,他將顯示在手機的程序列表中。第四行是程序的供應商。第五行是程序的入口,因為一個程序可能有多個MIDlet應用,所以加如了一個數字標示。該行使用了都好分為了三段。第一段表示了MIDlet應用的名稱,第二段表示了改MIDlet應用所顯示的圖標,第三段表示了改MIDlet應用的完整類名。第六行是軟件的版本號。第七行是定義簡表為MIDP2.0,它與第二行共同約束了軟件的運行平臺,不符和這兩條要求的設備將不能運行該程序。游戲軟件的最終形式一般還配有一個JAD文件,即應用程序描述文件,它包含該程序的MIDlet信息。創建JAD文件是為了向應用程序管理器提供信息,說明JAR文件的內容,使用這些信息,就可以判斷一個MIDlet是否適合運行在這個設備上。本游戲的JAD文件內容如下圖所示。圖4-5游戲的JAD文件內容第一行的內容和前面講解的清單文件的第五行相同。第二行是MIDletSuite的JAR文件的大小,以字節為單位。第三行是下載MIDletSuite的地址。因為MIDlet可以通過網絡下載,所以這里可以指出下載地址。而下載一般是先下載JAD文件,然后通過JAD中的描述由用戶決定是否下載相應的JAR文件。第四行是MIDletSuite的名稱,在部署JAR和JAD文件到手機時,一定要確保MIDlet-Name的正確,它的值是相應的JAR文件的名字,和前面講解的清單文件的第三行相同。第五行和前面的清單文件的第四行相同。第六行和前面的清單文件的第六行相同。第七行和前面的清單文件的第二行相同。第八行和前面的清單文件的最后一行相同。運行程序后,手機的應用程序管理軟件通過JAD和MANIFEST.MF找到要加載的MIDlet類,即com.yly.crazyCar.CrazyRacecarMIDlet,對其進行實例化。在CrazyRacecarMIDlet類的成員中有一個MainMenu類和StringPrint類的實例。CrazyRacecarMIDlet的構造方法中創建了一個歷史記錄類的實例即GameRecords類,從而讀取游戲的歷史記錄和游戲的相關初始設置。CrazyRacecarMIDlet實例構造后自動調用startApp()方法,在這個方法中我們生成了一個SplashCanvas類的實例pr,利用Display類的API方法setCurrent()方法把該閃屏類的實例設置為當前界面,然后調用pr的start()方法開始定時任務,代碼如下:/* *啟動游戲,開始啟動第一個閃屏 */ publicvoidstartApp(){Displayablecu=Display.getDisplay(this).getCurrent();//獲得關于顯//示的設備上下文 if(cu==null){ MyInfoCanvaspr=newMyInfoCanvas(this,me); Display.getDisplay(this).setCurrent(pr);//第一次顯示閃屏 pr.start(); }else{ Display.getDisplay(this).setCurrent(cu);//顯示游戲畫布內容 if(gM!=null&&cu==gM.getCanvas()) gM.resume();//重新開始游戲線程 } }在startApp()方法中在執行任何操作之前當然要先判斷程序是否是第一次啟動,由此來決定將游戲的顯示權交給閃屏還是游戲畫布。因為startApp()方法可能會在程序受到外界中斷的情況下多次調用,所以應當檢測當前程序是否處于這種情況,如果中斷之前的顯示內容為游戲畫布,則重新啟動游戲畫布的線程,顯示權任然交給畫布。4.3游戲的主類的實現MIDlet用作一個狀態機來管理各種屏幕以及它們之間的轉換。例如,本程序有兩個閃屏動作,該類、MyInfoCanvas類和SplashCanvas類共同完成一些必要資源和游戲相關設置的初始化。4.游戲的開始將會依次出現兩個閃屏,它們將會停留一小段時間,然后才進入游戲菜單。游戲閃屏使用得當,將會增加整個游戲的視覺效果,而且雖然畫面在此期間停留不動,但是后臺程序卻是忙碌的,一般是在此期間完成基本的初始化工作。前面一小節已經介紹過在startApp()方法中,當第一次啟動游戲時,CrazyRacecarMIDlet類會把顯示權交給第一個閃屏。當兩個閃屏都繪制完畢時,將會在第二個閃屏中調用splashScreenPainted()方法,表示程序可以利用剩余的時間間歇來完成一些工作,這里啟動了CrazyRacecarMIDlet實現的一個線程,它會自動調用run()方法。在run()方法中將會進行一些初始化工作,這包括初始化聲音和開始播放背景音樂等。當所有的工作都完成時,將一個initDone標志位設置為true,表明已經初始化完畢。當閃屏結束后,將會調用splashScreenDone()方法,在這個方法里將檢測初始化是否完畢,如果還沒有則繼續初始化,如果已經完畢則顯示游戲菜單。代碼如下: voidsplashScreenDone(Displayablene){ init();//檢測是否初始化完畢 Display.getDisplay(this).setCurrent(ne);//在屏幕上顯示下一個界面 } publicvoidsplashScreenPainted(){ newThread(this).start();//啟動后臺的初始化線程 } publicvoidrun(){ init();//調用初始化方法 } privatesynchronizedvoidinit(){ if(sound&!initDone){//如果還沒有初始化完畢 SoundEffects.getInstance().startBgPlayer();//初始化并且播放聲音 initDone=true;//已經初始化完畢 } }4.前面已經講述過MIDlet主類起到一個狀態機的作用,負責各個屏幕之間的切換。下面具體實現改切換功能。如果游戲中斷,從主菜單中可以選擇繼續游戲選項,顯示游戲畫布。代碼如下: /** *玩家由于外界原因或玩家自己暫停游戲后,從菜單中選擇繼續選項 */ voidmainMenuContinue(){ //獲的游戲畫布的當前畫布,并把顯示權交給它 Display.getDisplay(this).setCurrent(gM.getCanvas()); }進入游戲難度選擇選項,從中可以進行難度的選擇: /** *進入游戲難度選項 */ voidmainMenuGameLevel(){ if(mL==null) mL=newMenuGameLevel(this,me);//游戲主菜單的二級子菜單 Display.getDisplay(this).setCurrent(mL);//把子菜單設為當前界面 }從主游戲菜單中選擇開始游戲,首先判斷游戲是不是從中斷中剛恢復。如果不是則初始化游戲畫布并啟動游戲主線程,然后就把顯示權切換給游戲畫布。如果是則重新初始化游戲數據,并把顯示權重新交給游戲畫布。代碼如下: /** *正式進入游戲的游戲入口方法 */ voidmainMenuGameStart(){ mO=null; mL=null; System.gc(); if(gC){ gM.resetdata();//游戲重新開始 Display.getDisplay(this).setCurrent(gM.getCanvas());//重新顯示游戲畫布 }else{ gM=newGameScreen(this);//游戲第一次開始 gM.start(); Display.getDisplay(this).setCurrent(gM.getCanvas());//顯示游戲畫布 me.addContinue();//在主游戲菜單中添加繼續菜單 gC=true;//設置游戲第一次已經開始標志位 } }從游戲主菜單中選擇游戲說明,動態生成一個顯示游戲相關信息的屏幕,使用完成后就會銷毀,可以避免在不使用時占用對內存。代碼如下:/** *游戲說明選項 */ voidmainMenuAboutGame(){ //游戲說明的內容 Stringab="crazyracecar\nVersione:1.0.0\n\nmadeinchina" +"\nnjitdkj041\nyeleiyu\n\nj2meGameDesign"; Stringti="AboutGame";//子界面的標題 Stringba="BACK";//子界面的back按鈕 //子界面Form類 MenuStringPrintcr=newMenuStringPrint(this,ti,ab,ba); Display.getDisplay(this).setCurrent(cr);//把顯示權交給子界面 }當玩家由游戲狀態中退回到菜單時需執行的方法如下: /** *由游戲狀態退回到游戲主菜單中 */ voidGameScreenMainMenu(booleanisGO){ if(isGO){//判斷游戲是否結束, me.deleteContinue();//游戲已經結束,刪除繼續游戲按鈕 writeGameInfo();//寫入游戲信息 }else{ me.selectContinue();//游戲未結束,添加繼續游戲按鈕 } Display.getDisplay(this).setCurrent(me);//顯示權交給游戲主菜單 }從主游戲菜單中的子菜單退回到當前畫布中,首先判斷游戲的當前畫布是否與la相同,并判斷當前的GameScreen類的實例是否是為空。代碼如下:/** *從游戲主菜單的各菜單中退回到當前游戲畫布中 */ voidsettingsScreenBack(Displayablela){ mO=null; if(gM!=null&&la==gM.getCanvas())//斷游戲畫布是否為空并判斷是否是la gM.resume(); Display.getDisplay(this).setCurrent(la);//把顯示權交給la對象 }4.3.一般來說,游戲的停止、銷毀和退出工作主要集中在對游戲畫布的處理上,暫停程序時,如果當前顯示內容為游戲畫布(表明游戲進行中)則應當調用GameCanvas類的stop()方法暫停程序。在商用程序中,一個很重要的地方就是要求來電掛起或短信處理完畢后程序能夠繼續運行,而不會出現錯誤或者是重新開始。當來電話時,系統會調用pauseApp(),需要停掉當前線程。恢復時,程序會再次調用startApp(),這時用戶需要判斷是否是恢復調用還是程序的開始調用,這在前面已經講過了。游戲暫停、退出的代碼如下: publicvoidpauseApp(){ if(gM!=null) gM.pause();//使線程暫停 Display.getDisplay(this).setCurrent(gM.getCanvas());//把顯示權交給當前畫布 } publicvoiddestroyApp(booleanun){ if(gM!=null) gM.stop();//在銷毀程序之前先停止游戲線程 }從游戲主菜單中選擇退出選項,從而退出。代碼如下: voidmainMenuExit(){ destroyApp(false); notifyDestroyed();//告知系統已經銷毀程序,可以安全退出了 }4.3因為只有MIDlet類能夠訪問Display對象,因此通常將振動、背景光等特效放置在這個類里面,其代碼如下,times為代表持續的時間。代碼如下:voidvirbate(inttimes){ Display.getDisplay(this).vibrate(times);//手機振動,持續時間為times } voidflashBacklight(inttimes){ Display.getDisplay(this).flashBacklight(times);//手機背景光閃爍續時間為times }4.4游戲閃屏的實現本游戲制作了兩個閃屏(Splash),分別用來顯示畢設信息和游戲信息。畢設信息閃屏要求居中顯示校名、校徽、學院、指導老師與學生等內容,率;游戲信息閃屏則顯示游戲Logo及游戲版本。兩個閃屏界面在模擬器中的顯示見圖4-6和圖4-7。

圖4-6畢設信息閃屏界面圖4-7游戲相關信息界面閃屏類都繼承自Canvas,并設定為全屏模式,在paint(Graphicsg)方法中定義內容。我們先使用了Canvas.getHeight()方法獲得屏幕的高度,內容居中顯示簡單得多,只需計算出屏幕的水平中心坐標,并在繪制的時候將對其參數設置為Graphics.HCENTER|Graphics.TOP即可。代碼如下: publicvoidpaint(Graphicsg){ intx=0; inty=20; //設定y軸起始繪制位置 x=getWidth()/2;//計算x軸起始繪制位置 g.setColor(0,0,0); g.fillRect(0,0,getWidth(),getHeight()); for(intx1=0;x1<240;x1++) g.drawImage(backGround,x1,0,20);//繪制圖像 //在設定好的位置繪制校徽 xiaoHui.rid(g,(getWidth()-xiaoHui.getWidth())/2,130,xiaoHui.dx, 0); Fontfont=Font.getFont(Font.FACE_SYSTEM,Font.STYLE_PLAIN, Font.SIZE_LARGE); g.setFont(font); for(inti=0;i<SPLASH_TEXT.length;i++){ g.setColor(0xFF0000); //在設定好的位置繪制畢業設計信息

溫馨提示

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

評論

0/150

提交評論