俄羅斯方塊手機(jī)游戲的設(shè)計(jì)與實(shí)現(xiàn)_第1頁
俄羅斯方塊手機(jī)游戲的設(shè)計(jì)與實(shí)現(xiàn)_第2頁
俄羅斯方塊手機(jī)游戲的設(shè)計(jì)與實(shí)現(xiàn)_第3頁
俄羅斯方塊手機(jī)游戲的設(shè)計(jì)與實(shí)現(xiàn)_第4頁
俄羅斯方塊手機(jī)游戲的設(shè)計(jì)與實(shí)現(xiàn)_第5頁
已閱讀5頁,還剩17頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、22/22俄羅斯方塊手機(jī)游戲的設(shè)計(jì)與實(shí)現(xiàn)摘要J2ME(Java 2 Micro Edition) 是近年來隨著各種不同設(shè)備,尤其是移動(dòng)通信設(shè)備的飛速發(fā)展而誕生的一項(xiàng)新的開發(fā)技術(shù)。它定位在消費(fèi)性電子產(chǎn)品的應(yīng)用上,對(duì)設(shè)備的智能化、多樣化,提供了革命性的解決方案。隨著手機(jī)的日益普及、Java功能在移動(dòng)設(shè)備上的實(shí)現(xiàn),Java應(yīng)用程序產(chǎn)生的手機(jī)增值服務(wù)逐漸體現(xiàn)出其影響力,對(duì)豐富人們的生活內(nèi)容、提供快捷的資訊起著不可忽視的作用。本游戲就是針對(duì)J2ME平臺(tái),開發(fā)出能在支持java手機(jī)上運(yùn)行的俄羅斯方塊游戲,具有高移植性。同時(shí)它的操作簡(jiǎn)單,可玩性高,是一款老少皆宜的游戲。b5E2RGbCAP本論文介紹了J2M

2、E的相關(guān)技術(shù)及本程序的開發(fā)流程和具體功能的實(shí)現(xiàn)。關(guān)鍵字JAVA J2ME 手機(jī)游戲1.緒 論1.1 傳統(tǒng)手機(jī)游戲的利弊在信息社會(huì)中,手機(jī)及其他無線設(shè)備越來越多的走進(jìn)普通百姓的工作和生活,隨著信息網(wǎng)絡(luò)化的不斷進(jìn)展,手機(jī)及其他無線設(shè)備上網(wǎng)絡(luò)勢(shì)在必行。但是傳統(tǒng)手機(jī)存在以下弊端:p1EanqFDPw1. 傳統(tǒng)手機(jī)出廠時(shí)均由硬件廠商固化程序,程序不能增加、刪除,有了錯(cuò)誤也不能更新、修改,若要增加新功能必須另換一部手機(jī)。DXDiTa9E3d2. 傳統(tǒng)手機(jī)訪問互聯(lián)網(wǎng)是通過WAP(Wireless Application Protocal),所有網(wǎng)絡(luò)資源必須接通網(wǎng)絡(luò)才能在線訪問,非常耗時(shí)、費(fèi)用亦很高。RTCr

3、pUDGiT但是Java技術(shù)在無線應(yīng)用方面的優(yōu)勢(shì)非常明顯:1. 應(yīng)用程序可按需下載,而不是購(gòu)買由硬件商提供的套件,可升級(jí)空間大。2. Java技術(shù)提供了一個(gè)類庫(kù),它使的應(yīng)用開發(fā)商可以創(chuàng)建更為直覺、豐富的用戶界面。3. Java技術(shù)使網(wǎng)絡(luò)帶寬的應(yīng)用更為有效,因?yàn)閼?yīng)用程序可以下載到器件上,并在本地運(yùn)行,僅僅是在連接到服務(wù)器時(shí)才會(huì)占用網(wǎng)絡(luò)帶寬。5PCzVD7HxA1.2目前手機(jī)游戲發(fā)展?fàn)顟B(tài)與技術(shù)基于以上分析,Java手機(jī)將是手機(jī)的發(fā)展方向,是業(yè)界的熱點(diǎn)。到目前為止,已經(jīng)有很多手機(jī)支持java了,并且還在快速的增長(zhǎng)?,F(xiàn)在,J2ME已經(jīng)發(fā)展成為一種比較成熟的技術(shù),對(duì)手機(jī)提供的最小平臺(tái)更合理,更實(shí)用。特別

4、是在以前需要廠商特有的API才能支持的功能現(xiàn)在已經(jīng)得到了實(shí)現(xiàn),同時(shí)還擴(kuò)展了原來的 API,增加了游戲開發(fā)方面的API,使游戲開發(fā)更容易,推動(dòng)有手機(jī)游戲的發(fā)展,使更多的大公司轉(zhuǎn)向了手機(jī)游戲的開發(fā)。3D技術(shù)的發(fā)展,3D游戲開發(fā)包API的提供,是java手機(jī)游戲開發(fā)的一種新亮點(diǎn)。jLBHrnAILg1.3選擇本游戲的意義本游戲就是運(yùn)用J2ME技術(shù),開發(fā)的一款俄羅斯方塊小游戲。在以前我們的游戲機(jī),電腦,手機(jī)上都有這個(gè)小游戲,但是他們都是基于固定設(shè)備的,就像以前的手機(jī)上也有俄羅斯方塊游戲,但是那是針對(duì)特殊的手機(jī)開發(fā)上去,并固化在手機(jī)里面的。我做的這個(gè),它可以在支持java的手機(jī)上運(yùn)行,可以上傳到手機(jī),也

5、可以從手機(jī)里刪除。這使得本游戲能廣泛的移植性,使用戶有了更方便的選擇。xHAQX74J0X2可行性分析2.1技術(shù)可行性分析本游戲是基于j2ME的,我們知道,現(xiàn)在J2ME手機(jī)游戲開發(fā)蓬勃發(fā)展,尤其是近幾年來,各種手機(jī)廠商都開始支持它,相應(yīng)的提供了很豐富的開發(fā)包,共游戲開發(fā)使用,簡(jiǎn)化了我們的開發(fā)工作。特別是MIDP2.0中針對(duì)游戲而提供的游戲開發(fā)包,給我們帶來了很大的方便,本游戲就是針對(duì)這個(gè)游戲包開發(fā)的。LDAYtRyKfE2.2操作可行性分析本游戲操作簡(jiǎn)單,界面友好,使人不知不覺得進(jìn)入游戲中。3需求分析俄羅斯方塊是一款風(fēng)靡全球的電視游戲機(jī)和掌上游戲機(jī)游戲,它曾經(jīng)造成的轟動(dòng)與造成的經(jīng)濟(jì)價(jià)值可以說是

