2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩27頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、<p><b>  1.緒論</b></p><p><b>  1.1手機(jī)軟件現(xiàn)狀</b></p><p>  在信息社會中,手機(jī)及其他無線設(shè)備越來越多的走進(jìn)普通百姓的工作和生活,隨著信息網(wǎng)絡(luò)化的不斷進(jìn)展,手機(jī)及其他無線設(shè)備上網(wǎng)絡(luò)勢在必行。</p><p>  1.1.1傳統(tǒng)手機(jī)存在以下弊端:</p>

2、;<p>  1. 傳統(tǒng)手機(jī)出廠時(shí)均由硬件廠商固化程序,程序不能增加、刪除,有了錯(cuò)誤也不能更新、修改,若要增加新功能必須另換一部手機(jī)。</p><p>  2. 傳統(tǒng)手機(jī)訪問互聯(lián)網(wǎng)是通過WAP(Wireless Application Protocal),所有網(wǎng)絡(luò)資源必須接通網(wǎng)絡(luò)才能在線訪問,非常耗時(shí)、費(fèi)用亦很高。</p><p>  1.1.2Java技術(shù)在無線應(yīng)用方面

3、的優(yōu)勢非常明顯:</p><p>  1. 應(yīng)用程序可按需下載,而不是購買由硬件商提供的套件,可升級空間大。</p><p>  2. Java技術(shù)提供了一個(gè)類庫,它使的應(yīng)用開發(fā)商可以創(chuàng)建更為直覺、豐富的用戶界面(GUI);</p><p>  3. Java技術(shù)使網(wǎng)絡(luò)帶寬的應(yīng)用更為有效,因?yàn)閼?yīng)用程序可以下載到器件上,并在本地運(yùn)行,僅僅是在連接到服務(wù)器時(shí)才會占

4、用網(wǎng)絡(luò)帶寬。</p><p>  基于以上分析,Java手機(jī)將是未來手機(jī)的發(fā)展方向,是業(yè)界的熱點(diǎn)。</p><p>  1.2 J2ME介紹</p><p>  雖然 Java 已經(jīng)被用到許多企業(yè)級軟體上,可是其實(shí)骨子里面還是非常適合用在嵌入式系統(tǒng)之中。Java平臺演進(jìn)到Java2后,Java平臺分別針對不同領(lǐng)域的需求被分成四個(gè)版本,亦即J2EE、J2SE、J2ME

5、以及JavaCard。其中J2ME定位在消費(fèi)性電子產(chǎn)品的應(yīng)用上。這個(gè)版本針對資源有限的電子消費(fèi)產(chǎn)品的需求精簡核心類庫,并提供了模塊化的架構(gòu)讓不同類型產(chǎn)品能夠隨時(shí)增加支持的能力。這個(gè)版本的應(yīng)用層面相當(dāng)廣泛,會是未來Java平臺發(fā)展的重點(diǎn)項(xiàng)目。</p><p>  J2ME在1999年的JavaOne開發(fā)人員大會上初次亮相,它的目標(biāo)是面向智能無線設(shè)備和小型計(jì)算機(jī)設(shè)備的開發(fā)人員。J2ME的一個(gè)關(guān)鍵優(yōu)點(diǎn)是,J2ME與所有

6、支持Java的設(shè)備都是兼容的。支持Java的設(shè)備就是任何運(yùn)行Java虛擬機(jī)器的計(jì)算機(jī)。Motorola、Nokia等生產(chǎn)廠商都生產(chǎn)支持Java的設(shè)備。、</p><p>  J2ME平臺是由配置(Configuration)和簡表(Profile)構(gòu)成的。配置是提供給最大范圍設(shè)備使用的最小類庫集合,在配置中同時(shí)包含Java虛擬機(jī)。簡表是針對一系列設(shè)備提供的開發(fā)包集合。在J2ME中還有一個(gè)重要的概念是可選包(Opt

7、ional Package),它是針對特定設(shè)備提供的類庫,比如某些設(shè)備是支持藍(lán)牙的,針對此功能J2ME中制定了JSR82(Bluetooth API)提供了對藍(lán)牙的支持。</p><p>  目前,J2ME中有兩個(gè)最主要的配置,分別是Connected Limited Devices Configuration(CLDC)和Connected Devices Configuration(CDC)。</p&g

8、t;<p>  作為第一個(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è)備,如手機(jī)、PDA等。</p><p>  而CDC則是主要用于運(yùn)算能力相對較佳、在電力供應(yīng)

9、上相對比較充足的嵌入式裝置 (比方說冷氣機(jī)、電冰箱、電視機(jī)機(jī)頂盒 (set-top box))</p><p>  1.3 手機(jī)游戲應(yīng)具有的特征</p><p>  一個(gè)成功的手機(jī)游戲大多具有以下特征: </p><p>  易于學(xué)習(xí): 既然手機(jī)游戲面向的是普通消費(fèi)者而不是計(jì)算機(jī)專家,那么他們不可能深入的學(xué)習(xí)游戲技巧。消費(fèi)者不會花幾個(gè)小時(shí)去研究一個(gè)3元的手動操作的游

10、戲。保持游戲的簡單是最基本的要求。 </p><p>  可中斷性: 多任務(wù)處理是手機(jī)生活方式的基本特征。手機(jī)用戶常常在任務(wù)(如等一個(gè)電子郵件或者等車)之間有一小段時(shí)間。而游戲、日歷管理、通訊和工作數(shù)據(jù)訪問使用的是同一個(gè)設(shè)備。所以一個(gè)好的手機(jī)游戲應(yīng)該提供短時(shí)間的娛樂功能,并且允許用戶在游戲和工作模式之間順利切換。 </p><p>  基于訂閱:手機(jī)游戲的盈利成功取決于他們巨大的使用量。一

11、開始開發(fā)和設(shè)計(jì)每個(gè)游戲都是昂貴的。如果一個(gè)手機(jī)游戲開發(fā)者要贏利的話,重要的是:同一個(gè)游戲引擎,多個(gè)標(biāo)題,基本的故事情節(jié)類似?;谟嗛喌挠螒蚴遣粩喈a(chǎn)生收入的最好方法。 </p><p>  豐富的社會交互: 不管一個(gè)游戲設(shè)計(jì)得多好,只要玩家找到了它的根本模式或者玩完了所有的游戲路徑很快就會厭煩這個(gè)游戲。對于一個(gè)基于訂閱的游戲,重要的是與別的玩家合作以增強(qiáng)所玩游戲的智力和隨機(jī)性。在今天紛繁復(fù)雜的多玩家游戲中具有豐富社

12、會交互的游戲證明是成功的。 </p><p>  利用手機(jī)技術(shù)的優(yōu)點(diǎn): 巨額的手機(jī)技術(shù)研發(fā)費(fèi)用都花在提高設(shè)備和網(wǎng)絡(luò)的可用性和可靠性上面。因此,手機(jī)設(shè)備硬件和網(wǎng)絡(luò)協(xié)議與桌面/控制臺世界(如全球定位系統(tǒng)(GPS)擴(kuò)展、條形碼掃描儀、和短消息服務(wù)(SMS)/多媒體信息服務(wù)(MMS)通訊)有著非常大的差別。好的手機(jī)游戲應(yīng)該利用那些更新的設(shè)備特征和網(wǎng)絡(luò)基礎(chǔ)設(shè)備的優(yōu)點(diǎn)。 </p><p>  第一章中

