版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
畢業(yè)設(shè)計(jì)(論文)第1頁共42頁目錄 11.1國內(nèi)外手機(jī)游戲的研究現(xiàn)狀 11.2手機(jī)游戲的技術(shù)分類 11.3研究意義 2 42.1什么是J2ME 42.2J2ME平臺(tái)體系結(jié)構(gòu) 4 5 6 8 8 9 3.1手機(jī)游戲的畫面 3.2手機(jī)游戲中的按鍵 3.4手機(jī)硬件平臺(tái)特點(diǎn) 3.3線程使用 3.4手機(jī)硬件平臺(tái)特點(diǎn) 3.5手機(jī)游戲開發(fā)工具軟件 4.1游戲描述 4.2可行性研究 4.3游戲設(shè)計(jì) 4.4詳細(xì)編碼設(shè)計(jì) 4.5程序打包、下載安裝與運(yùn)行 4.6最后效果圖 第1頁共42頁第一章引言近年來,因特網(wǎng)在國內(nèi)迅速普及,導(dǎo)致了網(wǎng)絡(luò)游戲的高速發(fā)展。同樣手機(jī)的普及,導(dǎo)致了手機(jī)游戲市場呈現(xiàn)爆炸式的發(fā)展。尤其是國內(nèi)外巨大的手機(jī)擁此巨大的手機(jī)游戲市場,各游戲開發(fā)商、運(yùn)營商、服務(wù)商以及手機(jī)終端廠商等的性能,同時(shí)還在手機(jī)操作系統(tǒng)方面采用開放式的平臺(tái),方便用戶享受不同的手機(jī)游戲業(yè)務(wù)1。而國內(nèi)游戲開發(fā)商,如盛大、網(wǎng)易等公司,紛紛躋身手機(jī)游戲開發(fā)商行列。新浪、搜狐等著名的門戶網(wǎng)站,也紛紛涉足手機(jī)游戲領(lǐng)域,相繼開辟了各自的手機(jī)游戲頻道和欄目,其他一些游戲網(wǎng)站也都全面加快了手機(jī)游戲開發(fā)的步伐。目前SUN公司的J2MECLDC/MIDP環(huán)境和高通公司的BREW(BinaryRuntimeEnvironmentforWireless)客戶端程序是國內(nèi)外游戲開發(fā)的等豐富的數(shù)據(jù)服務(wù)。中國移動(dòng)用戶只要使用支持Java的手機(jī),通過GPRS的無Java語言編寫的應(yīng)用程序。而中國聯(lián)通與高通公司合作,采用高通公司的1.2手機(jī)游戲的技術(shù)分類手機(jī)游戲按實(shí)現(xiàn)的技術(shù)分,可分為嵌入式游戲、瀏覽器游戲、基于J2ME能,從而達(dá)到其他類型的游戲所無法達(dá)到的效果,而且嵌入式中不會(huì)讓用戶產(chǎn)生費(fèi)用。但是這些游戲是依據(jù)手機(jī)生產(chǎn)廠商的平臺(tái)進(jìn)行開發(fā)畢業(yè)設(shè)計(jì)(論文)的,出廠時(shí)設(shè)置了幾款游戲,玩家就只能在這幾款游戲當(dāng)中進(jìn)行選擇,而不能根據(jù)用戶自己的喜好對游戲進(jìn)行升級、刪除等操作,所以嵌入式游戲的缺點(diǎn)也是明顯的,無法給玩家?guī)硇迈r感,玩家容易對固定的幾款游戲產(chǎn)生厭倦。WAP是一種用手機(jī)上網(wǎng)的網(wǎng)絡(luò)服務(wù)。進(jìn)行WAP游戲時(shí),通過手機(jī)自帶的WAP瀏覽器來瀏覽手機(jī)網(wǎng)站上的頁面,并通過頁面中描述的內(nèi)容來進(jìn)行游戲。形式上類似于網(wǎng)上常見的一些心理測驗(yàn)之類的交互手段。WAP游戲沒有圖片和容量的限制,但這類游戲大多采用文字交互方式,這樣游戲性就不強(qiáng),缺乏直觀感覺。而且在收費(fèi)上,WAP游戲費(fèi)用比較高,因?yàn)樵谟螒虻倪^程中,您不僅需要向服務(wù)商交納一定的費(fèi)用,而且同時(shí)要向中國移動(dòng)或中國聯(lián)通交納一定的使用C++應(yīng)用程序和其它編譯語言開發(fā)游戲也是一種較好的開發(fā)方式。編譯語言程序能提供更好的控制用戶界面,而且編寫的應(yīng)用程序相比用腳本語言編寫的程序,效率更高、使用的內(nèi)存更少,并且執(zhí)行得更快。但由于這些編譯語言往往不具有跨平臺(tái)性,而且由于編譯語言的特點(diǎn),往往需要較長的開發(fā)周Java2MicroEdition(J2ME)是一種針對移動(dòng)電話和PDA等小型設(shè)備的Java語言。采用J2ME極大的提高了手機(jī)支持游戲的能力。它有比WAP游戲更易控制的界面,J2ME游戲擺脫了純文字交互的方式,它允許使用圖形動(dòng)畫,并且可以通過無線網(wǎng)絡(luò)連接到遠(yuǎn)程服務(wù)器。而且Java是面向?qū)ο蟪绦蛟O(shè)計(jì)的語言,它最大的特點(diǎn)是一次編寫、到處運(yùn)行,即平臺(tái)無關(guān)性?,F(xiàn)在支持Java的手機(jī)比較普及,它也已經(jīng)成為目前比較好的移動(dòng)游戲開發(fā)環(huán)境。手機(jī)游戲成了電信增值業(yè)務(wù)中一項(xiàng)主要的應(yīng)用,在公交車等公共場合不時(shí)游戲,如今的手機(jī)游戲,無論是從視覺效果、聽覺效果還是游戲的可玩性來說,都要精彩的多。在全球,移動(dòng)電話數(shù)量巨大,除美國之外,其他各個(gè)發(fā)達(dá)國家擁有手機(jī)的人數(shù)比擁有計(jì)算機(jī)的人數(shù)還多。在我國,手機(jī)擁有量甚至超過了美國的人口數(shù)量,而且每個(gè)月手機(jī)數(shù)量還正以驚人的速度遞增著。手機(jī)市場的高速增加帶動(dòng)了手機(jī)游戲市場的急速膨脹,基于JAVA、BREW等技術(shù)平臺(tái)第3頁共42頁的手機(jī)游戲市場規(guī)模紛紛呈現(xiàn)幾何增長態(tài)勢[2]。第4頁共42頁J2ME是SUN公司針對嵌入式、消費(fèi)類電子產(chǎn)品推出的開發(fā)平臺(tái),與J2SE和J2EE共同組成Java技術(shù)的三個(gè)重要的分支。J2ME實(shí)際上是一系列規(guī)范的集合,由JCP組織制定相關(guān)的JavaSpecificationRequest(JSR)并發(fā)布,各個(gè)廠商會(huì)按照規(guī)范在自己的產(chǎn)品上進(jìn)行實(shí)現(xiàn),但是必須要通過TCK測試,這樣確保J2ME平臺(tái)是由配置(Configuration)和簡表(Profile)構(gòu)成的。配置是提供給最大范圍設(shè)備使用的最小類庫集合,在配置中同時(shí)包含Java虛擬機(jī)。簡表是針對一系列設(shè)備提供的開發(fā)包集合。在J2ME中還有一個(gè)重要的概念是可選包(Optional-Package),它是針對特定設(shè)備提供的類庫,比如某些設(shè)備是支持藍(lán)牙的,針對此功能J2ME中制定了JSR82(BluetoothAPI)提供了對藍(lán)牙的支持。目前,J2ME中有兩個(gè)最主要的配置,分別是ConnectedLimitedDevicesCDC的硬件參數(shù):(1)2M以上內(nèi)存。(3)需要實(shí)現(xiàn)java虛擬機(jī)規(guī)范的全部功能。(4)32位或者64位的處理器。(1)512KB以下內(nèi)存(2)有限能源供應(yīng)(通常使用電池)。(4)簡單的用戶界面。(5)16位或者32位的處理器。車導(dǎo)航系統(tǒng)等。簡表是以配置為基礎(chǔ)的,例如MobileInformationDevicesProfile(1)主機(jī)操作系統(tǒng)層(HostOperatingSystemLayer):這一層為特定硬件設(shè)備的操作系統(tǒng)層。(2)Java虛擬機(jī)層(JavaVirtualMachineLayer):這一層是Java虛擬機(jī)的一個(gè)實(shí)現(xiàn),它是為特定為特定設(shè)備的主機(jī)操作系統(tǒng)定制的,支持一個(gè)特定的J2ME配(3)配置層(ConfigurationLayer):配置層定義Java虛擬機(jī)的功能和特定類別設(shè)(4)描述層(ProfileLaver):描述層定義了特定類別設(shè)備上可用的應(yīng)用程序編層、配置層和描述層。的核心,只要Java程序在執(zhí)行,Java虛擬機(jī)也必定在執(zhí)行。Java虛擬機(jī)是實(shí)際執(zhí)行Java程序的引擎,也是Java語言具有這么多優(yōu)良特色的關(guān)鍵所在。當(dāng)你執(zhí)行Java程序時(shí),程序內(nèi)的指令其實(shí)并不是由硬件直接執(zhí)行,而是由一個(gè)特別的軟第6頁共42頁件一一讀取這些指令來執(zhí)行的。簡單地說,Java程序不是被特別軟件。虛擬機(jī)的優(yōu)點(diǎn)甚多,比如移植方便,只需要移植虛擬機(jī)和相關(guān)的支持程序庫到新的硬件架構(gòu)上,所有上層的應(yīng)用程序都不需要更動(dòng)就完成移植可以防止惡作劇的程序暗中搞鬼[S。2000年5月,JavaCommunityProcess(JCP)公布了CLDC1.0規(guī)范(即JSR30)。作為第一個(gè)面對小型設(shè)備的Java應(yīng)用開發(fā)規(guī)范,CLDC是由包括Nokia,Motorola和Siemens在內(nèi)的18家全球知名公司共同協(xié)商完成的。CLDC是J2ME核心配置中的一個(gè),可以支持一個(gè)或多個(gè)profile。其目標(biāo)主要面向小型的、網(wǎng)絡(luò)連接速度慢、能源有限(主要是電池供電)且資源有限的設(shè)備,如手CLDC的核心是虛擬機(jī)和核心類庫。虛擬機(jī)運(yùn)行在目標(biāo)操作系統(tǒng)之上,對需求。2虛擬機(jī)可選包2.4.1CLDC的目標(biāo)2.4.2CLDC的整體需求(1)能運(yùn)行在絕大多數(shù)的小型的、資源受限的連接設(shè)備上。第7頁共42頁2.4.3CLDC的硬件需求由于CLDC要面向盡可能多的設(shè)備,而這些設(shè)備所使用的硬件又各不相同。因此CLDC規(guī)范中并沒有指明需要某種硬件支持,只是對設(shè)備的最小內(nèi)存(1)至少160KB的固定內(nèi)存以供虛擬機(jī)和CLDC核心類庫使用。(2)至少32KB的動(dòng)態(tài)內(nèi)存以供虛擬機(jī)運(yùn)行時(shí)使用(堆棧等)。體的設(shè)備的具體實(shí)現(xiàn),這些需求也可能有變化。這里所規(guī)定的160KB是CLDC規(guī)范中的要求,實(shí)際也可以是128KB左右。2.4.4CLDC的軟件需求和硬件類似,CLDC上運(yùn)行的軟件也是多種多樣的。例如,有些設(shè)備支持多進(jìn)程操作系統(tǒng)或者支持文件系統(tǒng);而有些功能極其有限的設(shè)備并不需要文件系統(tǒng)。對于這些不確定性,CLDC只定義了軟件所必須的最小集合。CLDC規(guī)范中要求操作系統(tǒng)不需要支持多進(jìn)(1)Java核心語言與Java虛擬機(jī)的特性(2)核心Java類庫(3)輸入/輸出(1)安全(3)遵守Java虛擬機(jī)規(guī)范(4)要求類文件驗(yàn)證J2EE和J2SE為桌面計(jì)算機(jī)和服務(wù)器的企業(yè)級應(yīng)用和開發(fā)提供了非常豐富的庫函數(shù)。不幸的是這些庫需要幾十兆的內(nèi)存來運(yùn)行,因此并不適合于資源受限的小型設(shè)備。所以CLDC針對小型受限設(shè)備重新制定了一個(gè)類庫。為了保證應(yīng)用程序的兼容性和可移植性,包括進(jìn)CLDC的大多數(shù)類庫都是J2SE中規(guī)定的子集,其它一些是由CLDC規(guī)定的專用于移動(dòng)設(shè)備的類。包括:從J2SE中繼承的第8頁共42頁J2ME提供了描述的概念,使得可以為特定的設(shè)備家族定義相同的Java平(1)描述為在一個(gè)特定的設(shè)備家族實(shí)現(xiàn)應(yīng)用提供了完整的工具,比如傳呼機(jī)、機(jī)(2)可以創(chuàng)建一種描述來支持重要的、一致的一組應(yīng)用,這些應(yīng)用可能會(huì)在幾各簡單地說,描述就是應(yīng)用和市場的設(shè)備家族之間的協(xié)議。處于同一個(gè)設(shè)備家族中的所有設(shè)備都必須實(shí)現(xiàn)其描述所定義的特征,并且要求應(yīng)用只使用這個(gè)特定描述所提供的功能。在實(shí)現(xiàn)層次上,描述被簡單地定義為應(yīng)用在特定配置上的JavaAPI和類庫的集合,同時(shí)為市場中特定的設(shè)備家族提供了附加的面向特定領(lǐng)域的功能17]。表2-1五個(gè)規(guī)范化描述CLDC和MIDP組合起來為創(chuàng)建移動(dòng)電話應(yīng)用程序提供了完整的環(huán)境。MIDP應(yīng)用程序或者稱為MIDlet.其模型如圖2-3所示基于J2ME的手機(jī)游戲設(shè)計(jì)第9頁共42頁MIDlet有三個(gè)狀態(tài),分別是pause、active和destroyed。在啟動(dòng)一個(gè)MIDlet的時(shí)候,應(yīng)用管理軟件會(huì)首先創(chuàng)建一個(gè)MIDlet實(shí)例并使得他處于pause狀態(tài),當(dāng)startApp(方法被調(diào)用的時(shí)候MIDlet進(jìn)入active狀態(tài),也就是所說的運(yùn)行狀使得MIDlet進(jìn)入destroyed或者pause狀態(tài)。值得一提的是destroyApp(booleanunconditional)方法,事實(shí)上,當(dāng)destroyApp()方法被調(diào)用的時(shí)候,AMS通知MIDlet進(jìn)入destroyed狀態(tài)。在destroyed狀態(tài)的MIDlet必須釋放了所有的資知后拋出MIDletStateChangeException而保持在當(dāng)前狀態(tài),如果設(shè)置為true的話,則必須立即進(jìn)入destroyed狀態(tài)。下圖2-4說明了MIDlet狀態(tài)改變情況:pauseAppIn組件與低級繪制相比,用在游戲開發(fā)上的機(jī)會(huì)較少,但還是會(huì)到。所謂UI組件,是指繼承了javax.microedition.lcdui.Screen類的javax.microedition.ledui.Alert,javax.microedition.lcdui.Form,javax下圖為我們展示了整個(gè)LCDUI包的體系:畢業(yè)設(shè)計(jì)(論文)第10頁共42頁Screen類屬于高級圖形用戶界面組件,Canvas是低級圖形用戶界面組件,在同一時(shí)刻,只能有唯一一個(gè)Screen或者Canvas類的子類顯示在屏幕上,我們可以調(diào)用Display的setCurrent()的方法來將前一個(gè)畫面替換掉,我們必須自行將前一個(gè)畫面的狀態(tài)保留起來,并自己控制整個(gè)程序畫面的切換。同時(shí)我們可以運(yùn)用javax.microedition.lcdui.Command類來給我們的提供菜單項(xiàng)目的功能,分別Command.STOP,我們在Displayable對象中定義了addCommand()和removeCommand()兩個(gè)方法,這就意味著我們可以在高級UI和低級UI中同時(shí)使用Command類,同時(shí)我們通過注冊Command事件來達(dá)到事件處理的目的,即與高級UI相比,低級UI就自由很多,任何時(shí)候我們可以調(diào)用repaint()產(chǎn)生重繪事件,調(diào)用完了repaint()會(huì)立刻返回,調(diào)用paint()回調(diào)函數(shù)則是由另一個(gè)專門的線程來完成。底層事件大致可分為三類:PressEvents(按鍵事件),ActionKeys(動(dòng)作按鍵,PointerEvents(觸控事件)。鍵事件的幾個(gè)核心方法為:keyPressed(),keyReleased(),keyRepeated(),當(dāng)按鍵按下時(shí)會(huì)觸keyPressed(),當(dāng)松開按鍵時(shí),會(huì)觸發(fā)keyReleased(),當(dāng)長時(shí)間按住按鍵時(shí)會(huì)觸keyRepeated(),但是RepeatEvents不是JTWI要求強(qiáng)制支持的,所以使用之前要進(jìn)行測試,看設(shè)備是否支持。在Canvas里面我們每按下一個(gè)按鍵都會(huì)觸發(fā)keyPressed()函數(shù),并傳入相應(yīng)位置的整數(shù)值,我們在MIDP規(guī)范中可以很容易的發(fā)現(xiàn),KEY_NUM0—KEY—NUM9十個(gè)常數(shù)分別代表鍵盤上的0-9還有兩個(gè)功能鍵,KEY_STAR,KEY_POUND,如果我們傳入的值小于0,代表我們傳入了不合法的keycode,某些機(jī)器上還支持連續(xù)按鍵響應(yīng),但這并不是JTWI規(guī)定要支持的,所以我們在進(jìn)行實(shí)際開發(fā)之前一定要用我們前面講到的hasRepeatEvents()方法來進(jìn)行判定。動(dòng)作按鍵主要針對游戲來設(shè)計(jì)的,在API第11頁共42頁中定義了一系列的動(dòng)作事件:UP,DOWN,LEFT,RIGHT,GAME_A,觸控事件主要面向高端設(shè)備,并非JTWI要求強(qiáng)制支持的,其核心方法分別對應(yīng)我們通常所相應(yīng)的事件處理函數(shù)。在索愛P910C這樣的高端手機(jī)上,支持屏幕的觸控事法和keyPressed()以及keyReleased()大同小異。第12頁共42頁類中也沒有直接操作畫面顯示的功能。因此,我們要使用提供了管理畫面顯示javax.microedition.lcdui.Display類的子類顯示在畫面上。Displayable類的子類大致說來可以分為兩種,分別為用來進(jìn)行線與圖形,者是javax.micredition.lcdui.Canvas類后者是javax.microedition.lcdui.Screen類與其子類(Alert,FomList,TextBox類等)之旬的關(guān)系。它們之旬的關(guān)系如下圖3-1:圖3-1畫面顯示類圖用來顯示畫面用的Display對象,可以從Display類的Static方法Display#getDisplay(MIDlet)值獲取。通過在獲取的Display對象,就可以讓Displayable對象顯示在畫面上。方法,提供了從byte數(shù)據(jù)中提取Image對象,以及指定與MIDlet相同JAP文件的路徑后獲取對象的功能。創(chuàng)建Image對象的Static方法:基于J2ME的手機(jī)游戲設(shè)計(jì)上一章提到了MIDPUI的組件,這里不在做解釋。Form類是能夠?qū)⒁粋€(gè)以上的圖像文本,Item類的子類(ChoiceGroup,DataField,Gauge,Imageltem)混合顯示的組件。List類,與PC的UT組件中的List組件一樣,是用來顯示項(xiàng)目的列表,以讓用戶來進(jìn)行選擇為目的的組件。也可以是附有選擇按鈕的列表與附有復(fù)選框的列表。文本框是一個(gè)允許用戶進(jìn)行編輯的文本區(qū)域。一個(gè)文本框有一個(gè)足以容納的最大字符數(shù)量,具體的大小依賴于不同M工DP的實(shí)現(xiàn)或者是移動(dòng)電話的存儲(chǔ)器大小。在文本框中字符顯示的順序和格式由設(shè)備決定。當(dāng)文本框中的字符數(shù)量大于一次被顯示的字符數(shù)量時(shí)用戶可以通過滾動(dòng)來編輯一個(gè)文本框中的部分字符。Alert,Form,List,TextBox各類的超類Screen由于與類,因此可以用Display#setCurrent3.2手機(jī)游戲中的按鍵在MIDP中,每一個(gè)按鍵事件將產(chǎn)生一個(gè)按鍵代碼。在MIDP的Canvas類中定義的按鍵代碼如下所示:KEY_NUMO,KEY_NUM1,KEY_NUM2,KEY_NUM3,KEY_NUM4,KEY_NUM5,KEY_UM6,KEY_UM7,KEY_UM8,KEY_NUM9,KEY_STAR和KEY_POUND。上述按鑲代碼包括數(shù)字0~9、星號和#號。在某些特別的移動(dòng)設(shè)備上可能還有其他按鍵,但是在MIDP中規(guī)定的最低限度的按鍵就是上面定義的這些。使用這些按鍵可以確保應(yīng)用程序在任何符合MIDP規(guī)范的移動(dòng)設(shè)備上運(yùn)行。畢業(yè)設(shè)計(jì)(論文)第14頁共42頁我們所創(chuàng)建的動(dòng)畫,是使用線程把所準(zhǔn)備的多張圖像按順序描繪出來。所謂的線程就是指程序的運(yùn)行單位,使用線程可以同時(shí)進(jìn)行處理。在這里,為了要做出線程,我們會(huì)用到Java.Lang.Runnable接口。同樣的處要?jiǎng)?chuàng)建出繼承各類的另一個(gè)類,所以還不如使用Runnable接口。將Runnable接口作為實(shí)現(xiàn)的類,必須將Runnable接口的run()方法重新定在這個(gè)run()方法中,將要編寫以線程所處理的內(nèi)容。下面的代碼為在run)方法Importjavax.microedition.lcdui.*}~}只在以Runnable接口為實(shí)現(xiàn)的類中再定義run(方法,是不能讓線程運(yùn)行的。要運(yùn)行的時(shí)候必須使用到Thread類。要調(diào)用Thread類的Constructor中指定Runnable接口參數(shù)的constructor,來產(chǎn)生Thread對象。接下來,要用產(chǎn)生的Thread接口來調(diào)用Thread#run()方法來啟用線程。線程類由于會(huì)在Thread#start()方法被調(diào)用出來后調(diào)用Runnable#run()方法,因此編寫在run()方法中的處理將會(huì)被自動(dòng)運(yùn)行。線程的終止一般可通過兩種通常,當(dāng)一個(gè)應(yīng)用程序停止運(yùn)行,例如用戶從一個(gè)主頁切換到另一個(gè)主頁第15頁共42頁變化。J2MEWirelessToolkit(J2MEWTK)是Sun公司所發(fā)布的官方版MIDP應(yīng)用程序開發(fā)工具,它為編寫和測試M工DP應(yīng)用程序提供了一個(gè)完整的開發(fā)環(huán)境。所必需的開發(fā)配套元件。成了預(yù)驗(yàn)步驟)、打包、模擬運(yùn)行的菜單(或按鈕),以及其它輔助工具。J2SE我們來安裝制作JAVA所必需的開發(fā)配套元件J2SESDK。先打開讀完協(xié)議后,選中[Accept]然后再點(diǎn)擊[Continue]。試著點(diǎn)擊[WindowsInstallation,Multi-language],來下載安裝程序。接下來,選擇要安裝的程序和安裝到的地址。這里安裝的程序就用默認(rèn)的程序,安裝地址也用默認(rèn)的[c:\j2sdk1.4.2_05\]。設(shè)定數(shù)據(jù)庫文件夾,這里我們也用默認(rèn)的設(shè)置。點(diǎn)擊[Next],便開始安裝擊桌面上“我的電腦”圖標(biāo),在顯示選單中選擇“屬性”。第16頁共42頁境變量設(shè)定窗口。件夾里“bin”文件夾的路徑。這里設(shè)定為[c:\j2sdk1.4.2_05\bin]。輸完后點(diǎn)擊“確下面就讓我們來安裝手機(jī)Java開發(fā)元件J2MEWirelessToolkit。打開[Download]按鍵??赐旰筮x擇[Accept],然后點(diǎn)擊[Continue]。于是顯示安裝程序選擇畫面,點(diǎn)擊[WindowsPlatform]的安裝程序,并下載。出現(xiàn)WirelessToolkit的安裝畫面。選擇[Next]。設(shè)定正在安裝的J2SDK的路徑。這里點(diǎn)擊剛才安裝J2SESDK的[Browse..]鍵,設(shè)定[c:\j2sdk\1.4.2_05],設(shè)定完后,點(diǎn)擊[Next]。接下來設(shè)定安裝WirelessToolkit的文件夾。這里使用預(yù)設(shè)的[c:WTK104],在程序文件夾進(jìn)行注冊,這里使用預(yù)設(shè)的[J2MEWirelessToolkit1.0.4_01],然后點(diǎn)擊[Next]。然后是設(shè)定的確認(rèn)畫面。若確認(rèn)正確,點(diǎn)擊[Next]。安裝完畢后點(diǎn)擊[Finish]鍵,結(jié)束安裝。Java手機(jī)游戲的真實(shí)運(yùn)行環(huán)境是Java手機(jī)。一般來說,Java游戲的開發(fā)是先在第17頁共42頁為《是男人就撐過30秒》,雖然看似簡單,但絕對有挑戰(zhàn)性!這是總結(jié)了無數(shù)色的小點(diǎn)向小飛船聚集過來,小飛船憑借速度優(yōu)勢和飛行技術(shù)從黃點(diǎn)之間的夾縫中飛過,之后又落入新的包圍圈中,直至被黃點(diǎn)擊毀。堅(jiān)持的時(shí)間越長,就說明水平越高。持續(xù)不同的時(shí)間會(huì)得到不同的評價(jià)。如圖4-1所示是它原來的游戲畫面戲畫面。的手機(jī)游戲設(shè)計(jì)經(jīng)驗(yàn),利用J2ME來可以實(shí)現(xiàn)游戲的功能。根據(jù)己往的設(shè)計(jì)進(jìn)度,一款小型規(guī)模的手機(jī)游戲大概有2000~3000行代碼。于操作[12]。在進(jìn)入游戲之前先顯示閃屏圖片,當(dāng)用戶按下鍵盤或等待3秒后,進(jìn)入游戲菜單。初始情況下,游戲菜單有三個(gè)選項(xiàng),它們分別是開始游戲,游戲說明和高分記錄。選擇開始新游戲則進(jìn)入游戲,在游戲中如果按下非游戲鍵盤則中斷游戲返回菜單,此時(shí)菜單中增加了一個(gè)繼續(xù)游戲的選項(xiàng),可以返回游戲也可第18頁共42頁以重新開始新的游戲。當(dāng)游戲結(jié)束時(shí)則進(jìn)入游戲結(jié)束屏幕,屏幕上顯示了玩家的成績和等級,以及游戲的最好成績,如果當(dāng)前成績是最好成績,則手機(jī)震動(dòng)并播放音樂慶祝成功。在菜單中選擇游戲說明或者高分紀(jì)錄,則進(jìn)入相應(yīng)的屏幕,它們都能用“后退”軟鍵返回菜單。菜單中的退出選閃屏閃屏新游戲游戲說明最高記錄繼續(xù)游戲游戲游戲結(jié)束游戲成績等級最好成績游戲說明最高記錄圖4-3游戲系統(tǒng)流程圖程序中一個(gè)有10個(gè)類,其中MIDlet主類負(fù)責(zé)各個(gè)屏幕的切換,它們是閃屏屏幕、菜單、介紹屏幕、高分屏幕、游戲屏幕,游戲結(jié)束屏幕。游戲中使用到(逃亡小飛機(jī))。程序的類結(jié)構(gòu)如圖4-4所示。Snnn圖4-2游戲總體類圖第19頁共42頁游戲的線程主要由三個(gè)部分組成:檢測鍵盤輸入(與玩家交互),更新游戲場景(處理游戲邏輯),繪制游戲畫布?;旧纤械?D游戲都可以按照這三個(gè)模塊來設(shè)計(jì),三個(gè)模塊相互聯(lián)系又互相聯(lián)系,按照模塊的思想來實(shí)現(xiàn)游戲線程將更加面向?qū)ο蠛捅阌诶斫狻H绻绦蜻\(yùn)行快于預(yù)期速度會(huì)使玩家感覺到抖動(dòng),從而影響游戲效果,因此還需要檢測每幀的運(yùn)行時(shí)間,如果過快則等待檢測鍵盤輸入檢測鍵盤輸入更新游戲場景繪制緩沖區(qū)到否掛起當(dāng)前線程是掛起等待預(yù)期速度繪制游戲畫布逃亡者游戲一共實(shí)現(xiàn)了幾個(gè)類包括用于關(guān)于游戲外部的閃屏類、菜單類、高分屏幕類、簡介屏幕類、結(jié)束屏幕類,以及用于游戲本身的游戲畫布類、子詳情見附錄。J2MEWirelessToolkit能自動(dòng)對MIDlet套件進(jìn)行打包。打包產(chǎn)生兩個(gè)文件,即一個(gè)MIDlet描述符manifest.mf和一個(gè)MIDlet套件JAR。描述符是一個(gè)小文本文件,包含有關(guān)MIDlet套件的信息。JAR包含組成MIDlet套件的類文件和資源。第20頁共42頁圖4-6游戲運(yùn)行畫面(一)圖4-7游戲運(yùn)行畫面(二)圖4-8游戲結(jié)束畫面第21頁共42頁第五章結(jié)束語本文以基于J2ME平臺(tái)的手機(jī)游戲的功能開發(fā)為線索,進(jìn)行了相關(guān)理論研究,實(shí)驗(yàn)和項(xiàng)目開發(fā)。首先介紹了J2ME的用途和基于J2ME平臺(tái)手機(jī)開發(fā)的國內(nèi)外發(fā)展情況,然后研究介紹了J2ME平臺(tái)的特點(diǎn)和手機(jī)游戲開發(fā)的關(guān)鍵知識1.研究介紹了J2ME平臺(tái)的用途和基于J2ME平臺(tái)手機(jī)開發(fā)的國內(nèi)外發(fā)展情2.研究介紹了J2ME平臺(tái)的特性和體系結(jié)構(gòu)。重點(diǎn)介紹了MIDP類庫,應(yīng)用游戲角色及游戲流程的控制,對游戲按鍵事件的處理,并對整個(gè)游戲開發(fā)過程第22頁共42頁電子文檔,2005-9-5[2]林邦杰·Java程序設(shè)計(jì)入門教程·中國青年出版社,2001-9-15[16]溫尚書·J2ME無線通信實(shí)用案例教程·清華大學(xué)出版社[18]H.M.Deitel、P.J.Deitel-程序設(shè)計(jì)教程·清華大學(xué)出版社第23頁共42頁首先感謝我的指導(dǎo)老師羅奇導(dǎo)師,他在我的畢業(yè)設(shè)計(jì)過程中提出了指導(dǎo)性的方案和架構(gòu),特別是指引我閱讀相關(guān)的資料和書籍,使我更能迅速學(xué)習(xí)掌握知識并完成了這個(gè)畢業(yè)感謝答辯組對本畢業(yè)設(shè)計(jì)的考核,如果可以得到各位專家的認(rèn)可將對我的學(xué)習(xí)和工作給予極大的鼓勵(lì)。你們客觀的評價(jià)和建議我將牢記在心,在今后的發(fā)展中揚(yáng)長避短,更加努力的嚴(yán)格要求自己。感謝學(xué)校對我的培育,讓我從思想上素質(zhì)上知識上得到很大的提高,本科學(xué)習(xí)中的各科老師的悉心教導(dǎo)讓我掌握了基本知識.感謝我的同學(xué)在設(shè)計(jì)完成前后對我的得力幫助,沒有同學(xué)的共同學(xué)習(xí)進(jìn)步也許就沒法完成設(shè)計(jì),沒有同學(xué)對程序的測試,也許就難以發(fā)現(xiàn)一些潛在的錯(cuò)誤,在此一并表示感在此一并祝愿學(xué)校領(lǐng)導(dǎo)、老師、同學(xué)工作順利,事業(yè)更上一層樓;同時(shí)也祝愿學(xué)校更加輝煌。第24頁共42頁附錄根據(jù)詳細(xì)設(shè)計(jì)對各個(gè)類進(jìn)行編碼實(shí)現(xiàn):MIDlet被用作一個(gè)狀態(tài)機(jī)來管理各種屏幕以及它們之間的轉(zhuǎn)換。例如,當(dāng)顯示splash屏幕時(shí),該類和類SplashScreen(通過方法splashScreenPainted和splashScreenDone)共同在方法init中完成背景初始化。而使用方法readRecordStore和writeRecordStore在一個(gè)名為"BESTTIME"的記錄存儲(chǔ)區(qū)中保存最高得分。(1)實(shí)現(xiàn)閃屏Displayablecurrent=Display.getDisplay(this).getCurrent();/獲得關(guān)于顯示的設(shè)備上下文Display.getDisplay(this).setCurrent(newSplashScmyCanvas.start();//重新開Display.getDisplay(this).setCurrent(current);//顯示游戲畫布內(nèi)容關(guān)于閃屏實(shí)現(xiàn)的代碼如下:newThread(this).start();//啟動(dòng)幕后的初始化線程init();//調(diào)用初始化方法privatesynchronizedvoidiif(!initDone)//如果還沒有初始化完畢{SoundEffects.getInstance(;//獲得聲音效果類的唯一實(shí)例MenuList(this);//初始化菜單標(biāo)志位為真表示初始化完畢}第25頁共42頁init();//檢測是否初始化完畢,如果沒有繼續(xù)初始化Display.getDisplay(this).setCurrent(menuList);//在屏幕上顯示游戲菜單}(2)屏幕切換從菜單中選擇開始游戲,首先初始化Canvas的游戲數(shù)據(jù),顯示游戲畫布,然后啟動(dòng)游戲線程:{myCanvas.init();//初始化游戲數(shù)據(jù)Display.getDisplay(this).setCurrent(myCanvas);//顯示游戲畫布myCanvas.start();//啟動(dòng)游戲線程}從菜單中選擇顯示高分紀(jì)錄,注意每次都動(dòng)態(tài)生成一個(gè)高分紀(jì)錄屏幕,使用完后就會(huì)銷毀以避免在不使用的時(shí)候占用堆內(nèi)存:Display.getDisplay(this).setCurrent(newHighScoreScreen(this));//顯示高分紀(jì)錄屏幕從菜單中選擇游戲說明,和選擇顯示高分紀(jì)錄類似:Display.getDisplay(this).setCurrent(newInstructionsScreen(this));/顯示游戲介紹屏幕游戲如果中斷,從菜單中選擇繼續(xù)游戲,顯示游戲畫布并重啟游戲線程:{Display.getDisplay(this).setCurrent(myCanvas);//顯示游戲畫面myCanvas.start);//啟動(dòng)游戲線程從菜單中選擇退出,調(diào)用quit方法:{quit();//退出游戲從游戲介紹退回菜單,將顯示權(quán)交還游戲菜單:{Display.getDisplay(this).setCurrent(menuList);//顯示游戲菜單}從高分榜退回菜單,將顯示權(quán)交還游戲菜單:{Display.getDisplay(this).setCurrent(menuList);//顯示游戲菜單}從游戲中切換到菜單,需要中止游戲線程并且告知菜單游戲正在進(jìn)行中,以便讓菜單添加繼續(xù)游戲的選項(xiàng):myCanvas.stop();//暫停游戲線程menuList.setGameActive(true);//告知菜單游戲已經(jīng)開始(暫停狀態(tài))Display.getDisplay(this).setCurrent(menuList);//顯示游戲菜單第26頁共42頁}顯示游戲結(jié)束畫面,需要告訴GameOverScreen類當(dāng)前的最好成績以及子彈的數(shù)目,同時(shí)告訴菜單游戲已經(jīng)結(jié)束:voidGameCanvasGameOver(longtime,intBULLETS_NUM){myCanvas.stop();//中止游戲線程menuList.setGameActive(false);//告知游戲已經(jīng)結(jié)束Display.getDisplay(this).setCurrent(newGameOverScreen(this畫面從游戲結(jié)束畫面返回,在屏幕上顯示菜單:Display.getDisplay(this).setCurrent(menuList);/顯示游戲菜單}讀取方法的代碼如下:privatevoidreadRecordStore()hasBestTime=false;/讀取記錄還沒有獲得最好成績DataInputStream{rs=RecordStore.openRecordStore(RS_NAME,false);//記錄名為RS_NAME的字符串bais=newByteArrayInputSdis=newDataIn}}catch(RecordStoreExceptionex)//捕獲讀取存儲(chǔ)記錄異常{catch(IOException第27頁共42頁{除了讀取存儲(chǔ)之外,如果游戲產(chǎn)生了一個(gè)最新成績,還需要保存到數(shù)據(jù)存儲(chǔ)中去。保存方rivatevoidwriteRecordStore(){RecordStorers=null;ByteArrayOutputStreambaos=null;{rs=RecordStore.openRecordStore(RS_NAME,true);//帶開數(shù)據(jù)存儲(chǔ)存如果不存在則創(chuàng)建baos=newByteArrayOutputStream();//輸出字節(jié)流dos=newDataOutputStream(byte[]data=baos.toByteAr{}{rs.setRecord(1,data,0,data.length);//如果存在記錄,則將第一條設(shè)置為當(dāng)前最佳成績//捕獲IO異常}catch(RecordStoreException//捕獲數(shù)據(jù)存儲(chǔ)異常畢業(yè)設(shè)計(jì)(論文)第28頁共42頁/捕獲IO異常{rs.closeRecordStore();//關(guān)閉數(shù)據(jù)存儲(chǔ)}//捕獲數(shù)據(jù)存儲(chǔ)異常獲得最佳成績并保存的實(shí)現(xiàn)代碼如下:booleancheckBestTime(longtime)if(!hasBestTime||(time>bestTime)//如果還沒有最好成績或者當(dāng)前成績比最好成績長的時(shí){returntrue;//返回true表明對最好成績進(jìn)行了更新操作}{returnfalse;//返回false表明沒有最新的成績紀(jì)錄產(chǎn)生kkf在生成最好成績之后(無論是讀取存儲(chǔ)或者玩家在游戲中動(dòng)態(tài)產(chǎn)生的),就需要讓游戲結(jié)束屏幕或者高分榜知道這個(gè)最好成績:第29頁共42頁returnhasBestTime?bestTime:-1;游戲的暫停、退出代碼如下:{Displayablecurrent=Display.getDisplay(this).getCurrent();//獲得當(dāng)前設(shè)備的顯示上下文myCanvas.stop();//中止游戲線程myCanvas.stop();//在銷毀程序之前先停止游戲線程notifyDestroyed();//告知系統(tǒng)已經(jīng)銷毀程序,可以完全退出}MIDlet中實(shí)現(xiàn)了根據(jù)字符串類型的文件名來加載圖片資源的通用方法,其他各個(gè)類都可以returnimage;//返回圖片對象image}其代碼如下:(mills代表持續(xù)的時(shí)間。)Display.getDisplay(this).vibrate(millis);//手機(jī)震動(dòng),持續(xù)時(shí)間為milliDisplay.getDisplay(this).flashBacklight(millis);//手機(jī)背景光閃爍,持續(xù)時(shí)間為millis}2.游戲閃屏SplashScreen類的實(shí)現(xiàn)Splash屏幕在屏幕中央顯示圖像。在第一次繪制屏幕后,它將圖像釋放作為垃圾回收(把圖片設(shè)為null)并回調(diào)MIDlet進(jìn)行初始化工作。三秒鐘后或第一次按鍵后,它再次回調(diào)第30頁共42頁SplashScreen類是一個(gè)Canvas類的子類,它的構(gòu)造函數(shù)先獲得一個(gè)對主類的引用,以便于回調(diào)主類的方法,然后加載閃屏圖片splash.png,并啟動(dòng)閃屏線程。{splashlmage=escapeeMIDlet.crnewThread(this).start();閃屏屏幕的繪制是在paint方法中完成,當(dāng)顯示閃屏?xí)r會(huì)自動(dòng)調(diào)用paint方法。注意下面是繪制具有輪廓的文本的有用訣竅:首先用輪廓顏色把它繪制四次,分別向上、下、左、右偏移,然后在它的正常位置用文本顏色對其繪制。在游戲主屏幕中使用該方法要小心,因?yàn)槲谋纠L制可能很慢,而該方法使速度減慢為原來的五分之一。publicvoidpaint(Graphicsg)intCanvasWidth=getWidthOintCanvasHeight=get{g.drawlmage(splashlmage,CanvasWidfg.setFont(Font.getFont(Font.FACE_PROPORTIONdrawText(g,centerX,centerY-1);//分別繪制四次,相差1個(gè)象素,呈現(xiàn)文本帶有背景的感覺drawText(g,centerX,centerY);//繪制文本midlet.splashScreenPainted();//回調(diào)midlet的方法,通知程序在幕后做初始化之inttopY=centerY-textHeight/2;//topY用于定位文本的合適位置g.drawString("版本:"+midlet.getAppProperty("McenterX,topY+fontHeight,Graphics.H}第31頁共42頁(3)閃屏線程閃屏線程的主要工作為接受玩家鍵盤事件退出或者等待3秒退出,代碼如下:{wait(3000L);//等待3秒{//捕獲線程中斷異常(4)結(jié)束線程有兩種可能會(huì)結(jié)束閃屏線程,一為在run方法中線程等待3秒后調(diào)用,二為玩家按下鍵盤,觸發(fā)鍵盤事件,調(diào)用keyPressed方法,在這個(gè)方法中結(jié)束閃屏線程。dimiss方法如下,它將回調(diào)midlet的splashScreenDone方法,顯示游戲菜單:privatevoiddisnmisS(3.游戲菜單MenuList類的實(shí)現(xiàn)菜單列表是在splash屏幕之后,或者游戲結(jié)束時(shí),或者游戲中用戶按下一個(gè)非游戲鍵時(shí)(從而暫停了游戲)顯示的屏幕。(1)構(gòu)造函數(shù)MenuList類是List類的子類,并且實(shí)現(xiàn)了CommandListener接口,它的構(gòu)造函數(shù)為,首先它實(shí)現(xiàn)List類的構(gòu)造函數(shù),然后添加了三個(gè)基本選項(xiàng)以及Command:super("逃亡者",List.IMPLICIT);//實(shí)現(xiàn)父類List的構(gòu)造方法,指定List名和選擇方式append("開始新游戲",null);/添加新游戲選項(xiàng)(2)繼續(xù)游戲選項(xiàng)當(dāng)游戲中間被玩家中止時(shí),游戲菜單中將會(huì)多一個(gè)“繼續(xù)游戲”的選項(xiàng),這個(gè)選項(xiàng)添加與否取決于外部傳入的布爾值和gameActive值,前者為外部通知菜單游戲是否運(yùn)行,后者和繼續(xù)游戲選項(xiàng)是否存在對應(yīng)(初始情況下為false)。第32頁共42頁voidsetGameActive(booinsert(0,"繼續(xù)游戲",null);//在選項(xiàng)頂部插入繼續(xù)游戲選項(xiàng)ff之(3)處理事件游戲菜單的事件處理包括兩種,一種是Command觸發(fā)的事件,這里為退出程序,另一種是菜單選項(xiàng)的處理處理方式,根據(jù)選擇不同回調(diào)midlet的相應(yīng)方法,讓midlet來負(fù)責(zé)屏幕的切換。publicvoidcommandAction(Commandc,Displayabled)if(index!=-1)//shouldneverbe-1if(!gameActive)//如果不存在繼續(xù)游戲選項(xiàng),則序號往后移位,以便和case選項(xiàng)對應(yīng)midlet.menuListHighmidlet.menuListInstru//按照邏輯不可能出現(xiàn)這種情況4高分屏幕HighScoreScreen類的實(shí)現(xiàn)最高得分屏幕用來顯示當(dāng)前最高得分(到目前為止的最好成績)第33頁共42頁HighScoreScreen類是Form的子類,并且實(shí)現(xiàn)了CommandListener接口,其構(gòu)造函數(shù)在Form上添加了當(dāng)前最好成績的字符串組件Stringltem以及添加了返回菜單的軟鍵。HighScoreScreen(escapeeMIDlet{super("最好成績");//實(shí)現(xiàn)父類的構(gòu)造函數(shù),指定Form的名稱longbestTime=midlet.getBestTime();//從midlet中獲取最好成績floatBestTime_Second=(float)bestTime/1000;//將成績轉(zhuǎn)化為以秒為單位(原來是毫秒)Stringtext=(bestTime==-1)?"目前還沒有,期待您的表現(xiàn)哦!"http://判斷是否存在這個(gè)成績當(dāng)玩家按下返回軟鍵后,將回調(diào)midlet類的highScoreBack,顯示游戲菜單。{}5.子彈Bullets類的實(shí)現(xiàn)(1)構(gòu)造函數(shù)由于Bullets類繼承了Sprite類,因此在Bullets的構(gòu)造函數(shù)中必須實(shí)現(xiàn)Sprite類的構(gòu)造函數(shù),也就是調(diào)用super語句。構(gòu)造函數(shù)還用來獲取必要參數(shù)例如幀的寬度和高度,以及定位精靈的參考點(diǎn)等簡單的操作。構(gòu)造函數(shù)的代碼如下:defineReferencePixel(frameWirandom-newRandom);(2)設(shè)置參數(shù)為了讓Bullets類更加面向?qū)ο螅@里還定義了兩個(gè)public方法,外部類可以調(diào)用這兩個(gè)方法來設(shè)置子彈的數(shù)目,以及畫布的寬度和高度,這兩個(gè)方法非常簡單。這兩個(gè)方法代this.BULLETS_NUM=BU}this.CanvasWidth=Cathis.CanvasHeight=Can}下面的代碼將初始化一個(gè)子彈的所有初始屬性:bullets[i][0]=(random.nextInt()&0x7ffffff)%4;//采用隨機(jī)值取子彈的類型,范圍為[0,3](包含端點(diǎn))caseBULLET_TYPE_LEFT://子彈類型為從屏幕左方飛入bullets[i][1]=-frameWidth;//子彈的x坐標(biāo)為較小的負(fù)數(shù)(屏幕左邊)bullets[i][2]=(random.nextInt()&0x7ffffff)%CanvasHeight;/隨機(jī)取子彈的y坐標(biāo)(0~bullets[i][3]=(random.nextInt()&0x7ffff)%3+1;//隨機(jī)取子彈x方向的速度,范圍為第34頁共42頁bullets[i][4]=(random.nextInt()%3;//隨機(jī)取子彈y方向的速度,范圍為[-2,2]bullets[i][1]=CanvasWidth+frameWidth;//子彈的x坐標(biāo)為略大于屏幕寬度的正數(shù)(屏幕右bullets[i][2]=(randobullets[i][3]=((random.nextInt()&0x7ffffff)%3+1//隨機(jī)取子彈x方向的速度,范圍為[-3,-1]之間bullets[i][4]=(random.nextInt())%3;//隨機(jī)取子彈y方向的速度,范圍為[-2,2]bullets[i][1]=(random.nextInt()&0x7ffffff)%Canva//隨機(jī)取子彈的x坐標(biāo)為[0,CanvasWidth]之間的正數(shù)坐標(biāo)為一個(gè)較小的負(fù)數(shù)(處于屏幕上方)bullets[i][3]=(random.nextInt())%3;//隨機(jī)取子彈x方向上的速度范圍為[-2,2]之間bullets[i][1]=(random.nextInt()&0x7ffffff)%Canva//隨機(jī)取子彈的x坐標(biāo)為[0,CanvasWidth]之間的正數(shù)bullets[i][2]=CanvasHeight+frame//子彈的y坐標(biāo)為一個(gè)略大于屏幕高度的正數(shù)數(shù)(處于屏幕下方)bullets[i][3]=(random.nextInt()%3;//隨機(jī)取子彈x方向上的速度范圍為[-2,2]之間bullets[i][4]=((random.nextInt()&0x7fffffff)%3+1//隨機(jī)取子彈y方向的速度,范圍為[-3,-1]之間}使用上面的方法可以隨機(jī)設(shè)置子彈的位置和速度,使得這些子彈具有一點(diǎn)人工智能的色彩,但是有些情況下,某個(gè)方向的速度會(huì)出現(xiàn)0的情況,也就是子彈沿著x方向或者y方向移動(dòng),影響了子彈隨機(jī)運(yùn)動(dòng)的視覺效果,為了避免這種情況的發(fā)生,將檢測子彈某方向速度出現(xiàn)0的情況,并且給該方向設(shè)置一個(gè)默認(rèn)速度,修正子彈運(yùn)行軌跡的代碼如下:if(bullets[i][3]==0)//如果子彈的x方向{if(bullets[i][0]=BULLET_TYPE_RIGHT|bullets[i][bullets[i][3]=-DEFAULT_SPEED;//根據(jù)子彈類型設(shè)置x方向上}if(bullets[i][4]==0)//如果子彈的y方向上的速度為0{if(bullets[i][0]=BULLET_TYPE_RIGHT|bullets[i][bullets[i][4]=-DEFAULT_SPEED;//根據(jù)子彈類型設(shè)置y方向上速度為默認(rèn)值elsebullets[i][4]=DEFAULT_SPEED;}上面已經(jīng)初始化了一顆子彈的屬性,對于屏幕上的多個(gè)(數(shù)目為BULLETS_NUM)子彈,可以使用遍歷數(shù)組的方法來一一設(shè)定:}第35頁共42頁子彈運(yùn)動(dòng)的代碼如下:privatevoidtick(inti){bullets[i][1]+=bullets[i][3];//x方向上根據(jù)初始位置和速度進(jìn)行移動(dòng)bullets[i][2]+=bullets[i][4];/y方向上根據(jù)初始位置和速度進(jìn)行移動(dòng)if(bullets[i][1]<-5||bullets[i][1]>CanvasWidth+5){//當(dāng)超出屏幕的左右邊界時(shí)bullets[i][3]*=-1;//x方向的速度取反}if(bullets[i][2]<-5||bullets[i][2]>CanvasHeight+5){//當(dāng)超出屏幕的上下邊界時(shí)bullets[i][4]*=-1;//y方向的速度取反和子彈的初始化一樣,上面的代碼完成了第i顆子彈的運(yùn)動(dòng),想要所有的子彈運(yùn)動(dòng)起來,只要遍歷子彈數(shù)組,對所有子彈做相同處理即可:tick(i);//遍歷子彈數(shù)組,移動(dòng)所有子彈}(5)子彈的繪制繪制所有子彈的代碼如下:for(inti=0;i<bullets.length;i++){//遍歷子彈數(shù)組,繪制每顆子彈if(bullets[i][5]!=ALIVE){//如果子彈處于非激活狀態(tài),則跳過}draw(g,i);//繪制第i顆子彈(6)碰撞檢測在游戲的運(yùn)行中,始終要檢測子彈和逃亡飛機(jī)是否發(fā)生碰撞,這里使用Sprite類的collidesWith方法來檢測精靈與精靈之間的碰撞。飛機(jī)為不規(guī)則形體,因此這里使用的是象素級碰撞檢測。if(bullets[i][5]!=ALIVE){//如果子彈處于非激活狀態(tài)則進(jìn)行下一輪循環(huán)}setPosition(bullets[i][1],bullets[i][2]);//將子彈設(shè)置到子彈數(shù)組所指定位置returnfalse;//如果未發(fā)生碰撞,則返回falsef6.逃亡飛機(jī)Escapee類的實(shí)現(xiàn)(1)定義變量下面將用代碼實(shí)現(xiàn)飛機(jī)的基本功能,在此之前先定義以下一些變量或者常量:第36頁共42頁privateintCanvasWidth,CanvasHeight;//畫布的寬度和高度(2)初始化飛機(jī)的初始化分為幾個(gè)小方法,需要初始化的內(nèi)容為游戲幀的寬度和高度、畫布的寬度和高度、定義參考點(diǎn)、設(shè)置生命(是否存活)以及設(shè)置初始幀publicEscapee(Imageimage,intframeWidth,intframeHeight)super(image,frameWidth,frameHeight);//實(shí)現(xiàn)Sprite精靈類的構(gòu)造函數(shù)一0this.CanvasHeight=CanvasHeight;//獲得屏幕的高度}于飛機(jī)是否存活提供了兩個(gè)方法供外部設(shè)置和查詢:}(4)飛機(jī)移動(dòng)move(0,-SPEED);//調(diào)用move方法向上移動(dòng)坐標(biāo),每次移動(dòng)幅度為SPEED個(gè)象素if(getY(<0)setPosition(getX(),0);//如果到達(dá)上邊界(y坐標(biāo)為0)則停止不動(dòng)move(0,SPEED);//調(diào)用move方法向下移動(dòng)坐標(biāo),每次移動(dòng)幅度為SPEED個(gè)象素//如果到達(dá)下邊界(y坐標(biāo)靠近CanvasHeight)則停止不動(dòng)if(getY()>CanvasHeight-frameHeight)setPosition(getX(),Canv}if(direction==LEFT{//如果方向向左第37頁共42頁//如果到達(dá)左邊界(x坐標(biāo)靠近0)則停止不動(dòng)move(SPEED,0);//調(diào)用move方法向右移動(dòng)坐標(biāo),每次移動(dòng)幅度為SPEED個(gè)象素//如果到達(dá)右邊界(x坐標(biāo)靠近CanvasWidth)則停止不動(dòng)if(getXO>CanvasWidth-frameWidth)setPosition(CanvasWi}(5)幀的設(shè)置if(!isMove)setFrame(O);//設(shè)置游戲幀為0}7.游戲畫布escapeeCanvas類的實(shí)現(xiàn)(1)游戲變量staticfinalintUP=0;//代表玩家按下了游戲上鍵staticfinalintLEFT=1;//代表玩家按下了游戲左鍵staticfinalintDOWN=2;//代表玩家按下了游戲下鍵staticfinalintRIGHT=3;//代表玩家按下了游戲右鍵privateTiledLayerbackground;//TiledLayer類對象,代表游戲背景privateEscapeeescapee;//Escapee類的對象privateintCanvasWidth=gprivateImageimage;//Image對象,用來加載圖片資源privatestaticfinalintMILLIS_PER_TICK=50;//每個(gè)tick的毫秒時(shí)間privatebooleanisprivatebooleanisCollidesWith=false;//是否玩家飛機(jī)和子彈碰撞privatelonggameDuration=0;//游戲的持續(xù)時(shí)間privatevolatileThreadanimationThread=null;/游戲線程(2)構(gòu)造函數(shù)escapeeCanvas(escape{super(true);//抑制非游戲鍵盤}(3)加載游戲資源畢業(yè)設(shè)計(jì)(論文)第38頁共42頁intbackColumns=CanvasWidth/image.getWidth()+1;//計(jì)算地圖數(shù)組的列數(shù)intbackRows=CanvasHeight/image.getHeight()+1;/計(jì)算地圖數(shù)組的行數(shù)backgroundnewTiledLayer(backColumns,backRows,image,image.getWidth(for(inti=0;i<backColumns*bac{background.setCell(x,y,1);//填充地圖數(shù)組,這里只有一張圖片}飛機(jī)類Escapee
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年玉林貨運(yùn)從業(yè)資格仿真考題
- 2024商標(biāo)轉(zhuǎn)讓及品牌升級合同:攜手共進(jìn)品牌升級之旅3篇
- 2024商混合同范本:商混混凝土生產(chǎn)與質(zhì)量控制合作協(xié)議3篇
- 2025廚房設(shè)備銷售合同版
- 商業(yè)綜合體電力施工合同范本
- 城市公園旁咖啡館租賃合同
- 城市綠化帶擴(kuò)建植樹合同
- 出入境文件公證辦理規(guī)范
- 智能家居維修員招聘合同模板
- 汽車研發(fā)中心施工協(xié)議
- 鈸式換能器的共振特性研究
- 《我們?nèi)タ春!烽喿x答案
- 智慧酒店無人酒店綜合服務(wù)解決方案
- 考研英語一新題型歷年真題(2005-2012)
- 健身房會(huì)籍顧問基礎(chǔ)培訓(xùn)資料
- 9脊柱與四肢、神經(jīng)系統(tǒng)檢查總結(jié)
- 秀場內(nèi)外-走進(jìn)服裝表演藝術(shù)智慧樹知到答案章節(jié)測試2023年武漢紡織大學(xué)
- 【高分復(fù)習(xí)筆記】王建《現(xiàn)代自然地理學(xué)》(第2版)筆記和課后習(xí)題詳解
- TSGD0012023年壓力管道安全技術(shù)監(jiān)察規(guī)程-工業(yè)管道(高清晰版)
- SMM英國建筑工程標(biāo)準(zhǔn)計(jì)量規(guī)則中文 全套
- 2023-2024學(xué)年浙江省富陽市小學(xué)數(shù)學(xué)四年級上冊期末通關(guān)題
評論
0/150
提交評論