6、游戲史上的一件大事。這款游戲最初是由蘇聯(lián)的游戲制作人 Alex Pajitnov 制作的,它看似簡(jiǎn)單但卻變化無窮,令人上癮。究其歷史,俄羅斯方塊最早還是出現(xiàn)在 PC 機(jī)上,而我國(guó)的用戶都是通過紅白機(jī)了解、喜歡上它的。而發(fā)展到現(xiàn)在,遠(yuǎn)航游戲中心又將重新掀起這股讓人沉迷的俄羅斯方塊風(fēng)潮,有單機(jī)作戰(zhàn)與兩人在線對(duì)戰(zhàn)兩種模式。Zzz6ZB2Ltk做為本游戲,由于是第一次做手機(jī)游戲,沒有完成復(fù)雜的網(wǎng)絡(luò)在線對(duì)戰(zhàn)模式,僅僅完成了最基本的單機(jī)模式。與我們常玩的俄羅斯方塊游戲一樣,首先,選擇開始,有下墜物開始下落,同是在傍邊顯示出下一個(gè)下墜物,可以用游戲鍵控制下墜物的左右移動(dòng)、翻轉(zhuǎn)。當(dāng)一行堆滿時(shí)就消去,并給出玩家

7、相應(yīng)的得分并顯示。根據(jù)這個(gè)分析,知道要完成這個(gè)游戲,必須有下墜物對(duì)象,那樣才能進(jìn)行游戲;同時(shí),就必須要有一個(gè)游戲地圖,讓下墜物對(duì)象顯示在地圖上;這樣一來,不管是地圖,還是下墜物都要在屏幕上顯示,就需要一個(gè)畫布,用來顯示。根據(jù)上面的一系列分析知道,要完成本游戲就必須有三個(gè)類,畫布類,地圖類和下墜物類。必須在這三個(gè)類中完成以上的功能才能完成。dvzfvkwMI14 開發(fā)技術(shù)4.1 java語言的特點(diǎn)本游戲應(yīng)用java語言完成的,java語言的特點(diǎn)如下:1. 平臺(tái)無關(guān)性Java引進(jìn)虛擬機(jī)原理,并運(yùn)行于虛擬機(jī),實(shí)現(xiàn)不同平臺(tái)之間的Java接口。Java的數(shù)據(jù)類型與機(jī)器無關(guān)。rqyn14ZNXI2. 安全

8、性Java的編程類似C+,但舍棄了C+的指針對(duì)存儲(chǔ)器地址的直接操作,程序運(yùn)行時(shí),內(nèi)存由操作系統(tǒng)分配,這樣可以避免病毒通過指針入侵系統(tǒng)。它提供了安全管理器,防止程序的非法訪問。EmxvxOtOco3. 面向?qū)ο?Java吸收了C+面向?qū)ο蟮母拍睿瑢?shù)據(jù)封裝于類中,實(shí)現(xiàn)了程序的簡(jiǎn)潔性和便于維護(hù)性,使程序代碼可以只需一次編譯就可反復(fù)利用。SixE2yXPq54. 分布式Java建立在TCP/IP網(wǎng)絡(luò)平臺(tái)上,提供了用HTTP和FTP協(xié)議傳送和接收信息的庫(kù)函數(shù),使用其相關(guān)技術(shù)可以十分方便的構(gòu)建分布式應(yīng)用系統(tǒng)。6ewMyirQFL5. 健壯性Java致力與檢查程序在編譯和運(yùn)行時(shí)的錯(cuò)誤,并自動(dòng)回收內(nèi)存,減少

9、了內(nèi)存出錯(cuò)的可能性。Java取消了C語言的結(jié)構(gòu)、指針、#define語句、多重繼承、goto語句、操作符、重載等不易被掌握的特性,提供垃圾收集器自動(dòng)回收不用的內(nèi)存空間kavU42VRUs4.2 Eclipse與J2ME Wireless Tool Kit完成本游戲應(yīng)用的是eclipse與J2ME Wireless Tool Kit工具的組合。1Eclipse 是一個(gè)開放源代碼的、基于 Java 的可擴(kuò)展開發(fā)平臺(tái)。就其本身而言,它只是一個(gè)框架和一組服務(wù),用于通過插件組件構(gòu)建開發(fā)環(huán)境。幸運(yùn)的是,Eclipse 附帶了一個(gè)標(biāo)準(zhǔn)的插件集,包括 Java 開發(fā)工具(Java Development To

10、ols,JDT)。y6v3ALoS89雖然大多數(shù)用戶很樂于將 Eclipse 當(dāng)作 Java IDE 來使用,但 Eclipse 的目標(biāo)不僅限于此。Eclipse 還包括插件開發(fā)環(huán)境(Plug-in Development Environment,PDE),這個(gè)組件主要針對(duì)希望擴(kuò)展 Eclipse 的軟件開發(fā)人員,因?yàn)樗试S他們構(gòu)建與 Eclipse 環(huán)境無縫集成的工具。由于 Eclipse 中的每樣?xùn)|西都是插件,對(duì)于給 Eclipse 提供插件,以及給用戶提供一致和統(tǒng)一的集成開發(fā)環(huán)境而言,所有工具開發(fā)人員都具有同等的發(fā)揮場(chǎng)所。M2ub6vSTnP這種平等和一致性并不僅限于 Java 開發(fā)工具