13、介紹了手機(jī)在無線應(yīng)用方向的當(dāng)今概況,并介紹了游戲業(yè)務(wù)在當(dāng)前社會的發(fā)展?jié)摿Α7治隽薐2ME在手機(jī)軟件開發(fā)中起的重要作用,描述了本論文的相關(guān)背景。</p><p>  2.開發(fā)環(huán)境及相關(guān)技術(shù)的介紹</p><p><b>  2.1 開發(fā)環(huán)境</b></p><p>  操作系統(tǒng):Microsoft Windows XP</p>&

14、lt;p>  程序語言:Java 2</p><p>  開 發(fā) 包:Java(TM) 2 Standard Edition (1.5.0)</p><p>  Sun Micro. J2ME Wireless Tool Kit 2.2</p><p>  IDE: Eclipse 3.0.1</p><p>  Eclips

15、eMe 1.7.9</p><p>  混淆器: Proguard 4.4</p><p>  2.2 Java語言特點(diǎn)</p><p>  2.2.1. 平臺無關(guān)性</p><p>  Java引進(jìn)虛擬機(jī)原理,并運(yùn)行于虛擬機(jī),實(shí)現(xiàn)不同平臺之間的Java接口。Java的數(shù)據(jù)類型與機(jī)器無關(guān)。</p><p>  2.

16、2.2. 安全性</p><p>  Java的編程類似C++,但舍棄了C++的指針對存儲器地址的直接操作,程序運(yùn)行時(shí),內(nèi)存由操作系統(tǒng)分配,這樣可以避免病毒通過指針入侵系統(tǒng)。它提供了安全管理器,防止程序的非法訪問。</p><p>  2.2.3. 面向?qū)ο?lt;/p><p>  Java吸收了C++面向?qū)ο蟮母拍?,將?shù)據(jù)封裝于類中,實(shí)現(xiàn)了程序的簡潔性和便于維護(hù)性,使

17、程序代碼可以只需一次編譯就可反復(fù)利用。</p><p>  2.2.4. 分布式</p><p>  Java建立在TCP/IP網(wǎng)絡(luò)平臺上,提供了用HTTP和FTP協(xié)議傳送和接收信息的庫函數(shù),使用其相關(guān)技術(shù)可以十分方便的構(gòu)建分布式應(yīng)用系統(tǒng)。</p><p>  2.2.5. 健壯性</p><p>  Java致力與檢查程序在編譯和運(yùn)行時(shí)的錯(cuò)

18、誤,并自動回收內(nèi)存,減少了內(nèi)存出錯(cuò)的可能性。Java取消了C語言的結(jié)構(gòu)、指針、#define語句、多重繼承、goto語句、操作符、重載等不易被掌握的特性,提供垃圾收集器自動回收不用的內(nèi)存空間。</p><p>  2.3 關(guān)于ECLIPSE</p><p>  Eclipse 是一個(gè)開放源代碼的、基于 Java 的可擴(kuò)展開發(fā)平臺。就其本身而言,它只是一個(gè)框架和一組服務(wù),用于通過插件組件構(gòu)

19、建開發(fā)環(huán)境。幸運(yùn)的是,Eclipse 附帶了一個(gè)標(biāo)準(zhǔn)的插件集,包括 Java 開發(fā)工具(Java Development Tools,JDT)。</p><p>  雖然大多數(shù)用戶很樂于將 Eclipse 當(dāng)作 Java IDE 來使用,但 Eclipse 的目標(biāo)不僅限于此。Eclipse 還包括插件開發(fā)環(huán)境(Plug-in Development Environment,PDE),這個(gè)組件主要針對希望擴(kuò)展 Ec

20、lipse 的軟件開發(fā)人員,因?yàn)樗试S他們構(gòu)建與 Eclipse 環(huán)境無縫集成的工具。由于 Eclipse 中的每樣?xùn)|西都是插件,對于給 Eclipse 提供插件,以及給用戶提供一致和統(tǒng)一的集成開發(fā)環(huán)境而言,所有工具開發(fā)人員都具有同等的發(fā)揮場所。</p><p>  這種平等和一致性并不僅限于 Java 開發(fā)工具。盡管 Eclipse 是使用 Java 語言開發(fā)的,但它的用途并不限于 Java 語言;例如,支持諸

21、如 C/C++、COBOL 和 Eiffel 等編程語言的插件已經(jīng)可用,或預(yù)計(jì)會推出。Eclipse 框架還可用來作為與軟件開發(fā)無關(guān)的其他應(yīng)用程序類型的基礎(chǔ),比如內(nèi)容管理系統(tǒng)。Eclipse 是一個(gè)開放源代碼的、基于 Java 的可擴(kuò)展開發(fā)平臺。就其本身而言,它只是一個(gè)框架和一組服務(wù),用于通過插件組件構(gòu)建開發(fā)環(huán)境。</p><p>  2.4 關(guān)于Wireless Tool Kit</p><

22、p>  WTK(Wireless Tool Kit)是Sun公司針對J2ME推出的用于手機(jī)和Palm等移動設(shè)備的開發(fā)包,是除手機(jī)廠商的專用開發(fā)包外唯一的手機(jī)模擬器開發(fā)包。它通用性高,開發(fā)出的應(yīng)用程序可保證能運(yùn)行在大部分設(shè)備上,而不像專用廠商具有一定的不兼容性。雖然它沒有強(qiáng)大的功能和完善的調(diào)試手段,但它提供運(yùn)行模擬器的最基本組件,是其他IDE需集成采用的必備元素。</p><p>  2.5 Java App

23、ication Manager</p><p>  手機(jī)中負(fù)責(zé)調(diào)配程序運(yùn)行資源的管理后臺是Java Application Manager。它所使用的傳輸媒體可以是紅外線、網(wǎng)絡(luò)、以及其他可用來傳輸?shù)拿襟w。Java Application Manager 會從網(wǎng)絡(luò)上下載代表該Application Suite 的JAR 檔,接著在手機(jī)上安裝此MIDlet Suite,然后在手機(jī)開始執(zhí)行該應(yīng)用程序。</p>

24、;<p><b>  2.6 本章小結(jié):</b></p><p>  第二章介紹了Java語言的特點(diǎn)、本程序的開發(fā)環(huán)境及其相關(guān)工具的原理和使用。</p><p>  3 程序結(jié)構(gòu)、思想和相關(guān)技術(shù)</p><p>  3.1 本程序需要解決的主要技術(shù)問題</p><p>  3.1.1代碼利用率</p&

25、gt;<p>  游戲程序是一項(xiàng)精度要求很高的程序系統(tǒng),因?yàn)槠浯a利用率很高。</p><p>  一個(gè)實(shí)時(shí)運(yùn)行的最終作品,每秒都會運(yùn)行成千上萬行程序,繪圖事件、鍵盤事件都會以極高的頻率在后臺等待響應(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ì)中。</p><p><

26、b>  3.1.2圖片問題</b></p><p>  游戲中為了美觀,適用性強(qiáng),可能需要采用外部文件引入的圖片貼圖,有關(guān)貼圖,在MIDP2.0中提供了用于增強(qiáng)游戲功能的game包,使得解決靜態(tài)或動態(tài)、畫面背景、屏幕刷新的雙緩沖等都有較好的解決方案。</p><p><b>  3.1.3控制問題</b></p><p>  

27、玩家坦克的運(yùn)行可以通過鍵盤響應(yīng)事件控制,但敵方則因?yàn)槭亲詣舆\(yùn)行,就需要有一定的智能性;敵軍的運(yùn)行算法也要進(jìn)行相關(guān)的設(shè)置,已免游戲過于簡單。</p><p><b>  3.1.4可玩性</b></p><p>  對于雙方發(fā)射的子彈應(yīng)該賦予不同的速度,同時(shí),程序應(yīng)該設(shè)定敵軍的子彈不與敵人的坦克進(jìn)行碰撞檢測,已增加游戲的可玩性。</p><p>

