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

下載本文檔

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

文檔簡介

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

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

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

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

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

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

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

8、t;<p>  作為第一個面對小型設備的Java應用開發(fā)規(guī)范,CLDC是由包括Nokia,Motorola和Siemens在內(nèi)的18家全球知名公司共同協(xié)商完成的。CLDC是J2ME核心配置中的一個,可以支持一個或多個profile。其目標主要面向小型的、網(wǎng)絡連接速度慢、能源有限(主要是電池供電)且資源有限的設備,如手機、PDA等。</p><p>  而CDC則是主要用于運算能力相對較佳、在電力供應

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

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

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

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

13、介紹了手機在無線應用方向的當今概況,并介紹了游戲業(yè)務在當前社會的發(fā)展?jié)摿?。分析了J2ME在手機軟件開發(fā)中起的重要作用,描述了本論文的相關背景。</p><p>  2.開發(fā)環(huán)境及相關技術的介紹</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語言特點</p><p>  2.2.1. 平臺無關性</p><p>  Java引進虛擬機原理,并運行于虛擬機,實現(xiàn)不同平臺之間的Java接口。Java的數(shù)據(jù)類型與機器無關。</p><p>  2.

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

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

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

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

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

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

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

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

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

25、gt;<p>  游戲程序是一項精度要求很高的程序系統(tǒng),因為其代碼利用率很高。</p><p>  一個實時運行的最終作品,每秒都會運行成千上萬行程序,繪圖事件、鍵盤事件都會以極高的頻率在后臺等待響應,若有絲毫的差別都將很容易導致程序在運行不久后可能出現(xiàn)嚴重錯誤,甚至死循環(huán)。因此,其邏輯設計應當相當嚴謹,需將所有可能發(fā)生的事件及意外情況考慮在設計中。</p><p><

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

48、ayer是有一組圖象格元素組成的整塊虛擬圖象。該類使不需要高分辨率的圖象就能創(chuàng)建大幅圖面成為可能。這項技術通常應用在2D游戲平臺的滾動背景的繪圖。一塊整圖可被分割成等大小的圖象格,每塊格有其對應的序號,按照行列遞增。多塊小格可由大塊同時替換組合而模擬動態(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格式提供透明背景的圖象,這對繪制游戲畫面和被操縱主角極有幫助。坦克之間或與白云碰撞時就不會因為背景有特定的顏色,顯示出的效果像貼上的圖片而缺乏真實感,物體之間輕微重疊時最上層圖片也不會覆蓋超過其有效象素外的部分。</p><p>  PNG格式圖

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

76、,map1[i])設定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的最低層,即離用戶視線最遠的層,所以Tile

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

78、因為要留出一個屏幕的可視區(qū)域,由于J2ME規(guī)定坐標系中下方向為正,所以使用語句y1=-row2將row2的數(shù)值變?yōu)樨摂?shù)。其次render()函數(shù)中,使用lm.setViewWindow(0,0,getWidth(),getHeight()+10000)設定可視區(qū)域的范圍,(0,0)表示View Window的起始坐標,(getWidth() ,getHeight()+10000)使用lm.paint(g,0,y1)決定View Win

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

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

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

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

83、andLIstener.所以實現(xiàn)CommandListener的類必須實現(xiàn)commandAction()方法。</p><p>  在commandAction()方法中,使用getabel()方法獲取命令的標簽。如果getLabel()=“暫?!睍r,表示玩家點擊了暫停鍵,此時,conti賦值為false,游戲畫面的繪制及游戲相關的運算暫停,并且,使用removeCommand(c)語句將“暫?!币瞥褂胊dd

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

溫馨提示

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

評論

0/150

提交評論