11、。盡管 Eclipse 是使用 Java 語言開發(fā)的,但它的用途并不限于 Java 語言;例如,支持諸如 C/C+、COBOL 和 Eiffel 等編程語言的插件已經(jīng)可用,或預(yù)計(jì)會(huì)推出。Eclipse 框架還可用來作為與軟件開發(fā)無關(guān)的其他應(yīng)用程序類型的基礎(chǔ),比如內(nèi)容管理系統(tǒng)。Eclipse 是一個(gè)開放源代碼的、基于 Java 的可擴(kuò)展開發(fā)平臺(tái)。就其本身而言,它只是一個(gè)框架和一組服務(wù),用于通過插件組件構(gòu)建開發(fā)環(huán)境。0YujCfmUCw2WTK(Wireless Tool Kit)是Sun公司針對(duì)J2ME推出的用于手機(jī)和Palm等移動(dòng)設(shè)備的開發(fā)包,是除手機(jī)廠商的專用開發(fā)包外唯一的手機(jī)模擬器開發(fā)包。

12、它通用性高,開發(fā)出的應(yīng)用程序可保證能運(yùn)行在大部分設(shè)備上,而不像專用廠商具有一定的不兼容性。雖然它沒有強(qiáng)大的功能和完善的調(diào)試手段,但它提供運(yùn)行模擬器的最基本組件,是其他IDE需集成采用的必備元素。eUts8ZQVRd4.3開發(fā)工具操作系統(tǒng):Microsoft Windows XP開 發(fā) 包:Java(TM) 2 Standard Edition (5.0) + Sun Micro. J2ME Wireless Tool Kit 2.2 + Eclipse 3. 1sQsAEJkW5T4.4Java Application Manager(JAM)手機(jī)中負(fù)責(zé)調(diào)配程序運(yùn)行資源的管理后臺(tái)是Java A

13、pplication Manager(JAM)。它所使用的傳輸媒體可以是紅外線、網(wǎng)絡(luò)、以及其他可用來傳輸?shù)拿襟w。Java Application Manager(JAM) 會(huì)從網(wǎng)絡(luò)上下載代表該Application Suite 的JAR 檔,接著在手機(jī)上安裝此MIDlet Suite,然后在手機(jī)開始執(zhí)行該應(yīng)用程序。GMsIasNXkA4.5J2ME體系結(jié)構(gòu)J2ME用于為信息家電市場(chǎng)提供應(yīng)用服務(wù),這些信息家電包括呼叫器、移動(dòng)電話、像Palm這樣的個(gè)人數(shù)字助手(PDA)、電視機(jī)頂盒、POS終端以及其他的消費(fèi)電子設(shè)備、而且每一種加點(diǎn)設(shè)備又有不同的特性和界面。TIrRGchYzg為了滿足消費(fèi)者和嵌入式

14、市場(chǎng)不斷發(fā)展和多樣化的需求,J2ME體系結(jié)構(gòu)采用摸快化、可擴(kuò)展的設(shè)計(jì),這種設(shè)計(jì)是通過一個(gè)3層軟件模型來實(shí)現(xiàn)的,該模型構(gòu)建于本地操作系統(tǒng)之上。7EqZcWLZNXJ2ME的3層體系結(jié)構(gòu)依照各種設(shè)備的資源特性,將J2ME技術(shù)架構(gòu)分為簡(jiǎn)表(Profiles)、配置(Configuration)和Java Virtual Machine(JVM)3層,然后在進(jìn)一步細(xì)分,這使J2ME能夠在每一類設(shè)備的限制下工作,而同時(shí)提供最低限度的java語言功能性,如圖:lzq7IGf02EApplication Optional PackagesProfilesConfigurationsJava Virtual

15、MachinesHost Operating SystemzvpgeqJ1hk圖4.5-1 J2ME的體系結(jié)構(gòu)1Java虛擬機(jī)(JVM)層:這一層四針對(duì)設(shè)備本地操作系統(tǒng)定制的java虛擬機(jī)的實(shí)現(xiàn),支持特定的J2ME配置,就像使用所有java技術(shù)一樣,J2ME的核心也在一種虛擬機(jī)中。NrpoJac3v12配置(Configuration)層:面對(duì)的是大量各種不同的小型嵌入式設(shè)備,它們?cè)谕庥^和功能上均各不相同。J2ME將這些設(shè)備進(jìn)行分類,將一些共同性提取出來形成適合于某個(gè)范圍中設(shè)備可用的規(guī)范,稱為“配置”。1nowfTG4KI3簡(jiǎn)表(Profiles)層:簡(jiǎn)表層定義了特定系列設(shè)備上可用的應(yīng)用程序編

16、程接口(API)的最小集。簡(jiǎn)表在一個(gè)特定的配置上面實(shí)現(xiàn)。應(yīng)用程序是針對(duì)特定的簡(jiǎn)表編寫的,因此可以移植到支持該簡(jiǎn)表的任何設(shè)備上。另外,一個(gè)設(shè)備可以同時(shí)支持多個(gè)簡(jiǎn)表。而我們看到最多的就是這一層。fjnFLDa5Zo4.6MIDlet開發(fā)流程編寫MIDlet程序到能夠在物理機(jī)器上或是仿真器上運(yùn)行需要七個(gè)步驟:具體如下:編寫程序原代碼編譯預(yù)先審核(Preverify)編寫描述文件合成jar文件測(cè)試與調(diào)試將程序下載到物理 機(jī)器上運(yùn)行,或使用仿真器來運(yùn)行具體的開發(fā)流程圖如下:編寫程序源代碼(.java)ByteCode(.class)通過預(yù)先審核的 ByteCode(.class)JAR文件(.jar)+

17、描述文件(.jad)描述文件(jad)+類文件(.class)開始編譯預(yù)先審核利用仿真器調(diào)試?yán)梅抡嫫髡{(diào)試編寫描述文件合成單一文件下載到物理機(jī)器運(yùn)行利用仿真器調(diào)試tfnNhnE6e5圖4.6-1 MIDlet開發(fā)流程4.7本游戲涉及的數(shù)據(jù)結(jié)構(gòu)游戲區(qū)域游戲區(qū)域?yàn)槭謾C(jī)或者PDA屏幕的一部分,該區(qū)域?yàn)檎叫?邊長(zhǎng)一定能被16整除(因?yàn)槎砹_斯游戲區(qū)域剛好為16個(gè)小磚塊長(zhǎng),16個(gè)小磚塊寬的方形)。無論在水平方向還是垂直方向,該區(qū)域都要處于屏幕的居中位置。游戲區(qū)域在水平方向上分為2部分,一部分為12個(gè)小磚塊寬,用來顯示游戲容器,另一部分為4個(gè)小磚塊寬,用來顯示下一個(gè)下墜物和分?jǐn)?shù)。HbmVN777sL小磚塊