28、<b>  3.1.5碰撞問題</b></p><p>  雙方的坦克在前進(jìn)時(shí)也需要考慮到是否碰撞到對方坦克,以免重疊運(yùn)行,造成許多物理上不可能的情況,缺乏真實(shí)感。每一次刷新頁面、每前進(jìn)一步都需要進(jìn)行相關(guān)的碰撞檢測。</p><p><b>  3.1.6界面問題</b></p><p>  為了增加界面的美觀,在程序中添

29、加了白云。由于手機(jī)屏幕大小有限,所以白云的數(shù)量和出現(xiàn)的位置要經(jīng)過相關(guān)的設(shè)置,才能實(shí)現(xiàn)白云不規(guī)則出現(xiàn)的效果。</p><p><b>  3.1.7地圖問題</b></p><p>  游戲的地圖不可能通過繪圖來解決。否則,不僅難于控制和處理過多的元素,也會因過多的大型圖片而不能限制程序的大小,失去手機(jī)上程序的原則和Java的優(yōu)勢。</p><p&g

30、t;<b>  3.1.8執(zhí)行效率</b></p><p>  Java是基于虛擬機(jī)的半解釋型編譯系統(tǒng),其執(zhí)行效率較C++等完全編譯后的程序會低很多,程序如果不進(jìn)行精簡和優(yōu)化,將可能導(dǎo)致運(yùn)行的不流暢。除開發(fā)過程中對結(jié)構(gòu)上的控制、變量的使用、算法的優(yōu)化等優(yōu)化外,還可以使用混淆器(Obfuscator)進(jìn)行程序打包后的優(yōu)化。</p><p><b>  3.1.

31、9人性化</b></p><p>  游戲的結(jié)束、開始、動態(tài)信息畫面作為構(gòu)成一個(gè)程序都是必不可少的重要部分。良好的用戶界面更是吸引用戶的硬指標(biāo),相關(guān)的美術(shù)構(gòu)圖和人性化設(shè)置也需要有一定的考慮。</p><p>  以上相關(guān)技術(shù)細(xì)節(jié)和整體流程將分別在以下小節(jié)闡述。</p><p><b>  3.2 程序流程</b></p>

32、;<p>  MIDlet suite是MIDP應(yīng)用程序的最小單位,JAM負(fù)責(zé)將手機(jī)內(nèi)的MIDlet suite以圖形化的方式呈現(xiàn),讓用戶能夠選取欲執(zhí)行的MIDlet suite,一旦選取了某個(gè)MIDlet suite,操作系統(tǒng)就會激活KVM執(zhí)行里面的MIDlet。MIDlet及相關(guān)的支持類組成了MIDP應(yīng)用程序的實(shí)際內(nèi)容。而每個(gè)MIDlet都必須繼承Javax.microedition.midlet.MIDlet這個(gè)抽象

33、類。在MIDP規(guī)范中定義了MIDlet的生命周期,以及可以存在的三種狀態(tài),包括Paused、Active以及Destroyed,每一個(gè)MIDlet在任何時(shí)刻只可能處于其中的一個(gè)狀態(tài)。這三種狀態(tài)的轉(zhuǎn)換關(guān)系如圖3-1所示:MIDlet有三個(gè)狀態(tài),分別是pause、active和destroyed。在啟動一個(gè)MIDlet的時(shí)候,應(yīng)用管理軟件會首先創(chuàng)建一個(gè)MIDlet實(shí)例并使得他處于pause狀態(tài),當(dāng)startApp()方法被調(diào)用的時(shí)候MIDl

34、et進(jìn)入active狀態(tài),也就是所說的運(yùn)行狀態(tài)。在active狀態(tài)調(diào)用destroyApp(boolean unconditional)或者paus</p><p>  本程序采用面向?qū)ο蟮脑O(shè)計(jì)模式,對游戲中的所有物體賦予對象的概念和屬性。運(yùn)行程序后允許用戶選擇執(zhí)行選項(xiàng)菜單,在開始游戲后將先從外部文件載入地圖文件,對背景的所有物體進(jìn)行繪圖。在主程序運(yùn)行的線程中,畫面刷新將以一定的頻率采用雙緩沖技術(shù)對屏幕重繪,實(shí)時(shí)

35、反映整個(gè)游戲的進(jìn)行狀態(tài)。</p><p>  游戲開始后先繪制地圖,并將各個(gè)對象實(shí)例化。在主程序運(yùn)行的線程中,游戲中所有的對象都應(yīng)該運(yùn)行在同一個(gè)線程下。當(dāng)敵人或者用戶的子彈達(dá)到射程范圍后,并不刪除子彈對象,而是使用setVisable(false)使其不能顯示,當(dāng)用戶或敵人在次發(fā)射子彈時(shí),只需使用setVisable(true)設(shè)置成可以顯示即可。在屏幕重繪的主程序中,將在每次的循環(huán)中判斷若干事件,以便程序進(jìn)入相

36、關(guān)的分支執(zhí)行相關(guān)的反應(yīng)代碼。如:玩家剩余坦克數(shù)是為0、敵人、玩家坦克是否被擊中、屏幕上相關(guān)信息的繪制等。</p><p>  程序?yàn)樾枰瓿瑟?dú)立功能的模塊設(shè)置了單獨(dú)的類。lzhhdm類繼承自Midlet,gameScrenn類、MenuScreen類繼承自GameCanvas,mybullets繼承自Sprite類。載入程序后首先啟動的是程序介紹的信息畫面。點(diǎn)擊ok后調(diào)用MenuScreen類實(shí)現(xiàn)菜單。</

37、p><p>  如果選擇進(jìn)入游戲,則調(diào)用gameScreen類,并且中止MenuScreen類中的線程運(yùn)行,已提高運(yùn)行速度。Mybullets類為玩家子彈類。</p><p>  3.3 Canvas類</p><p>  為了能有程序開發(fā)人員控制接口的外觀和行為,需要使用大量的初級用戶接口類,尤其在游戲程序中,幾乎完全依賴的就是Canvas抽象類進(jìn)行繪圖。從程序開發(fā)的

38、觀點(diǎn)看,Canvas類可與高級Screen類交互,程序可在需要時(shí)在Canvas中摻入高級類的組件。Canvas提供了鍵盤事件、指點(diǎn)桿事件(如果設(shè)備支持),并定義了允許將鍵盤按鍵映射為游戲控制鍵的函數(shù)。鍵盤事件由鍵代碼指定,但這樣控制游戲會導(dǎo)致缺乏通用性,并不是每個(gè)設(shè)備的鍵盤布局都適合游戲的操作。應(yīng)當(dāng)將鍵代碼轉(zhuǎn)換為游戲鍵的代碼,以便硬件開發(fā)商能定義他們自己的游戲鍵布局。</p><p>  3.4 Graphics

39、類</p><p>  Graphics類提供了簡單的2D繪圖功能。它具有24位深度色彩的繪制能力,以三原色分別各占一個(gè)字節(jié)表示其顏色。程序只能在paint()函數(shù)中使用Graphics繪制,GameCanvas可調(diào)用getGraphics()函數(shù)直接繪制在緩沖區(qū)上,可以在任何時(shí)間請求傳輸?shù)角芭_。其對象會被傳給Canvas的paint()函數(shù),以便最終顯示。</p><p>  3.5 M

