基于J2ME的手機游戲逃亡者的設(shè)計與實現(xiàn)_第1頁
基于J2ME的手機游戲逃亡者的設(shè)計與實現(xiàn)_第2頁
基于J2ME的手機游戲逃亡者的設(shè)計與實現(xiàn)_第3頁
基于J2ME的手機游戲逃亡者的設(shè)計與實現(xiàn)_第4頁
基于J2ME的手機游戲逃亡者的設(shè)計與實現(xiàn)_第5頁
已閱讀5頁,還剩67頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

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

溫馨提示

  • 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)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論