18、小磚塊是下墜物和游戲容器的組成部分。表現(xiàn)為一個(gè)正方形,邊長(zhǎng)為游戲區(qū)域邊長(zhǎng)的1/16。每個(gè)小磚塊在繪制的時(shí)候,4邊會(huì)留出1個(gè)象素寬,繪制成白色或者灰色,這樣磚塊之間才有間隙。每種小磚塊也有id,分別為1到8。我們可以用一個(gè)顏色數(shù)組(程序里叫BRICK_COLORS)存儲(chǔ)這8種顏色。若某種小磚塊的id為3,那么該小磚的顏色為BRICK_COLORS3-1.V7l4jRB8Hs下墜物下墜物本質(zhì)上為16個(gè)小磚塊組成的正方形。下墜物一共有7種,比如有田字形的,L字形的等等。每種下墜物一共有4種旋轉(zhuǎn)變化。 每種下墜物都有一個(gè)id,分別為1到7。因?yàn)閷?duì)于一種下墜物來說,其顏色是固定的。我們同樣可以用該種顏色

19、在BRICK_COLORS數(shù)組中的下標(biāo)值加上1,作為下墜物的id.83lcPA59W9游戲地圖游戲地圖是用來存儲(chǔ)游戲容器上的固定磚塊的。游戲容器為一個(gè)寬為12個(gè)小磚塊單位,高為16個(gè)小磚塊單位,包括左右2堵墻和下邊的容器底在內(nèi)。所以用一個(gè)16X12的二維數(shù)組(程序里叫mapdata)來存儲(chǔ)固定磚塊。如果mapdataj=k(k!=0).那么就表示游戲容器的i行j列上有個(gè)固定的小磚塊,小磚塊的顏色值為BRICK_COLORSk-1.如果k=0則表示i行j列無磚塊mZkklkzaaP5概要設(shè)計(jì)5.1本程序需要解決的主要技術(shù)問題根據(jù)分析知道,要成功的完成本游戲就需要完成如下功能,解決如下問題:1.

20、游戲程序是一項(xiàng)精度要求很高的程序系統(tǒng),因?yàn)槠浯a利用率很高。一個(gè)實(shí)時(shí)運(yùn)行的最終作品,每秒都會(huì)運(yùn)行成千上萬行程序,繪圖事件、鍵盤事件都會(huì)以極高的頻率在后臺(tái)等待響應(yīng),若有絲毫的差別都將很容易導(dǎo)致程序在運(yùn)行不久后可能出現(xiàn)嚴(yán)重錯(cuò)誤,甚至死循環(huán)。因此,其邏輯設(shè)計(jì)應(yīng)當(dāng)相當(dāng)嚴(yán)謹(jǐn),需將所有可能發(fā)生的事件及意外情況考慮在設(shè)計(jì)中。AVktR43bpw2. 游戲中為了美觀,適用性強(qiáng),避免閃頻等有關(guān)情況,在游戲中用到了MIDP2.0中Game中的雙緩沖技術(shù)ORjBnOwcEd3. 玩家通過對(duì)鍵盤的控制,來確定下墜物的落點(diǎn),4.利用消去一行,增加一定的分?jǐn)?shù)作為動(dòng)力,并隨著分?jǐn)?shù)的增加,難度變大,增加游戲的可玩性。5. 下

21、墜物的模式的構(gòu)建,并通過操作很好的控制它進(jìn)行翻轉(zhuǎn),移動(dòng),快速下墜等操作。6地圖的繪制,能在屏幕的適當(dāng)位置繪制出地圖,畫出地圖上的墻和地的磚塊,并確定最初下墜物的位置與初始模式。2MiJTy0dTT7. 由于本游戲是一個(gè)單屏幕游戲,游戲的地圖通過繪圖來解決,這樣使程序運(yùn)行的更快。8. Java是基于虛擬機(jī)的半解釋型編譯系統(tǒng),其執(zhí)行效率較C+等完全編譯后的程序會(huì)低很多,程序如果不進(jìn)行精簡(jiǎn)和優(yōu)化,將可能導(dǎo)致運(yùn)行的不流暢。除開發(fā)過程中對(duì)結(jié)構(gòu)上的控制、變量的使用、算法的優(yōu)化等優(yōu)化外,還可以使用混淆器(Obfuscator)進(jìn)行程序打包后的優(yōu)化。gIiSpiue7A5.2 本游戲功能模塊根據(jù)以上分析及需求

22、得到的功能模塊圖為:俄羅斯方塊手機(jī)游戲畫布模塊主模塊下墜物模塊地圖模塊類:GameMIDlet類:MyGameCanvas類:GameBlock類:GameMapuEh0U1Yfmh圖5.2-1游戲功能模塊圖6詳細(xì)設(shè)計(jì)根據(jù)上面的設(shè)計(jì)我們知道,要成功的完成本有些,就需要成功的實(shí)現(xiàn)上面的四個(gè)模塊也就是實(shí)現(xiàn)四個(gè)類。分別是GameMIDlet模塊,MyGameCanvas模塊,GameBlock模塊,GameMap模塊。IAg9qLsgBX6.1主模塊這個(gè)模塊是游戲的入口模塊,也就游戲的執(zhí)行入口。要成功的實(shí)現(xiàn)本模塊,就要完成下面的方法:主模塊:GameMIDletGameMIDlet()startAp

23、p()pauseApp()destroyApp(boolean arg0)WwghWvVhPE圖6.1-1主模塊功能圖這里面的幾個(gè)方法除了GameMIDlet()方法外,剩下的幾個(gè)都是控制程序的生命期的方法,他們的流程關(guān)系介紹如下:asfpsfpi4k消減狀態(tài)(Destroyed)停止?fàn)顟B(tài)(Paused)運(yùn)行狀態(tài)(Active)StartApp()DestroyApp()呼叫MIDlet的構(gòu)造函數(shù)DestroyApp()PauseApp()圖6.1-2主模塊功能圖我們知道,MIDlet suite是MIDP應(yīng)用程序的最小單位,JAM負(fù)責(zé)將手機(jī)內(nèi)的MIDlet suite以圖形化的方式呈現(xiàn),讓用