40、IDP1.0技術(shù)下的繪制背景技術(shù)</p><p>  在沒有MIDP2.0前,進(jìn)行游戲繪圖一般需要手動編程使用雙緩沖。需要在paint()方法內(nèi)將所想要畫的圖形畫在一張預(yù)先準(zhǔn)備好的背景上,等所有繪圖操作都完成后再將背景的數(shù)據(jù)拷貝到實(shí)際的屏幕上。Image類提供了一個(gè)建立背景的靜態(tài)方法createImage(int width, int height),再利用getGraphics()方法取得屬于這個(gè)背景的Grap

41、hics對象,所進(jìn)行的繪圖操作都會作用在背景上,等到全部的繪圖操作完成后,再調(diào)用drawImage()方法將背景的數(shù)據(jù)復(fù)制到實(shí)際顯示的屏幕上。</p><p>  這樣的技術(shù)在繪制動畫時(shí)特別有用。繪制動畫時(shí)經(jīng)常需要不斷地更新畫面,而更新畫面的操作就是先將屏幕以fillRect()的方式清除,再將下一張圖片畫在屏幕上,然而反復(fù)的清除及重繪會造成屏幕的閃爍現(xiàn)象(flicker),因此使用雙重緩沖的好處就是在背景進(jìn)行這

42、個(gè)清除及重繪的操作,再將完成的繪圖拷貝到屏幕上,由于用戶看不到清除的操作,因此就不會出現(xiàn)閃爍的現(xiàn)象了。不過在某些MIDP的實(shí)現(xiàn)上已經(jīng)加上了雙重緩沖的支持,因此在處理前應(yīng)先利用Canvas類的isDoubleBuffer()方法來判斷。</p><p>  3.6 MIDP2.0新增的GameCanvas包</p><p>  J2ME的流行促進(jìn)幾個(gè)運(yùn)營商和制造商開發(fā)了一些支持游戲的類,但是

43、,這卻造成了游戲缺乏可移植性的問題,例如,很難將使用Siemens的Sprite類的游戲移植到Nokia上。</p><p>  在MIDP2.0版本發(fā)布后,這些游戲移植性問題初步得到了解決。MIDP2.0新加入了GameCanvas、Sprite、Layer、LayerManager、TiledLayer五個(gè)與游戲開發(fā)相關(guān)的類。其中 Layer類一般不會直接用到。</p><p>  G

44、ame類的出現(xiàn)不僅降低了錯(cuò)誤出現(xiàn)的幾率,也使游戲代碼變的更小,因?yàn)殚_發(fā)者不需要自己編寫象Sprite這種例子。</p><p>  下面將簡要介紹Game類。</p><p>  GameCanvas類繼承自Canvas,所以具有Canvas所具有的功能,還額外增加了一些便于游戲設(shè)計(jì)的功能。比如: GameCanvas類直接提供了getKeyStates(),使程序員可以在同一個(gè)線程自己偵

45、測按鍵的狀態(tài)。GameCanvas類提供了flushGraphics()的功能,實(shí)現(xiàn)了雙緩沖技術(shù)。</p><p>  所謂的Sprite,就是畫面上獨(dú)立移動的圖形。Sprite類是繼承自Layer的用于存儲多楨的基本可視元素。不同的frame可交相顯示,構(gòu)成動態(tài)的效果。圖片可翻轉(zhuǎn)、顛倒、由一個(gè)主角圖片就可以方便的得到所有方向的顯示狀態(tài),相比原先只能使用Canvas繪圖,需要將所有方向的主角圖象都繪制在png圖象

46、中簡化了許多。Sprite也可以從整合的圖象中讀圖,讀圖時(shí)將把大圖分解為若干等寬等高的小圖。每個(gè)小圖按照其排列順序有相應(yīng)的序號,在程序中調(diào)用其序號,就可以繪制出相應(yīng)的圖片。本程序中的雙方坦克、子彈、白云都由Sprite繼承得到。</p><p>  LayerManager提供控制整體畫面層的控制。它包括了一系列自動獲取了代號和位置的層,簡化了各層加入游戲畫面的過程,提供了自動排序和繪制的能力。</p>

47、;<p>  LayerManager存儲了一個(gè)層的列表,新的層可以用函數(shù)附加、刪除和插入。層的序號相當(dāng)于坐標(biāo)的Z軸,0層表示最接近用戶視覺,層數(shù)越高,離用戶越遠(yuǎn)。層號總是連續(xù)的,即使有中間的層被移除,其他層的序號會作相應(yīng)的調(diào)整以保持整體的完整性。LM中的View Window控制著與LM相對坐標(biāo)的可視區(qū)域。改變View Window的位置可以制造出滾動屏幕的效果。</p><p>  TiledL

48、ayer是有一組圖象格元素組成的整塊虛擬圖象。該類使不需要高分辨率的圖象就能創(chuàng)建大幅圖面成為可能。這項(xiàng)技術(shù)通常應(yīng)用在2D游戲平臺的滾動背景的繪圖。一塊整圖可被分割成等大小的圖象格,每塊格有其對應(yīng)的序號,按照行列遞增。多塊小格可由大塊同時(shí)替換組合而模擬動態(tài)的背景,這不需要逐塊替換所有的靜態(tài)圖象格而顯得非常方便。</p><p>  3.7 PNG圖片格式</p><p>  PNG(Port

49、able Network Graphics)格式是MIDlet唯一支持的圖象格式,PNG具體格式由PNG Specification,Version 1.0定義的。PNG格式提供透明背景的圖象,這對繪制游戲畫面和被操縱主角極有幫助。坦克之間或與白云碰撞時(shí)就不會因?yàn)楸尘坝刑囟ǖ念伾@示出的效果像貼上的圖片而缺乏真實(shí)感,物體之間輕微重疊時(shí)最上層圖片也不會覆蓋超過其有效象素外的部分。</p><p>  PNG格式圖

50、片中包含許多定義其圖片特性的冗余部分(Chunks)。這些代碼包含在每一個(gè)單獨(dú)的png格式圖象中,然而如果將多個(gè)png圖象合并在一張幅面稍大一些的整圖中,多個(gè)chunks就可以得到精簡,圖片的大小可以得到控制。使用Image類中的createImage函數(shù)可從整圖中分割出所需要的元素。在Game包中的TiledLayer和Sprite類都整合了這樣的功能。本程序中的地圖元素都集成在一張beijing.png圖片中,實(shí)現(xiàn)了方便的管理和程序

51、體積的精簡。</p><p>  3.8 玩家的控制方式和敵人方的智能運(yùn)行</p><p>  GameCanvas提供getKeyStates函數(shù)可獲取當(dāng)前鍵盤上的信息。將以位的形式返回鍵盤上所有鍵的按與釋放的狀態(tài),當(dāng)bit為1時(shí),按鍵就是被按下的狀態(tài),為0時(shí)則為釋放狀態(tài)。只需要此一個(gè)函數(shù)的返回值就可以返回所有鍵的狀態(tài)。這保證了快速的按鍵和釋放也會被循環(huán)所捕捉。同時(shí),這樣的機(jī)制也可檢測到

52、幾個(gè)鍵同時(shí)按下的狀態(tài),從而提供斜向運(yùn)行等相應(yīng)功能(本程序沒有實(shí)現(xiàn)斜上運(yùn)行功能)。</p><p>  程序運(yùn)行時(shí)應(yīng)該對玩家是否開出屏幕的范圍進(jìn)行檢測,如果開出屏幕,就應(yīng)該重新設(shè)定玩家的位置。</p><p>  玩家坦克被擊中后,為了平衡游戲的可玩性,玩家將有短暫時(shí)間無敵,即不進(jìn)行碰撞檢測,同時(shí)在屏幕右上角顯示無敵時(shí)間。</p><p>  根據(jù)游戲設(shè)定,敵人不能與

53、玩家坦克重合,則他每走一步都需要檢測一下是否與玩家碰撞。Sprite類中提供了collidesWith函數(shù),用于判斷是否與某個(gè)Sprite、TiledLayer、Image的對象有圖象上的重合(即游戲中的碰撞)。同理,還需要檢測玩家子彈與敵軍、敵軍與玩家子彈是否碰撞。如果發(fā)生碰撞,將相關(guān)精靈圖片替換為爆炸圖片。</p><p>  敵人需要具有一定的智能性,以便對玩家攻擊,使游戲具有一定的可玩性。敵人可以在適當(dāng)時(shí)

54、候轉(zhuǎn)向或者開炮火,同時(shí),程序應(yīng)該檢測敵軍是否開出了界外。在普通敵軍中,有一組敵軍的其中一輛具有跟蹤功能,其原理為:當(dāng)其進(jìn)入屏幕后,根據(jù)玩家坦克的X、Y坐標(biāo)不斷調(diào)整自己的X、Y坐標(biāo),已達(dá)成跟蹤的效果。由于線程的關(guān)系,敵軍的改變方向有時(shí)并不是實(shí)時(shí)的,這就可以使玩家有躲開撞擊的可能,增強(qiáng)了游戲的可玩性。</p><p>  在游戲進(jìn)行中出現(xiàn)的大型飛機(jī)為BOSS,由于其不可能立即被擊落,所以應(yīng)該設(shè)置其的運(yùn)行方法,理論上講

55、還是根據(jù)玩家坦克的坐標(biāo),但是,在此設(shè)置一個(gè)標(biāo)志位,使得敵人在取得玩家位置后即開始玩家方向運(yùn)動,這期間,將不執(zhí)行取得玩家位置重設(shè)方向的步驟。這樣做,使得大BOSS飛機(jī)的運(yùn)行具有不確定性。</p><p>  3.9 子彈的運(yùn)行和控制</p><p>  玩家的子彈是個(gè)精靈數(shù)組,有9個(gè)元素,表示玩家一次最多可以發(fā)射3組9發(fā)子彈,對于一個(gè)完整的游戲來講,應(yīng)該根據(jù)關(guān)卡的不同而給予玩家不同的坦克,坦

56、克性能的差別在于子彈的射程不同。由于本游戲僅有一關(guān),所以子彈速度設(shè)定的差別沒有體現(xiàn)出來。當(dāng)玩家一次發(fā)射了3組子彈,而這3組子彈并沒有消失時(shí),玩家將無法發(fā)射子彈。</p><p>  使用每組子彈的第一發(fā)作為與敵人進(jìn)行碰撞檢測的精靈,同時(shí)相關(guān)的標(biāo)志位也設(shè)在第一發(fā)子彈中。如果玩家子彈與敵機(jī)相撞,則敵機(jī)消失時(shí),子彈精靈的圖片替換為爆炸圖片,直到第二次發(fā)射該組子彈時(shí),才將圖片替換為子彈圖片。</p><

57、;p>  3.10 內(nèi)存的優(yōu)化</p><p>  手機(jī)內(nèi)存空間小,所以在程序設(shè)計(jì)時(shí)應(yīng)該注意以下幾點(diǎn),以盡量減少內(nèi)存的使用:</p><p>  (1)盡量縮短命名的長度。在應(yīng)用程序內(nèi),對于所建立的類、接口、方法及變量名而言,都需要賦予一個(gè)識別的名稱,所命名的名稱每多一個(gè)字符就會在類文件內(nèi)多產(chǎn)生一個(gè)字節(jié),對于一個(gè)較復(fù)雜的應(yīng)用程序而言就會增加為數(shù)不小的數(shù)據(jù)量。所有這些可以借助混淆器來幫

58、助實(shí)現(xiàn)</p><p>  (2)所有代碼寫為一個(gè)類。</p><p>  (3)只使用一個(gè)線程。</p><p>  (4)盡量不使用靜態(tài)變量。</p><p>  (5)將PNG圖片合并成一張,減少圖形數(shù)據(jù)的大小。將PNG格式的小分辨率圖象合并在一張大的高分辨率圖象中,由于減少了頭文件的大小,將比合并前的總大小減少許多。</p>

59、;<p>  3.11 內(nèi)存檢測器</p><p>  Wireless Tool Kit提供了許多在運(yùn)行時(shí)監(jiān)視運(yùn)行狀態(tài)的工具。 包括內(nèi)存狀況的檢測(手機(jī)上的內(nèi)存空間十分有限,必須時(shí)刻關(guān)注機(jī)載內(nèi)存是否大于程序所能使用到的最大可能的內(nèi)存空間),網(wǎng)絡(luò)狀況的檢測,運(yùn)行函數(shù)的跟蹤等。 內(nèi)存檢測器是內(nèi)存跟蹤測試隨時(shí)間變化的調(diào)試器。其中,允許強(qiáng)制垃圾回收(Garbage Collection)。由于Java語言

60、中,不像許多其他的如C++語言,不需要指定回收函數(shù)中特定不使用的資源,資源回收機(jī)制將自動清空無效變量占用的空間。在程序運(yùn)行中也可以調(diào)用System類的gc()函數(shù)手動收回廢棄的內(nèi)存。</p><p>  3.12 關(guān)于混淆器</p><p>  Java 語言并沒有完全編譯成二進(jìn)制可執(zhí)行文件,編譯出的.class文件是一種介于源程序和二進(jìn)制之間的一中基于半解釋的字節(jié)碼,需要虛擬機(jī)來執(zhí)行。它

61、包括了所有的信息。然而這樣會導(dǎo)致.class很容易被反編譯為源代碼,從而不能保護(hù)作者的知識成果。目前流行的如decode,JAD等反編譯工具可以以很快的速度生成源文件。如果不加以施行有效的措施,將造成嚴(yán)重的后果。由此引入混淆器的概念?;煜鲗⒋a中的所有變量、函數(shù)、類的名稱變?yōu)楹喍痰挠⑽淖帜复?,如果缺乏相?yīng)的函數(shù)名指示和程序注釋,即使被反編譯,也將難以閱讀。</p><p>  混淆器的作用不僅僅是保護(hù)代碼,它

62、也有精簡編譯后程序大小的作用。由于以上介紹的減少變量、函數(shù)的命名長度的關(guān)系,編譯后也會從.class文件中減少這些冗余的信息?;煜螅w積大約能減少25%,這對當(dāng)前費(fèi)用較貴的無線網(wǎng)絡(luò)傳輸是有一定意義的。</p><p><b>  3.13 本章小結(jié)</b></p><p>  第三章中介紹了程序的流程、相關(guān)技術(shù)的思想及其在本程序中的應(yīng)用。對游戲基本算法等做了詳細(xì)敘述

63、。具體算法的代碼實(shí)現(xiàn)和詳細(xì)流程將在下章介紹。</p><p>  4 程序分析和具體實(shí)現(xiàn)</p><p>  4.1 游戲進(jìn)入前的選擇</p><p>  每個(gè)MIDlet程序都必須有一個(gè)主類,該類必須繼承自MIDlet。它控制著整個(gè)程序的運(yùn)行,并且可以通過相應(yīng)函數(shù)從程序描述文件中獲取相關(guān)的信息。該類中擁有可以管理程序的創(chuàng)建、開始、暫停(手機(jī)中很可能有正在運(yùn)行程序卻

64、突然來電的情況,這時(shí)應(yīng)進(jìn)入暫停狀態(tài)。)、結(jié)束的函數(shù)。本程序主類為tkdz,并實(shí)現(xiàn)接口CommandLIstener。</p><p>  首先顯示的是游戲的背景介紹(圖4-1),為此,在類tkdz定義Form類對象a,在startApp()函數(shù)中判斷isSplash是否為真,如果為真的話,將創(chuàng)建Form類的實(shí)例a,并且調(diào)用append()方法在表單上放置StringItem類的實(shí)例以顯示游戲背景信息。使用語句ok