24、戶能夠選取欲執(zhí)行的MIDlet suite,一旦選取了某個(gè)MIDlet suite,操作系統(tǒng)就會(huì)激活KVM執(zhí)行里面的MIDlet。MIDlet及相關(guān)的支持類組成了MIDP應(yīng)用程序的實(shí)際內(nèi)容。而ooeyYZTjj1每個(gè)MIDlet都必須繼承javax.microedition.midlet.MIDlet這個(gè)抽象類。在MIDP規(guī)范中定義了MIDlet的生命周期,以及可以存在的三種狀態(tài),包括Paused、Active以及Destroyed,每一個(gè)MIDlet在任何時(shí)刻只可能處于其中的一個(gè)狀態(tài)。這三種狀態(tài)的轉(zhuǎn)換關(guān)系如圖。6.1-2所示:MIDlet有三個(gè)狀態(tài),分別是pause、active和destr

25、oyed。在啟動(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)行狀態(tài)。在active狀態(tài)調(diào)用destroyApp(boolean unconditional)或者pauseApp()方法可以使得MIDlet進(jìn)入destroyed或者pause狀態(tài)。值得一提的是destroyApp(boolean unconditional)方法,事實(shí)上,當(dāng)destroyApp()方法被調(diào)用的時(shí)候,AMS通知MIDlet進(jìn)入destroyed狀態(tài)。在destroyed狀態(tài)的MID

26、let必須釋放了所有的資源,并且保存了數(shù)據(jù)。如果unconditional為false的時(shí)候,MIDlet可以在接到通知后拋出MIDletStateChangeException而保持在當(dāng)前狀態(tài),如果設(shè)置為true的話,則必須立即進(jìn)入destroyed狀態(tài)。BkeGuInkxI本模塊的這幾個(gè)方法就是這樣控制本游戲的運(yùn)行的。只是在startApp()方法中創(chuàng)建了MyGameCanvas對(duì)象,并顯示出來。PgdO0sRlMo6.2畫布模塊本模塊繼承了GameCanvas類,實(shí)現(xiàn)了Runnable, CommandListener接口。其實(shí)現(xiàn)的主要功能如下圖:3cdXwckm15init()畫布模塊

27、:MyGameCanvas MyGameCanvasrun()keyPressedState()paintCanvas(Graphics g)h8c52WOngM圖6.2-1畫布模塊功能圖在這里首先簡(jiǎn)單介紹一下以下內(nèi)容:1MIDP1.0技術(shù)下的繪制背景技術(shù),在沒有MIDP2.0前,進(jìn)行游戲繪圖一般需要手動(dòng)編程使用雙緩沖。需要在paint()方法內(nèi)將所想要畫的圖形畫在一張預(yù)先準(zhǔn)備好的背景上,等所有繪圖操作都完成后再將背景的數(shù)據(jù)拷貝到實(shí)際的屏幕上。Image類提供了一個(gè)建立背景的靜態(tài)方法createImage(int width, int height),再利用getGraphics()方法取得屬

28、于這個(gè)背景的Graphics對(duì)象,所進(jìn)行的繪圖操作都會(huì)作用在背景上,等到全部的繪圖操作完成后,再調(diào)用drawImage()方法將背景的數(shù)據(jù)復(fù)制到實(shí)際顯示的屏幕上。v4bdyGious這樣的技術(shù)在繪制動(dòng)畫時(shí)特別有用。繪制動(dòng)畫時(shí)經(jīng)常需要不斷地更新畫面,而更新畫面的操作就是先將屏幕以fillRect()的方式清除,再將下一張圖片畫在屏幕上,然而反復(fù)的清除及重繪會(huì)造成屏幕的閃爍現(xiàn)象(flicker),因此使用雙重緩沖的好處就是在背景進(jìn)行這個(gè)清除及重繪的操作,再將完成的繪圖拷貝到屏幕上,由于用戶看不到清除的操作,因此就不會(huì)出現(xiàn)閃爍的現(xiàn)象了。不過在某些MIDP的實(shí)現(xiàn)上已經(jīng)加上了雙重緩沖的支持,因此在處理前

29、應(yīng)先利用Canvas類的isDoubleBuffer()方法來判斷。J0bm4qMpJ92MIDP2.0新增的GameCanvas包,J2ME的流行促進(jìn)幾個(gè)運(yùn)營(yíng)商和制造商開發(fā)了一些支持游戲的類,但是,這卻造成了游戲缺乏可移植性的問題。在MIDP2.0版本發(fā)布后,這些游戲移植性問題初步得到了解決。MIDP2.0新加入了GameCanvas、Sprite、Layer、LayerManager、TiledLayer五個(gè)與游戲開發(fā)相關(guān)的類。其中 Layer類一般不會(huì)直接用到。Game類的出現(xiàn)不僅降低了錯(cuò)誤出現(xiàn)的幾率,也使游戲代碼變的更小,因?yàn)殚_發(fā)者不需要自己編寫象Sprite這種例子。下面將簡(jiǎn)要介紹G

30、ame類。XVauA9grYPGameCanvas類繼承自Canvas,所以具有Canvas所具有的功能,還額外增加了一些便于游戲設(shè)計(jì)的功能。比如: GameCanvas類直接提供了getKeyStates(),使程序員可以在同一個(gè)線程自己偵測(cè)按鍵的狀態(tài)。GameCanvas類提供了flushGraphics()的功能,實(shí)現(xiàn)了雙緩沖技術(shù)。bR9C6TJscw所謂的Sprite,就是畫面上獨(dú)立移動(dòng)的圖形。Sprite類是繼承自Layer的用于存儲(chǔ)多楨的基本可視元素。不同的frame可交相顯示,構(gòu)成動(dòng)態(tài)的效果。圖片可翻轉(zhuǎn)、顛倒、由一個(gè)主角圖片就可以方便的得到所有方向的顯示狀態(tài),相比原先只能使用Ca