65、=new Command("ok",Command.OK,1);實(shí)例化用addCommand()命令建立ok命令與</p><p>  Form之間的關(guān)聯(lián),調(diào)用setCommandListener()命令使Form與CommandListener建立關(guān)聯(lián)。調(diào)用Displayable的seturrent()函數(shù)顯示背景介紹窗口。 </p><p>  當(dāng)玩家點(diǎn)擊ok后將

66、調(diào)用display.setCurrent(menuscreen)以顯示游戲菜單menuscreen(圖4-2)類menuscreen繼承自Canvas類,并實(shí)現(xiàn)接口Runnable和CommandListener。在類menuscreen中定義了lowColor和highColor、highBGColor三個(gè)整型變量及布爾型變量co。其中l(wèi)owColor賦值為0x000000FF,代表蘭色,higColor賦值為0x00FF0000,代

67、表紅色,highBGColor賦值為0x00CCCCCC,代表蘭灰色,即背景條。當(dāng)玩家按住上或下鍵時(shí),在函數(shù)keyPressed(int code)中的整型變量menuIndex相應(yīng)的減1或加1,相應(yīng)的,在paint()函數(shù)中會根據(jù)menuIndex繪制選項(xiàng)是否被選中。在函數(shù)run()中,如果co為真,則不停的repaint(),設(shè)置co的意義在于,當(dāng)進(jìn)入游戲主畫面后,co賦值為false,以終止繪制選項(xiàng)的repaint(),提高游戲速

68、度。當(dāng)移動選項(xiàng)條到某項(xiàng),并點(diǎn)擊ok時(shí),在commandAction()方法中根據(jù) menuIndex的</p><p>  圖4-3 圖4-4</p><p>  4.2 mybullets類 </p><p>  在介紹游戲主類gameScreen類之前,應(yīng)該先簡要說明一下玩家子彈類mybul

69、lets類,實(shí)際上,mybullets類是應(yīng)該刪除的,其要實(shí)現(xiàn)的功能應(yīng)該放在gameScreen類中,但是由于設(shè)計(jì)游戲的過程也是一個(gè)學(xué)習(xí)的過程,而在當(dāng)時(shí),我并沒有意識到這一點(diǎn)。 </p><p>  Mybullets類繼承自Sprite類,以實(shí)現(xiàn)玩家子彈的相關(guān)功能。首先,創(chuàng)建子彈狀態(tài)數(shù)組private int[][] bull

70、ets,其中,[i][0]代表子彈的X坐標(biāo),[i][1]代表子彈的Y坐標(biāo),[i][2]代表子彈Y方向速度,[i][3]代表子彈存活狀態(tài)(由于此類是在早期設(shè)計(jì)的,而之后子彈存活狀態(tài)使用了子彈射程作為標(biāo)志位,所以其并沒有起到作用。</p><p>  mybullets類在gameScreen中建立了對象數(shù)組huokebullet[9],代表玩家所能發(fā)射的9發(fā)子彈。</p><p>  4.3

71、 游戲邏輯及gameScreen類</p><p>  gameScreen類是游戲的主類,決定著敵人何時(shí)出現(xiàn),控制著敵人出現(xiàn)的方法,判斷敵人及玩家是否被擊中等。它運(yùn)行在獨(dú)立的線程中,以恒定的頻率刷新畫面。本程序設(shè)置為1/20秒。其主邏輯如圖4-4所示。 </p><p>  4.3.1 gameScreen類所實(shí)現(xiàn)的功能</p><p>  gameScreen

72、類要實(shí)現(xiàn)地圖的滾動、敵軍的相關(guān)屬性、玩家的相關(guān)屬性等功能。gameScreen類包括了LayerManager,這樣所有靜態(tài)和動態(tài)的圖象都不需要手動刷新,只需要在LayerManager中加入所有的需要控制的精靈,在統(tǒng)一由LayerManager刷新即可, 因此,在gameScreen中創(chuàng)建LayerManager的對象lm,并在構(gòu)造函數(shù)中實(shí)例子化。</p><p>  其他精靈類的對象如敵軍、玩家、玩家的子彈、

73、敵人的子彈、BOSS及BOSS所屬的子彈都需在gameScreen()類中建立相應(yīng)的對象,并在構(gòu)造喊數(shù)中實(shí)例化,且由lm.appned()方法添加到LayerManager類對象lm中。</p><p>  4.3.2 地圖的創(chuàng)建</p><p>  由于手機(jī)存儲空間的限制,不可能將整張地圖完整地存儲在手機(jī)中,為了節(jié)約空間,往往提出地圖中相同的圖片組成一張PNG格式的圖片,然后象拼圖一樣拼

74、出地圖來,專業(yè)的游戲設(shè)計(jì)者往往自己寫一個(gè)地圖編輯器,以使拼圖過程不是那么痛苦。 </p><p>  創(chuàng)建地圖就需要使用TiledLayer。TiledLayer指的是由一塊一塊類似用瓷磚拼湊起來的畫面。地圖實(shí)際即為TiledLayer的一個(gè)對象。先利用TiledLayer的構(gòu)造函數(shù)建立TiledLayer,根據(jù)構(gòu)造函數(shù)的參數(shù)可以給定Cell數(shù)組 的大小,并且地圖圖片切割成等尺寸的畫面,并調(diào)用setCell()設(shè)

75、置具體的圖象格內(nèi)容,地圖圖片如圖4-5所示。</p><p><b> ?。▓D4-5)</b></p><p>  因此,創(chuàng)建一個(gè)返回TtiledLayer的方法createBackGround(),以便在gameScreen()的構(gòu)造函數(shù)中調(diào)用。在方法中,定義整型數(shù)組map1[]以存儲Cell的索引值。并使用tiledLayer.setCell(column,row

76、,map1[i])設(shè)定TtiledLayer的內(nèi)容,以形成地圖。其中i的值由循環(huán)for(int i=0;i<map1.length;i++)取得,column由語句column=i%15取得、行由row=(i-column)/15取得。</p><p>  畫出地圖后,由lm.append()將地圖添加到LayerManager類對象lm中。由于地圖位于Layer的最低層,即離用戶視線最遠(yuǎn)的層,所以Tile

77、dlayer最后一個(gè)被添加到lm中。</p><p>  4.3.3地圖的移動 </p><p>  根據(jù)游戲的設(shè)定,游戲中地圖是向下移動的,實(shí)現(xiàn)此功能的方法如下:首先,在使用createBackGround()函數(shù)創(chuàng)建地圖數(shù)組時(shí),用(row+1)*16-getHeight()語句對整型變量row2賦值,其中row+1代表地圖有多少列,16為地圖片的高度,而減去getHeight()是

78、因?yàn)橐舫鲆粋€(gè)屏幕的可視區(qū)域,由于J2ME規(guī)定坐標(biāo)系中下方向?yàn)檎允褂谜Z句y1=-row2將row2的數(shù)值變?yōu)樨?fù)數(shù)。其次render()函數(shù)中,使用lm.setViewWindow(0,0,getWidth(),getHeight()+10000)設(shè)定可視區(qū)域的范圍,(0,0)表示View Window的起始坐標(biāo),(getWidth() ,getHeight()+10000)使用lm.paint(g,0,y1)決定View Win