31、nvas繪圖,需要將所有方向的主角圖象都繪制在png圖象中簡(jiǎn)化了許多。Sprite也可以從整合的圖象中讀圖,讀圖時(shí)將把大圖分解為若干等寬等高的小圖。每個(gè)小圖按照其排列順序有相應(yīng)的序號(hào),在程序中調(diào)用其序號(hào),就可以繪制出相應(yīng)的圖片。本程序中的雙方飛機(jī)、子彈、白云都由Sprite繼承得到。pN9LBDdtrdLayerManager提供控制整體畫面層的控制。它包括了一系列自動(dòng)獲取了代號(hào)和位置的層,簡(jiǎn)化了各層加入游戲畫面的過程,提供了自動(dòng)排序和繪制的能力。DJ8T7nHuGTLayerManager存儲(chǔ)了一個(gè)層的列表,新的層可以用函數(shù)附加、刪除和插入。層的序號(hào)相當(dāng)于坐標(biāo)的Z軸,0層表示最接近用戶視覺,

32、層數(shù)越高,離用戶越遠(yuǎn)。層號(hào)總是連續(xù)的,即使有中間的層被移除,其他層的序號(hào)會(huì)作相應(yīng)的調(diào)整以保持整體的完整性。LM中的View Window控制著與LM相對(duì)坐標(biāo)的可視區(qū)域。改變View Window的位置可以制造出滾動(dòng)屏幕的效果。QF81D7bvUATiledLayer是有一組圖象格元素組成的整塊虛擬圖象。該類使不需要高分辨率的圖象就能創(chuàng)建大幅圖面成為可能。這項(xiàng)技術(shù)通常應(yīng)用在2D游戲平臺(tái)的滾動(dòng)背景的繪圖。一塊整圖可被分割成等大小的圖象格,每塊格有其對(duì)應(yīng)的序號(hào),按照行列遞增。多塊小格可由大塊同時(shí)替換組合而模擬動(dòng)態(tài)的背景,這不需要逐塊替換所有的靜態(tài)圖象格而顯得非常方便。4B7a9QFw9h3Canva

33、s類介紹。為了能有程序開發(fā)人員控制接口的外觀和行為,需要使用大量的初級(jí)用戶接口類,尤其在游戲程序中,幾乎完全依賴的就是Canvas抽象類進(jìn)行繪圖。從程序開發(fā)的觀點(diǎn)看,Canvas類可與高級(jí)Screen類交互,程序可在需要時(shí)在Canvas中摻入高級(jí)類的組件。Canvas提供了鍵盤事件、指點(diǎn)桿事件(如果設(shè)備支持),并定義了允許將鍵盤按鍵映射為游戲控制鍵的函數(shù)。鍵盤事件由鍵代碼指定,但這樣控制游戲會(huì)導(dǎo)致缺乏通用性,并不是每個(gè)設(shè)備的鍵盤布局都適合游戲的操作。應(yīng)當(dāng)將鍵代碼轉(zhuǎn)換為游戲鍵的代碼,以便硬件開發(fā)商能定義他們自己的游戲鍵布局。ix6iFA8xoX4Graphics類介紹。Graphics類提供了簡(jiǎn)

34、單的2D繪圖功能。它具有24位深度色彩的繪制能力,以三原色分別各占一個(gè)字節(jié)表示其顏色。程序只能在paint()函數(shù)中使用Graphics繪制,GameCanvas可調(diào)用getGraphics()函數(shù)直接繪制在緩沖區(qū)上,可以在任何時(shí)間請(qǐng)求傳輸?shù)角芭_(tái)。其對(duì)象會(huì)被傳給Canvas的paint()函數(shù),以便最終顯示。wt6qbkCyDE有了上面的知識(shí),來看看本模塊的方法。1Init()方法主要完成對(duì)游戲畫布,轉(zhuǎn)塊邊長(zhǎng)及游戲狀態(tài)的初始化。其代碼如下:public void init()mainWidth = getWidth();mainHeight = getHeight();int min = (m

35、ainWidth = 0; min-)if(min % 16 = 0)break;BRICK_WIDTH = min / 16;GAMEAREA_X = (mainWidth - min) / 2;GAMEAREA_Y = (mainHeight - min) / 2;this.startDemoFlag = false; this.gameState = this.GAME_STARTED_DEMO;Yl4HdOAA612Run()方法是這個(gè)類的最主要的一個(gè)方法,是實(shí)現(xiàn)的Runnable接口中的方法,它啟動(dòng)了一個(gè)線程,規(guī)定50ms重畫一次,調(diào)用了檢查按鍵狀態(tài)和重畫屏幕的方法。具體實(shí)現(xiàn)如下:c

36、h4PJx4BlIpublic void run() while(true)try Thread.sleep(50); catch (InterruptedException e) e.printStackTrace();this.keyPressedState();this.paintCanvas(this.graphics);3keyPressedState()主動(dòng)查詢鍵盤的狀態(tài),替代Canvas中的KeyPressed()捕獲事件。qd3YfhxCzo4paintCanvas(Graphics g)方法是畫布重畫事件,替代Canvas中的paint()事件,根據(jù)不同的游戲狀態(tài)(gameS

37、tate)畫出游戲畫面,本方法有thread每次重新啟動(dòng),最后執(zhí)行flushGraphics()重畫緩沖區(qū)。在這里有四個(gè)游戲狀態(tài)分別是demo,init,run,over四種狀態(tài),根據(jù)它們的不同,做出不同的響應(yīng)。E836L11DO56.3下墜物模塊這個(gè)模塊實(shí)現(xiàn)了下墜物對(duì)象,是響應(yīng)各種圖形重畫的核心類。與MyGameCanvas和GameMap均可直接通信。在GameBlock中以成員變量的形式存儲(chǔ)了7個(gè)預(yù)定義的方塊邏輯數(shù)組,顏色選配方案以及相對(duì)坐標(biāo)端點(diǎn)。GameBlock 定義畫出單個(gè)小方磚,小方塊, 以及對(duì)某個(gè)圖形方塊的位置,碰撞檢測(cè),移動(dòng)檢測(cè),轉(zhuǎn)動(dòng)檢測(cè),獲取坐標(biāo)值,更新坐標(biāo)值等操作。其具體