79、dow從屏幕的哪里畫起。在run()函數(shù)中的while(conti)中,使用語句y1=y1+1使得每次繪圖都使地圖下移1個(gè)象素。</p><p>  4.3.4 gameScreen類的構(gòu)造函數(shù)</p><p>  gameScreen類的構(gòu)造函數(shù)要將游戲中出現(xiàn)的所有精靈都實(shí)例化,實(shí)際上,這種方法嚴(yán)重的占用了內(nèi)存,但在當(dāng)時(shí),我并沒有意識到這一點(diǎn)。由于敵人要求不停的出現(xiàn),但是不可能設(shè)置過多的

80、精靈,解決的辦法是設(shè)定6個(gè)Sprite類對象j0、j1、j2及jbullet1、jbullet1、jbullet2,分別代表三架敵機(jī)及其配屬的子彈。所以在gameScreen類的構(gòu)造函數(shù)分配這6個(gè)Sprite類的存儲空間,并且使用new Sprite(Image img, int width,int height)實(shí)例化這6個(gè)類變量。同關(guān)尾cboss與游戲進(jìn)行中的大飛機(jī)其他的Sprite類對象都需要使用相同的方法實(shí)例化。同樣處于節(jié)約內(nèi)存

81、的考慮,sboss與cboss同用3個(gè)Sprite類對象bossbullet0,1,2。</p><p>  在構(gòu)造函數(shù)中,定義boolean型變量conti=true。conti的作用在于控制是否進(jìn)行游戲畫面的重繪及其他需要在畫面重繪前進(jìn)行的運(yùn)算。</p><p>  在構(gòu)造函數(shù)中,將mybullets類里的no和score初始化,現(xiàn)在看來no的初始化沒有必要,但是score的初始化是必

82、須的,因?yàn)檫@個(gè)變量存儲著玩家每次游戲的成績,如果不在此進(jìn)行初始化,則玩家重新開始游戲后score并不歸0。</p><p>  4.3.5 關(guān)于commandAction()方法</p><p>  每個(gè)創(chuàng)建Command實(shí)例的J2ME的應(yīng)用程序也必須創(chuàng)建實(shí)現(xiàn)CommandListener接口的實(shí)例。每當(dāng)用戶通過commandAction()方法的方式與命令進(jìn)行交互的時(shí)候,就會通過Comm

83、andLIstener.所以實(shí)現(xiàn)CommandListener的類必須實(shí)現(xiàn)commandAction()方法。</p><p>  在commandAction()方法中,使用getabel()方法獲取命令的標(biāo)簽。如果getLabel()=“暫停”時(shí),表示玩家點(diǎn)擊了暫停鍵,此時(shí),conti賦值為false,游戲畫面的繪制及游戲相關(guān)的運(yùn)算暫停,并且,使用removeCommand(c)語句將“暫停”移除,使用add

84、Command(new Command("繼續(xù)",Command.OK,2));將”繼續(xù)“按紐”添加進(jìn)來。當(dāng)玩家點(diǎn)擊“繼續(xù)“時(shí),conti賦值為true,并且,一定要調(diào)用start()方法,否則繼續(xù)功能不可用。必須調(diào)用start()方法的原因是:J2ME的線程已stop()方法拿掉,如果想停止線程的運(yùn)做,就必須依靠一個(gè)旗標(biāo)(flag),在本程序中,flag就是boolean型變量conti。所以一旦此標(biāo)識變量被設(shè)為f

85、alse,那么while(conti)循環(huán)就會結(jié)束,線程也會跟著結(jié)束。當(dāng)用戶按下“繼續(xù)”的時(shí)候,start()將重新產(chǎn)生一個(gè)線程繼續(xù)執(zhí)行相關(guān)的運(yùn)算和畫面繪制。</p><p>  當(dāng)玩家通關(guān)時(shí)或者任務(wù)失敗時(shí),將顯示相應(yīng)信息,并使用上面的方法將“暫?!辨I變?yōu)椤胺祷亍辨I盤,當(dāng)點(diǎn)擊“返回”鍵時(shí),將返回主菜單選項(xiàng),調(diào)用類tkdz里的方法menuscreensecond(),在此方法中,實(shí)例化一個(gè)MenuScreen類對象

86、,并且使選項(xiàng)“新游戲”改變?yōu)椤敝匦麻_始“(圖4-6)。完成此項(xiàng)功能的語句子為MenuScreen.mainmenu[0] =”重新開始”。當(dāng)選擇”重新開始“時(shí),使用gamescreen=new gameScreen(this)將使所有變量重新被初始化,如地圖的繪制、敵人出現(xiàn)位置的重置、敵人的數(shù)量、玩家的當(dāng)前位置等。使用gamescreen.start()重新開始程序的循環(huán)。</p><p>  圖4-6

87、 圖4-7</p><p>  圖4-7 圖4-8</p><p>  4.3.6 Sprite類對象的碰撞檢測及相關(guān)屬性</p><p>  游戲進(jìn)行中,即在while(conti){ }中,需要進(jìn)行玩家、子彈與敵軍及敵軍子彈與玩家的碰撞檢測

88、,即使用函數(shù)collidesWith(Sprite,boolean)。由于設(shè)計(jì)的問題,玩家發(fā)射的子彈與普通敵機(jī)的碰撞檢測被寫在了mybullets類中,并且只檢測第一發(fā)子彈是否與敵人相碰撞,如果碰撞為真時(shí),則使用setVisible(false)函數(shù)將敵機(jī)隱藏,使用setImage()函數(shù)將子彈精靈的三張圖片置換為爆炸圖片。當(dāng)敵人剩余敵軍消失后,即所有的敵人都開出了屏幕后,使用函數(shù)setVisible(true)將敵機(jī)重新設(shè)置為可見。在

89、按“開火”鍵時(shí),使用setImage()函數(shù)將huokebullets重新設(shè)定為子彈圖片。</p><p>  敵軍與玩家的碰撞檢測原理同上,都是使用的collidesWith()函數(shù),遺憾的是,我在寫這段代碼的時(shí)候,并沒有考慮設(shè)置玩家有4次機(jī)會,所以對敵軍setVisable(fasle)了,而將玩家的坦克換成了爆炸圖片,之后,添加了玩家4次機(jī)會這個(gè)功能,由于玩家被擊落后會重新從屏幕下方進(jìn)入屏幕,所以爆炸的圖片

90、一閃而過,效果不是很好。</p><p>  4.3.7 玩家4次游戲機(jī)會的實(shí)現(xiàn)方法</p><p>  根據(jù)游戲設(shè)置,玩家在每關(guān)中有共四次機(jī)會,當(dāng)玩家被擊中或撞擊爆炸后,程序首先檢測整型變量playerno的值,并根據(jù)playerno的值決定屏幕右上角所畫玩家坦克標(biāo)志的數(shù)量(參考圖4-8),playerno的初始值設(shè)為3,因?yàn)榕鲎埠蟛艤p1,所以玩家共有4次機(jī)會,當(dāng)playerno<

91、;0時(shí),游戲結(jié)束,同時(shí)將變量pver賦值為1,render()或renderboss()函數(shù)中,over=1代表在屏幕上GAMEOVER等相關(guān)信息,同時(shí),將整型變量inputno賦植為1,以使手機(jī)的方向鍵失效,以消除玩家可以控制爆炸圖像移動這個(gè)BUG。同時(shí)整型變量pzbz賦植為1,以消除玩家爆炸圖像繼續(xù)與敵人進(jìn)行碰撞檢測這個(gè)BUG。</p><p>  當(dāng)playerno>0時(shí),碰撞后,將變量planert