38、的實(shí)現(xiàn)的功能如下:S42ehLvE3M下墜物模塊:GameBlockreadPattern(int nowPattern)drawBlock(Graphics g)init()checkMove(int input)checkRot()checkDown(boolean kyouseiflag)paint(Graphics g)501nNvZFis圖6.3-1下墜物模塊功能圖本模塊的首要問題是設(shè)計(jì)出這七種下墜物模式,它們分別是田字形、正L形,反L形,正乙字形,反乙字形、I字形和丁字型。為實(shí)現(xiàn)這幾種模式,用了一個(gè)三維數(shù)組來實(shí)現(xiàn),第一維用來表示旋轉(zhuǎn)值,第二和第三維分別用來表示行和列。在游戲的過程中

39、用隨即函數(shù)隨即生成的數(shù)字來表示當(dāng)前的下墜物,能更好的表現(xiàn)出游戲的特性。jW1viftGw9同時(shí),在本模塊中還提供了對(duì)下墜物控制的很多方法,如讀取下墜物變量的內(nèi)容函數(shù)readPattern(int nowPattern);在游戲區(qū)畫出下墜物的函數(shù)drawBlock(Graphics g);還有移動(dòng),檢查移動(dòng),翻轉(zhuǎn),檢查翻轉(zhuǎn)等函數(shù)的實(shí)現(xiàn)。xS0DOYWHLP在本模塊中有一個(gè)init()函數(shù),它決定了游戲開始時(shí)初始化當(dāng)前下墜物的模式,下一個(gè)下墜物的模式,和初始化當(dāng)前下墜物出現(xiàn)的位置。LOZMkIqI0wpaint(Graphics g)用來重畫下墜物,起具體實(shí)現(xiàn)如下:public synchroni

40、zed void paint(Graphics g) g.setColor(MyGameCanvas.BACKGROUND);for(int j = 0; j 4; j+)for(int i = 0; i 4; i+)if(this.blockpatternthis.oldRotij = 1)g.fillRect(MyGameCanvas.GAMEAREA_X + (this.oldXBrick + j) * MyGameCanvas.BRICK_WIDTH,ZKZUQsUJedMyGameCanvas.GAMEAREA_Y + (this.oldYBrick + i) * MyGameCan

41、vas.BRICK_WIDTH,dGY2mcoKtTMyGameCanvas.BRICK_WIDTH, MyGameCanvas.BRICK_WIDTH);rCYbSWRLIAdrawBlock(g);this.oldRot = this.rot;this.oldXBrick = this.xBrick;this.oldYBrick = this.yBrick;6.4地圖模塊 這個(gè)模塊實(shí)現(xiàn)了本游戲的地圖,畫出了游戲中的墻和低,并實(shí)現(xiàn)了在地圖上所有的操作,如刪除行,檢查是否有削去行為,重畫地圖,在地圖上顯示分?jǐn)?shù)等情況。FyXjoFlMWhinit()地圖模塊:GameMappaint(Graph

42、ics g)check(Graphics g, int inputRow)deleteRow(Graphics g, int y)paintScore(Graphics g)repaintMap(Graphics g)TuWrUpPObX圖6.4-1地圖模塊功能圖1本模塊中init()函數(shù)主要用來初始化地圖,畫出背景色,畫出墻和底。其具體實(shí)現(xiàn)如下:public void init()this.score = 0;for(int i = 0; i 16; i+)for(int j = 0; j 12; j+)this.mapdataij = 0;this.mapBlockExisti = fal

43、se;for(int i = 0; i 16; i+)this.mapdatai0 = 8;this.mapdatai11 = 8;for(int j = 0; j 11; j+)this.mapdata15j = 8;this.mapBlockExist15 = true;2paint(Graphics g)和repaintMap(Graphics g)。paint(Graphics g)函數(shù)是清空屏幕,繪制畫布。repaintMap(Graphics g)當(dāng)有消去行的行為時(shí)調(diào)用,重畫容器地圖。7qWAq9jPqE3deleteRow(Graphics g, int y)刪除行函數(shù),只是簡(jiǎn)單

44、的把該行置黑。4paintScore(Graphics g)在屏幕上顯示玩家所得的分?jǐn)?shù)。7 游戲設(shè)計(jì)運(yùn)行圖7.1本游戲的流程圖下墜物是否還能下墜繪制歡迎界面繪制游戲結(jié)束畫面面下墜物下墜一格初始化一個(gè)新的下墜物執(zhí)行空操作固定下墜物在下墜物的當(dāng)前位置繪制下墜物是否需要?jiǎng)h除行重游戲地圖設(shè)置游戲狀態(tài)為游戲結(jié)束狀態(tài)在游戲的容器邊繪制下一個(gè)下墜物繪制新下墜物是否游戲結(jié)束游戲結(jié)束游戲開始游戲處于歡迎界面游戲處于暫停狀態(tài)游戲處于結(jié)束狀態(tài)游戲處于運(yùn)行狀態(tài)否是否否是是llVIWTNQFk圖7.1-1游戲流程圖7.2本游戲的執(zhí)行圖圖7.2-1游戲執(zhí)行圖8手機(jī)游戲優(yōu)化8.1 內(nèi)存的優(yōu)化手機(jī)內(nèi)存空間小,所以在程序設(shè)計(jì)時(shí)

45、應(yīng)該注意以下幾點(diǎn),以盡量減少內(nèi)存的使用:(1)盡量縮短命名的長(zhǎng)度。在應(yīng)用程序內(nèi),對(duì)于所建立的類、接口、方法及變量名而言,都需要賦予一個(gè)識(shí)別的名稱,所命名的名稱每多一個(gè)字符就會(huì)在類文件內(nèi)多產(chǎn)生一個(gè)字節(jié),對(duì)于一個(gè)較復(fù)雜的應(yīng)用程序而言就會(huì)增加為數(shù)不小的數(shù)據(jù)量。所有這些可以借助混淆器來幫助實(shí)現(xiàn)yhUQsDgRT1 (2)所有代碼寫為一個(gè)類。(3)只使用一個(gè)線程。(4)盡量不使用靜態(tài)變量。(5)將PNG圖片合并成一張,減少圖形數(shù)據(jù)的大小。將PNG格式的小分辨率圖象合并在一張大的高分辨率圖象中,由于減少了頭文件的大小,將比合并前的總大小減少許多。MdUZYnKS8I8.2 內(nèi)存檢測(cè)器Wireless To

46、ol Kit提供了許多在運(yùn)行時(shí)監(jiān)視運(yùn)行狀態(tài)的工具。 包括內(nèi)存狀況的檢測(cè)(手機(jī)上的內(nèi)存空間十分有限,必須時(shí)刻關(guān)注機(jī)載內(nèi)存是否大于程序所能使用到的最大可能的內(nèi)存空間),網(wǎng)絡(luò)狀況的檢測(cè),運(yùn)行函數(shù)的跟蹤等。 內(nèi)存檢測(cè)器是內(nèi)存跟蹤測(cè)試隨時(shí)間變化的調(diào)試器。其中,允許強(qiáng)制垃圾回收(Garbage Collection)。由于Java語言中,不像許多其他的如C+語言,不需要指定回收函數(shù)中特定不使用的資源,資源回收機(jī)制將自動(dòng)清空無效變量占用的空間。在程序運(yùn)行中也可以調(diào)用System類的gc()函數(shù)手動(dòng)收回廢棄的內(nèi)存。09T7t6eTno8.3 關(guān)于混淆器Java 語言并沒有完全編譯成二進(jìn)制可執(zhí)行文件,編譯出的.

47、class文件是一種介于源程序和二進(jìn)制之間的一中基于半解釋的字節(jié)碼,需要虛擬機(jī)來執(zhí)行。它包括了所有的信息。然而這樣會(huì)導(dǎo)致.class很容易被反編譯為源代碼,從而不能保護(hù)作者的知識(shí)成果。目前流行的如decode,JAD等反編譯工具可以以很快的速度生成源文件。如果不加以施行有效的措施,將造成嚴(yán)重的后果。e5TfZQIUB5由此引入混淆器的概念?;煜鲗⒋a中的所有變量、函數(shù)、類的名稱變?yōu)楹?jiǎn)短的英文字母代號(hào),如果缺乏相應(yīng)的函數(shù)名指示和程序注釋,即使被反編譯,也將難以閱讀。s1SovAcVQM混淆器的作用不僅僅是保護(hù)代碼,它也有精簡(jiǎn)編譯后程序大小的作用。由于以上介紹的減少變量、函數(shù)的命名長(zhǎng)度的關(guān)系,編

48、譯后也會(huì)從.class文件中減少這些冗余的信息?;煜?,體積大約能減少25%,這對(duì)當(dāng)前費(fèi)用較貴的無線網(wǎng)絡(luò)傳輸是有一定意義的。GXRw1kFW5s本游戲用的混淆器是proguard3.4,在Eclipse環(huán)境下導(dǎo)入混淆器,用產(chǎn)生混淆包命令生成了混淆包。降低了原代碼反編譯的可能性,同時(shí)減小了原代碼的大小。UTREx49Xj98.4本游戲的優(yōu)化 當(dāng)本游戲開發(fā)完成后,在模擬器成功的運(yùn)行,但是我們?cè)诮Y(jié)束游戲的時(shí)候,在彈出的內(nèi)存檢測(cè)器窗口發(fā)現(xiàn)有一部分內(nèi)存利用率太高,為了提高本游戲的性能,對(duì)算法進(jìn)行了改進(jìn)。還有就是發(fā)現(xiàn)游戲的代碼占用內(nèi)存太大,同樣為了降低內(nèi)存占用率,用混淆器經(jīng)過混淆降低了代碼的內(nèi)存占用率,有

49、效的提高了程序的性能。8PQN3NDYyP9本游戲測(cè)試作為一個(gè)真正的產(chǎn)品要經(jīng)過單體測(cè)試、結(jié)合測(cè)試和系統(tǒng)測(cè)試。由于本項(xiàng)目本身簡(jiǎn)單,而且大部分代碼已經(jīng)是相對(duì)成熟的,跳過單體測(cè)試;又由于實(shí)際環(huán)境所限,無法搞到Java手機(jī),無法架設(shè)OTA服務(wù)器,因此只能放棄系統(tǒng)測(cè)試。在這里只能進(jìn)行結(jié)合測(cè)試,測(cè)試之前要先寫一個(gè)測(cè)試式樣書,也就是測(cè)試的計(jì)劃。將它簡(jiǎn)化一下,只測(cè)試如下幾種情況:第一、對(duì)各種形狀的區(qū)域的選擇和移動(dòng);第二、臨近邊界區(qū)域的選擇和移動(dòng);第三、同一區(qū)域的反復(fù)選擇和反復(fù)移動(dòng);第四、非法選擇和非法移動(dòng)。有了測(cè)試的目標(biāo),接下來的工作就是用wtk2.2自帶的Run MIDP Application工具進(jìn)行測(cè)試。打開這個(gè)工具,加載GameMIDlet的jad文件,程序就會(huì)自動(dòng)運(yùn)行,選擇launch上MIDlet1這個(gè)程序,俄羅斯方塊游戲就會(huì)運(yùn)行。測(cè)試過程中發(fā)現(xiàn)任何的問題,立刻發(fā)一個(gè)bug消息,然后就是反復(fù)的調(diào)試和修正bug,直到?jīng)]有bug并認(rèn)為符合要求時(shí)為止。mLPVzx7ZNw對(duì)于本游戲來說分為在模擬器上測(cè)試和在真機(jī)上運(yùn)行。在模擬器上,調(diào)試的時(shí)候把英文改為中文時(shí),發(fā)現(xiàn)亂碼的問題,經(jīng)過查看資料得以解決,使自己明白了在J2ME開發(fā)中,MIDP規(guī)格中規(guī)定描述文件的內(nèi)容一定要使用Unicode編碼,所以一定要用中文表是的話,就必須額外利用native2ascii.exe這個(gè)工具,將描

溫馨提示

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

評(píng)論

0/150

提交評(píng)論