92、賦值為1,在之后if(planert==1)判斷語句中,重新設(shè)定玩家坦克的圖片和可視狀態(tài),同時(shí)使用setPosition()函數(shù)設(shè)定玩家非的位置在屏幕下方。設(shè)定pzbz=1,即不檢測碰撞,玩家有短暫時(shí)間無敵,無敵時(shí)間由屏幕右上角進(jìn)度條表示。設(shè)定inputno=1,即開入屏幕的過程中手機(jī)鍵盤是不可以用的。設(shè)置planert=2,即以上這些設(shè)置只執(zhí)行一便。</p><p>  在if(planert==2)判斷語句中

93、,使用語句move(0,-2)使坦克自己向上運(yùn)動,使用if(c1.getY()<(planepo-24))判斷坦克是否到達(dá)屏幕最下方(planepo是屏幕下邊緣的坐標(biāo)),如條件為真,則將inputno設(shè)置為1,表示鍵盤可用,將planert賦值為3,使其不再執(zhí)行以上各步。</p><p>  4.3.8 input() </p><p>  input()函數(shù)的作用是檢測用戶的輸入。

94、首先使用if(inputno==0)判斷用戶的輸入是否被禁止,如為真,則用戶輸入不被禁止。其次,調(diào)用getKeyStates()查詢按鍵的狀態(tài)。當(dāng)玩家按方向鍵時(shí),玩家就向不同的方向運(yùn)行,這需要使用c1.move(int x,int y)函數(shù),當(dāng)玩家控制坦克向左或右開時(shí),需要使c1.setFrame()函數(shù)改變坦克的圖形(參見圖4-7)。同時(shí),還需要判斷坦克是否開出屏幕,如,當(dāng)坦克向右時(shí),用if(c1.getX()>(getWidt

95、h()-c1.getWidth()))語句判斷(getWith()為屏幕的寬度,c1.getWidth()為玩家c1的寬度),如果條件為真,則使用c1.setPosition((getWidth()-c1.getWidth()),c1.getY())語句將坦克設(shè)置在緊靠屏幕右邊的位置。上、下、左的設(shè)置原理同上。語句if((keystate&LEFT_PRESSED)==0)的作用是消除左、右運(yùn)行后在上、下運(yùn)行時(shí)坦克的形態(tài)不變的B

96、UG。如果為真,則執(zhí)行語句c1.setFrame(0),表示只要左鍵松開坦克的形態(tài)都是平開。</p><p>  根據(jù)游戲設(shè)定,玩家一次最多只能發(fā)三組子彈,并且子彈有射程限制(在類mybullets中使用整型變量no表示),而當(dāng)玩家按下“開火“鍵時(shí),即if((keystate&FIRE_PRESSED)!=0)中判斷條件為真時(shí),首先執(zhí)行循環(huán)語句for(int i=0;i<=6;i=i+3),即檢測3

97、組子彈中每組的第一發(fā),即0,3,6。其次,檢測huokebullet[i].no是否等于1,當(dāng)?shù)扔?時(shí)使用語句for( int z=i;z<i+3;z++)初始化該組子彈中的3發(fā)子彈,而設(shè)置子彈位置的函數(shù)應(yīng)該在if(huokebullet[i].no==1)語句外設(shè)置,因?yàn)楫?dāng)初設(shè)計(jì)的時(shí)候mybullets類里的函數(shù)寫成了一次設(shè)置三組子彈的形式。huokebullet[z].no=huokebullet[z].bulletheigh

98、t賦予子彈射程。當(dāng)程序循環(huán)運(yùn)行時(shí)no--,當(dāng)一次發(fā)射了三組子彈后,只有某一組子彈消失,即no等于1后才能繼續(xù)發(fā)射子彈?,F(xiàn)在看來,玩家發(fā)射子彈的設(shè)置是完全失敗的,降低了效率。</p><p>  4.3.9 render()和renderboss()</p><p>  在方法render()過程中,除了要重繪坦克、地圖、子彈外還要在上方繪制關(guān)卡信息、戰(zhàn)果、玩家坦克數(shù)、及無敵狀態(tài)時(shí)的無敵時(shí)間

99、、大BOSS生命條等。首先使用lm.setViewWindow()和lm.paint()設(shè)定可視范圍ViewWindow和從哪里畫起(見4.3.3)。</p><p>  其次,使用g.drawString()繪制屏幕上方的關(guān)卡信息、戰(zhàn)績、玩家剩余生命標(biāo)志。其中根據(jù)playerno的值繪出玩家的坦克標(biāo)志數(shù)(應(yīng)該有更好方法,但是沒有想到 )當(dāng)每次刷新繪圖頁面時(shí),應(yīng)使用GameCanvas的flushGraphics

100、()將屏幕后臺的緩沖區(qū)內(nèi)的圖像刷新到前臺來(flushGraphics()應(yīng)該寫在render(){ }的最后)。renderboss()方法重繪的是關(guān)尾的精靈cboss、相關(guān)信息等,與render()的區(qū)別在與于函數(shù)lm.paint(g,0,0),起始坐標(biāo)是不可變的,即,關(guān)尾的地圖背景是不可變的。實(shí)際上,renderboss()是完全不需要的,只要在render()函數(shù)中設(shè)置相關(guān)標(biāo)志位就可以解決關(guān)尾的繪圖問題。玩家坦克的生命標(biāo)志使用d

101、rawImage()就可以繪制在屏幕上了。</p><p>  4.4 游戲中的獎(jiǎng)勵(lì)及相關(guān)坦克的行為</p><p>  根據(jù)游戲設(shè)定,當(dāng)y1=-1000時(shí),會出現(xiàn)如圖4-8所示的飛機(jī)(sboss),當(dāng)玩家擊落他后,屏幕會顯示“援軍到達(dá)“,并且玩家剩余坦克數(shù)加1。使用 if((y1==-1000)&&(sbz==0)){ }設(shè)定sboss的初始位置,根據(jù)游戲設(shè)定,sboos

102、從屏幕上方倒飛入屏幕,所以sboss設(shè)定的初始位置(50,planepoup-65),其中planepoup為屏幕上邊緣的標(biāo)志位。最后,要將sbz賦值為1,消除sboos不停設(shè)置初始位置的BUG。當(dāng)sboss飛入屏幕后,將sbz賦值為2,以執(zhí)行下面</p><p>  的if(sbz==2)語句。</p><p>  在判斷語句if(sbz==2)里,將根據(jù)玩家的位置自動飛行。首先,根據(jù)玩

103、家坦克的位置對sbmove賦值,當(dāng)c1在sboos的上、下、左、右時(shí),其對應(yīng)的值為1、2、3、4在這4個(gè)if語句中,要設(shè)置標(biāo)志位(smovebz==0)。設(shè)置這個(gè)標(biāo)志位的目的是防止sboos根據(jù)c1的位置不停的改變運(yùn)行狀態(tài),即防止sboos成為跟蹤飛機(jī)。當(dāng)sboos根據(jù)c1的位置改變一次運(yùn)行方向后,smovebz賦值為1,即不檢測c1的位置。只有sboss運(yùn)行到屏幕的邊緣時(shí),才將smovebz重新賦值為0,使其可以再次通過c1的位置決定

104、sboos的運(yùn)行方向。</p><p>  當(dāng)玩家子彈擊中sboss后,使用sboss.setFrame(1),此時(shí)boss變紅,在本次repaint結(jié)束前,使用sboss.setFrame(0)使飛機(jī)變?yōu)楸緛眍伾绦蛟O(shè)定每1/20秒畫一次,由此得到飛機(jī)被擊中后變色的效果。(參見圖4-10)。sboos會根據(jù)玩家坦克的位置發(fā)射子彈,根據(jù)游戲設(shè)置,當(dāng)玩家在其上方、左方、右方時(shí),sboss一次發(fā)射1發(fā)子彈,而玩家

溫馨提示

  • 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論