已閱讀5頁,還剩67頁未讀, 繼續(xù)免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
畢業(yè)論文 (設計 )用紙 佳木斯大學教務處 第 1 頁 1 緒論 1.1 手機軟件現(xiàn)狀 在信息社會中,手機及其他無線設備越來越多的走進普通百姓的工作和生活,隨著 信息網(wǎng)絡化的不斷進展,手機及其他無線設備上網(wǎng)絡勢在必行。但是傳統(tǒng)手機存在以下 弊端: 1. 傳統(tǒng)手機出廠時均由硬件廠商固化程序,程序不能增加、刪除,有了錯誤也不 能更新、修改,若要增加新功能必須另換一部手機。 2. 傳統(tǒng)手機訪問互聯(lián)網(wǎng)是通過 wap(wireless application protocal),所有網(wǎng)絡 資源必須接通網(wǎng)絡才能在線訪問,非常耗時、費用亦很高。 而 java 技術在無線應用方面的優(yōu)勢非常明顯: 1. 應用程序可按需下載,而不是購買由硬件商提供的套件,可升級空間大。 2. java 技術提供了一個類庫,它使的應用開發(fā)商可以創(chuàng)建更為直覺、豐富的用戶 界面(gui); 3. java 技術使網(wǎng)絡帶寬的應用更為有效,因為應用程序可以下載到器件上,并在 本地運行,僅僅是在連接到服務器時才會占用網(wǎng)絡帶寬。 基于以上分析,java 手機將是未來手機的發(fā)展方向,是業(yè)界的熱點。 1.21.2 j2mej2me 介紹介紹 雖然 java 已經(jīng)被用到許多企業(yè)級軟體上,可是其實骨子里面還是非常適合用在嵌 入式系統(tǒng)之中。java 平臺演進到 java2 后,java 平臺分別針對不同領域的需求被分成四 個版本,亦即 j2ee、j2se、j2me 以及 javacard。其中 j2me 定位在消費性電子產品的應 用上。這個版本針對資源有限的電子消費產品的需求精簡核心類庫,并提供了模塊化的 架構讓不同類型產品能夠隨時增加支持的能力。這個版本的應用層面相當廣泛,會是未 來 java 平臺發(fā)展的重點項目。 j2me 在 1999 年的 javaone 開發(fā)人員大會上初次亮相,它的目標是面向智能無線設備 和小型計算機設備的開發(fā)人員。j2me 的一個關鍵優(yōu)點是,j2me 與所有支持 java 的設備 都是兼容的。支持 java 的設備就是任何運行 java 虛擬機器的計算機。motorola、nokia 等生產廠商都生產支持 java 的設備。、 j2me 平臺是由配置(configuration)和簡表(profile)構成的。配置是提供給最 畢業(yè)論文 (設計 )用紙 佳木斯大學教務處 第 2 頁 大范圍設備使用的最小類庫集合,在配置中同時包含 java 虛擬機。簡表是針對一系列設 備 提供的開發(fā)包集合。在 j2me 中還有一個重要的概念是可選包(optional package),它 是針對特定設備提供的類庫,比如某些設備是支持藍牙的,針對此功能 j2me 中制定了 jsr82(bluetooth api)提供了對藍牙的支持。 目前,j2me 中有兩個最主要的配置,分別是 connected limited devices configuration(cldc)和 connected devices configuration(cdc)。 作為第一個面對小型設備的 java 應用開發(fā)規(guī)范,cldc 是由包括 nokia,motorola 和 siemens 在內的 18 家全球知名公司共同協(xié)商完成的。cldc 是 j2me 核心配置中的一個, 可以支持一個或多個 profile。其目標主要面向小型的、網(wǎng)絡連接速度慢、能源有限(主 要是電池供電)且資源有限的設備,如手機、pda 等。 而 cdc 則是主要用于運算能力相對較佳、在電力供應上相對比較充足的嵌入式裝置 (比方說冷氣機、電冰箱、電視機機頂盒 (set-top box) 1.31.3 手機游戲應具有的特征手機游戲應具有的特征 一個手機游戲應該具有以下特征: 易于學習: 既然手機游戲面向的是普通消費者而不是計算機專家,那么他們不可能 深入的學習游戲技巧。消費者不會花幾個小時去研究一個 3 元的手動操作的游戲。保持 游戲的簡單是最基本的要求。 可中斷性: 多任務處理是手機生活方式的基本特征。手機用戶常常在任務(如等一 個電子郵件或者等車)之間有一小段時間。而游戲、日歷管理、通訊和工作數(shù)據(jù)訪問使 用的是同一個設備。所以一個好的手機游戲應該提供短時間的娛樂功能,并且允許用戶 在游戲和工作模式之間順利切換。 基于訂閱:手機游戲的盈利成功取決于他們巨大的使用量。一開始開發(fā)和設計每個 游戲都是昂貴的。如果一個手機游戲開發(fā)者要贏利的話,重要的是:同一個游戲引擎, 多個標題,基本的故事情節(jié)類似?;谟嗛喌挠螒蚴遣粩喈a生收入的最好方法。 豐富的社會交互: 不管一個游戲設計得多好,只要玩家找到了它的根本模式或者玩 完了所有的游戲路徑很快就會厭煩這個游戲。對于一個基于訂閱的游戲,重要的是與別 的玩家合作以增強所玩游戲的智力和隨機性。在今天紛繁復雜的多玩家游戲中具有豐富 社會交互的游戲證明是成功的。 畢業(yè)論文 (設計 )用紙 佳木斯大學教務處 第 3 頁 利用手機技術的優(yōu)點: 巨額的手機技術研發(fā)費用都花在提高設備和網(wǎng)絡的可用性和 可靠性上面。因此,手機設備硬件和網(wǎng)絡協(xié)議與桌面/控制臺世界(如全球定位系統(tǒng)(gps)擴 展、條形碼掃描儀、和短消息服務(sms)/多媒體信息服務(mms)通訊)有著非常大的差別。 好的手機游戲應該利用那些更新的設備特征和網(wǎng)絡基礎設備的優(yōu)點。 1.41.4 本游戲背景介紹本游戲背景介紹 在抗戰(zhàn)中,由國民政府領導的中國空軍是所有國民黨軍隊中抗戰(zhàn)最為徹底,也最為 英勇的部隊,雖然開戰(zhàn)之初力量懸殊,但是面對窮兇極惡的日本侵略者,他們毫不畏懼, 視死如歸,全力以赴投身到民族救亡的偉業(yè)中去,用自己的鮮血和生命譜寫了中華民族 最為豪邁的詩篇。自一九三二年二月五日“一二八”事件始,至一九四五年八月十四 日止,抗戰(zhàn)期間,共出動飛機一千一百二十八批,八千八百四十七架次,擊落敵機五百 二十九架,擊傷敵機一百一十架,炸毀敵機二百二十七架。同時,中國空軍空戰(zhàn)中一共 犧牲空勤人員六百六十一名。 我至今仍然清楚的記得,在抗日戰(zhàn)爭即世界反法西斯戰(zhàn)爭勝利 50 周年的時候,我在 一本描述抗戰(zhàn)空軍的書里第一次看到閻海文烈士那年青的面孔時所帶來的震撼,第一次 看到高志航、沈崇海等空軍烈士的事跡時所帶來的感動,第一次聽說碧山空戰(zhàn)時的無奈。 時至今日,已經(jīng)很少有人能夠記得在中國的天空獻身的抗日英雄們,我只能引用下 面這句話來表達我的心情:“你們的名字無人知曉,你們的業(yè)績與世長存! ” 我的這款游戲取名為覽橋風光,以紀念從覽橋中央航校走出的英雄們。 1.51.5 本章小結本章小結 引言和第一章中介紹了手機在無線應用方向的當今概況,j2me 的相關內容,分析了 j2me 在手機軟件開發(fā)中起的重要作用,描述了本論文的相關背景。 2 2 開發(fā)環(huán)境及相關技術的介紹開發(fā)環(huán)境及相關技術的介紹 2.12.1 開發(fā)環(huán)境開發(fā)環(huán)境 操作系統(tǒng):microsoft windows xp 程序語言:java 2 開 發(fā) 包:java(tm) 2 standard edition (5.0) sun micro. j2me wireless tool kit 2.2 畢業(yè)論文 (設計 )用紙 佳木斯大學教務處 第 4 頁 ide: eclipse 3.01 2.22.2 javajava 語言特點語言特點 1. 平臺無關性 java 引進虛擬機原理,并運行于虛擬機,實現(xiàn)不同平臺之間的 java 接口。java 的 數(shù)據(jù)類型與機器無關。 2. 安全性 java 的編程類似 c+,但舍棄了 c+的指針對存儲器地址的直接操作,程序運行時, 內存由操作系統(tǒng)分配,這樣可以避免病毒通過指針入侵系統(tǒng)。它提供了安全管理器,防 止程序的非法訪問。 3. 面向對象 java 吸收了 c+面向對象的概念,將數(shù)據(jù)封裝于類中,實現(xiàn)了程序的簡潔性和便于 維護性,使程序代碼可以只需一次編譯就可反復利用。 4. 分布式 java 建立在 tcp/ip 網(wǎng)絡平臺上,提供了用 http 和 ftp 協(xié)議傳送和接收信息的庫函 數(shù),使用其相關技術可以十分方便的構建分布式應用系統(tǒng)。 5. 健壯性 java 致力與檢查程序在編譯和運行時的錯誤,并自動回收內存,減少了內存出錯的 可能性。java 取消了 c 語言的結構、指針、#define 語句、多重繼承、goto 語句、操作 符、重載等不易被掌握的特性,提供垃圾收集器自動回收不用的內存空間。 2.32.3 關于關于 eclipseeclipse eclipse 是一個開放源代碼的、基于 java 的可擴展開發(fā)平臺。就其本身而言,它 只是一個框架和一組服務,用于通過插件組件構建開發(fā)環(huán)境。幸運的是,eclipse 附帶 了一個標準的插件集,包括 java 開發(fā)工具(java development tools,jdt)。 雖然大多數(shù)用戶很樂于將 eclipse 當作 java ide 來使用,但 eclipse 的目標不 僅限于此。eclipse 還包括插件開發(fā)環(huán)境(plug-in development environment,pde), 這個組件主要針對希望擴展 eclipse 的軟件開發(fā)人員,因為它允許他們構建與 eclipse 環(huán)境無縫集成的工具。由于 eclipse 中的每樣東西都是插件,對于給 eclipse 提供插 件,以及給用戶提供一致和統(tǒng)一的集成開發(fā)環(huán)境而言,所有工具開發(fā)人員都具有同等的 畢業(yè)論文 (設計 )用紙 佳木斯大學教務處 第 5 頁 發(fā)揮場所。 這種平等和一致性并不僅限于 java 開發(fā)工具。盡管 eclipse 是使用 java 語言開 發(fā)的,但它的用途并不限于 java 語言;例如,支持諸如 c/c+、cobol 和 eiffel 等 編程語言的插件已經(jīng)可用,或預計會推出。eclipse 框架還可用來作為與軟件開發(fā)無關 的其他應用程序類型的基礎,比如內容管理系統(tǒng)。eclipse 是一個開放源代碼的、基于 java 的可擴展開發(fā)平臺。就其本身而言,它只是一個框架和一組服務,用于通過插件組 件構建開發(fā)環(huán)境。 2.42.4 關于關于 wirelesswireless tooltool kitkit wtk(wireless tool kit)是 sun 公司針對 j2me 推出的用于手機和 palm 等移動設備 的開發(fā)包,是除手機廠商的專用開發(fā)包外唯一的手機模擬器開發(fā)包。它通用性高,開發(fā) 出的應用程序可保證能運行在大部分設備上,而不像專用廠商具有一定的不兼容性。雖 然它沒有強大的功能和完善的調試手段,但它提供運行模擬器的最基本組件,是其他 ide 需集成采用的必備元素。 2.52.5 javajava appicationappication managermanager 手機中負責調配程序運行資源的管理后臺是 java application manager。它所使用 的傳輸媒體可以是紅外線、網(wǎng)絡、以及其他可用來傳輸?shù)拿襟w。java application manager 會從網(wǎng)絡上下載代表該 application suite 的 jar 檔,接著在手機上安裝此 midlet suite,然后在手機開始執(zhí)行該應用程序。 2.62.6 本章小結:本章小結: 第二章介紹了 java 語言的特點、本程序的開發(fā)環(huán)境及其相關工具的原理和使用。 3 3 程序結構、思想和相關技術程序結構、思想和相關技術 3.13.1 本程序需要解決的主要技術問題本程序需要解決的主要技術問題 1. 游戲程序是一項精度要求很高的程序系統(tǒng),因為其代碼利用率很高。一個實時 運行的最終作品,每秒都會運行成千上萬行程序,繪圖事件、鍵盤事件都會以極高的頻 率在后臺等待響應,若有絲毫的差別都將很容易導致程序在運行不久后可能出現(xiàn)嚴重錯 誤,甚至死循環(huán)。因此,其邏輯設計應當相當嚴謹,需將所有可能發(fā)生的事件及意外情 況考慮在設計中。 畢業(yè)論文 (設計 )用紙 佳木斯大學教務處 第 6 頁 2. 游戲中為了美觀,適用性強,可能需要采用外部文件引入的圖片貼圖,有關貼 圖,在 midp2.0 中提供了用于增強游戲功能的 game 包,使得解決靜態(tài)或動態(tài)、畫面背景、 屏幕刷新的雙緩沖等都有較好的解決方案。 3. 玩家飛機的運行可以通過鍵盤響應事件控制,但敵方則因為是自動運行,就需要 有一定的智能性;敵人飛機的運行算法也要進行相關的設置,已免游戲過于簡單。 4.對于雙方發(fā)射的子彈應該賦予不同的速度,同時,程序應該設定敵人飛機的子彈 不與敵人的飛機進行碰撞檢測,已增加游戲的可玩性。 5. 雙方的飛機在前進時也需要考慮到是否碰撞到對方飛機,以免重疊運行,造成許 多物理上不可能的情況,缺乏真實感。每一次刷新頁面、每前進一步都需要進行相關的 碰撞檢測。 6.為了增加界面的美觀,在程序中添加了白云。由于手機屏幕大小有限,所以白云 的數(shù)量和出現(xiàn)的位置要經(jīng)過相關的設置,才能實現(xiàn)白云不規(guī)則出現(xiàn)的效果。 7. 游戲的地圖不可能通過繪圖來解決。否則,不僅難于控制和處理過多的元素, 也會因過多的大型圖片而不能限制程序的大小,失去手機上程序的原則和 java 的優(yōu)勢。 8. java 是基于虛擬機的半解釋型編譯系統(tǒng),其執(zhí)行效率較 c+等完全編譯后的程 序會低很多,程序如果不進行精簡和優(yōu)化,將可能導致運行的不流暢。除開發(fā)過程中對 結構上的控制、變量的使用、算法的優(yōu)化等優(yōu)化外,還可以使用混淆器(obfuscator)進 行程序打包后的優(yōu)化。 9. 游戲的結束、開始、動態(tài)信息畫面作為構成一個程序都是必不可少的重要部分。 良好的用戶界面更是吸引用戶的硬指標,相關的美術構圖和人性化設置也需要有一定的 考慮。 以上相關技術細節(jié)和整體流程將分別在以下小節(jié)闡述。 3.23.2 程序流程程序流程 midlet suite 是 midp 應用程序 的最小單位,jam 負責將手機內的 midlet suite 以圖形化的方式呈現(xiàn), 讓用戶能夠選取欲執(zhí)行的 midlet suite,一旦選取了某個 midlet suite,操作系統(tǒng)就會激活 kvm 執(zhí)行 消減狀態(tài) (destroyed) 停止狀態(tài) (paused) 運行狀態(tài) (active) startapp() destroyapp( ) 呼叫 midlet 的構 造函數(shù) destroyapp() pauseapp() 圖 3-1 midlet 的流程 畢業(yè)論文 (設計 )用紙 佳木斯大學教務處 第 7 頁 里面的 midlet。midlet 及相關的支持類組成了 midp 應用程序的實際內容。而 每個 midlet 都必須繼承 javax.microedition.midlet.midlet 這個抽象類。在 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() 方法被調用的時候 midlet 進入 active 狀態(tài),也就是所說的運行狀態(tài)。在 active 狀態(tài)調 用 destroyapp(boolean unconditional)或者 pauseapp()方法可以使得 midlet 進入 destroyed 或者 pause 狀態(tài)。值得一提的是 destroyapp(boolean unconditional)方法, 事實上,當 destroyapp()方法被調用的時候,ams 通知 midlet 進入 destroyed 狀態(tài)。在 destroyed 狀態(tài)的 midlet 必須釋放了所有的資源,并且保存了數(shù)據(jù)。如果 unconditional 為 false 的時候,midlet 可以在接到通知后拋出 midletstatechangeexception 而保持在當前狀態(tài),如果設置為 true 的話,則必須立即進 入 destroyed 狀態(tài)。 本程序采用面向對象的設計模式,對游戲中的所有物體賦予對象的概念和屬性。運 行程序后允許用戶選擇執(zhí)行選項菜單,在開始游戲后將先從外部文件載入地圖文件,對 背景的所有物體進行繪圖。在主程序運行的線程中,畫面刷新將以一定的頻率采用雙緩 沖技術對屏幕重繪,實時反映整個游戲的進行狀態(tài)。 游戲開始后先繪制地圖,并將各個對象實例化。在主程序運行的線程中,游戲中所 有的對象都應該運行在同一個線程下。當敵人或者用戶的子彈達到射程范圍后,并不刪 除子彈對象,而是使用 setvisable(false)使其不能顯示,當用戶或敵人在次發(fā)射子彈時, 只需使用 setvisable(true)設置成可以顯示即可。在屏幕重繪的主程序中,將在每次的 循環(huán)中判斷若干事件,以便程序進入相關的分支執(zhí)行相關的反應代碼。如:玩家剩余飛 機數(shù)是為 0、敵人、玩家飛機是否被擊中、屏幕上相關信息的繪制等。 程序為需要完成獨立功能的模塊設置了單獨的類。lzhhdm 類繼承自 midlet,gamescrenn 類、menuscreen 類繼承自 gamecanvas,mybullets 繼承自 sprite 類。載入程序后首先啟動的是程序介紹的信息畫面。點擊 ok 后調用 menuscreen 類實現(xiàn) 菜單。 畢業(yè)論文 (設計 )用紙 佳木斯大學教務處 第 8 頁 如果選擇進入游戲,則調用 gamescreen 類,并且中止 menuscreen 類中的線程運行,已 提高運行速度。 mybullets 類為玩家子彈類。 3.33.3 canvascanvas 類類 為了能有程序開發(fā)人員控制接口的外觀和行為,需要使用大量的初級用戶接口類, 尤其在游戲程序中,幾乎完全依賴的就是 canvas 抽象類進行繪圖。從程序開發(fā)的觀點看, canvas 類可與高級 screen 類交互,程序可在需要時在 canvas 中摻入高級類的組件。 canvas 提供了鍵盤事件、指點桿事件(如果設備支持),并定義了允許將鍵盤按鍵映射 為游戲控制鍵的函數(shù)。鍵盤事件由鍵代碼指定,但這樣控制游戲會導致缺乏通用性,并 不是每個設備的鍵盤布局都適合游戲的操作。應當將鍵代碼轉換為游戲鍵的代碼,以便 硬件開發(fā)商能定義他們自己的游戲鍵布局。 3.43.4 graphicsgraphics 類類 graphics 類提供了簡單的 2d 繪圖功能。它具有 24 位深度色彩的繪制能力,以三原 色分別各占一個字節(jié)表示其顏色。程序只能在 paint()函數(shù)中使用 graphics 繪制, gamecanvas 可調用 getgraphics()函數(shù)直接繪制在緩沖區(qū)上,可以在任何時間請求傳輸 到前臺。其對象會被傳給 canvas 的 paint()函數(shù),以便最終顯示。 3.53.5 midp1.0midp1.0 技術下的繪制背景技術技術下的繪制背景技術 在沒有 midp2.0 前,進行游戲繪圖一般需要手動編程使用雙緩沖。需要在 paint()方 法內將所想要畫的圖形畫在一張預先準備好的背景上,等所有繪圖操作都完成后再將背 景的數(shù)據(jù)拷貝到實際的屏幕上。image 類提供了一個建立背景的靜態(tài)方法 createimage(int width, int height),再利用 getgraphics()方法取得屬于這個背景的 graphics 對象,所進行的繪圖操作都會作用在背景上,等到全部的繪圖操作完成后,再 調用 drawimage()方法將背景的數(shù)據(jù)復制到實際顯示的屏幕上。 這樣的技術在繪制動畫時特別有用。繪制動畫時經(jīng)常需要不斷地更新畫面,而更新 畫面的操作就是先將屏幕以 fillrect()的方式清除,再將下一張圖片畫在屏幕上,然而 反復的清除及重繪會造成屏幕的閃爍現(xiàn)象(flicker),因此使用雙重緩沖的好處就是在 背景進行這個清除及重繪的操作,再將完成的繪圖拷貝到屏幕上,由于用戶看不到清除 的操作,因此就不會出現(xiàn)閃爍的現(xiàn)象了。不過在某些 midp 的實現(xiàn)上已經(jīng)加上了雙重緩沖 畢業(yè)論文 (設計 )用紙 佳木斯大學教務處 第 9 頁 的支持,因此在處理前應先利用 canvas 類的 isdoublebuffer()方法來判斷。 3.63.6 midp2.0midp2.0 新增的新增的 gamecanvasgamecanvas 包包 j2me 的流行促進幾個運營商和制造商開發(fā)了一些支持游戲的類,但是,這卻造成了 游戲缺乏可移植性的問題,例如,很難將使用 siemens 的 sprite 類的游戲移植到 nokia 上。 在 midp2.0 版本發(fā)布后,這些游戲移植性問題初步得到了解決。midp2.0 新加入了 gamecanvas、sprite、layer、layermanager、tiledlayer 五個與游戲開發(fā)相關的類。其 中 layer 類一般不會直接用到。 game 類的出現(xiàn)不僅降低了錯誤出現(xiàn)的幾率,也使游戲代碼變的更小,因為開發(fā)者不 需要自己編寫象 sprite 這種例子。下面將簡要介紹 game 類。 gamecanvas 類繼承自 canvas,所以具有 canvas 所具有的功能,還額外增加了一些 便于游戲設計的功能。比如: gamecanvas 類直接提供了 getkeystates(),使程序員可以 在同一個線程自己偵測按鍵的狀態(tài)。gamecanvas 類提供了 flushgraphics()的功能,實 現(xiàn)了雙緩沖技術。 所謂的 sprite,就是畫面上獨立移動的圖形。 sprite 類是繼承自 layer 的用于存儲多楨的基本可視元素。不同的 frame 可交相顯 示,構成動態(tài)的效果。圖片可翻轉、顛倒、由一個主角圖片就可以方便的得到所有方向 的顯示狀態(tài),相比原先只能使用 canvas 繪圖,需要將所有方向的主角圖象都繪制在 png 圖象中簡化了許多。sprite 也可以從整合的圖象中讀圖,讀圖時將把大圖分解為若干等 寬等高的小圖。每個小圖按照其排列順序有相應的序號,在程序中調用其序號,就可以 繪制出相應的圖片。本程序中的雙方飛機、子彈、白云都由 sprite 繼承得到。 layermanager 提供控制整體畫面層的控制。它包括了一系列自動獲取了代號和位置的層, 簡化了各層加入游戲畫面的過程,提供了自動排序和繪制的能力。 layermanager 存儲了一個層的列表,新的層可以用函數(shù)附加、刪除和插入。層的序 號相當于坐標的 z 軸,0 層表示最接近用戶視覺,層數(shù)越高,離用戶越遠。層號總是連續(xù) 的,即使有中間的層被移除,其他層的序號會作相應的調整以保持整體的完整性。lm 中 的 view window 控制著與 lm 相對坐標的可視區(qū)域。改變 view window 的位置可以制造出 滾動屏幕的效果。 tiledlayer 是有一組圖象格元素組成的整塊虛擬圖象。該類使不需要高分辨率的圖 畢業(yè)論文 (設計 )用紙 佳木斯大學教務處 第 10 頁 象就能創(chuàng)建大幅圖面成為可能。這項技術通常應用在 2d 游戲平臺的滾動背景的繪圖。一 塊整圖可被分割成等大小的圖象格,每塊格有其對應的序號,按照行列遞增。多塊小格 可由大塊同時替換組合而模擬動態(tài)的背景,這不需要逐塊替換所有的靜態(tài)圖象格而顯得 非常方便。 3.73.7 pngpng 圖片格式圖片格式 png(portable network graphics)格式是 midlet 唯一支持的圖象格式,png 具體格 式由 png specification,version 1.0 定義的。png 格式提供透明背景的圖象,這對繪制 游戲畫面和被操縱主角極有幫助。飛機之間或與白云碰撞時就不會因為背景有特定的顏 色,顯示出的效果像貼上的圖片而缺乏真實感,物體之間輕微重疊時最上層圖片也不會 覆蓋超過其有效象素外的部分。 png 格式圖片中包含許多定義其圖片特性的冗余部分(chunks)。這些代碼包含在每一 個單獨的 png 格式圖象中,然而如果將多個 png 圖象合并在一張幅面稍大一些的整圖中, 多個 chunks 就可以得到精簡,圖片的大小可以得到控制。使用 image 類中的 createimage 函數(shù)可從整圖中分割出所需要的元素。在 game 包中的 tiledlayer 和 sprite 類都整合了這樣的功能。本程序中的地圖元素都集成在一張 beijing.png 圖片中, 實現(xiàn)了方便的管理和程序體積的精簡。 3.83.8 玩家飛機的控制方式和敵人方的智能運行玩家飛機的控制方式和敵人方的智能運行 gamecanvas 提供 getkeystates 函數(shù)可獲取當前鍵盤上的信息。將以位的形式返回 鍵盤上所有鍵的按與釋放的狀態(tài),當 bit 為 1 時,按鍵就是被按下的狀態(tài),為 0 時則為 釋放狀態(tài)。只需要此一個函數(shù)的返回值就可以返回所有鍵的狀態(tài)。這保證了快速的按鍵 和釋放也會被循環(huán)所捕捉。同時,這樣的機制也可檢測到幾個鍵同時按下的狀態(tài),從而 提供斜向運行等相應功能(本程序沒有實現(xiàn)斜上運行功能)。 程序運行時應該對玩家飛機是否飛出屏幕的范圍進行檢測,如果飛出屏幕,就應該 重新設定玩家飛機的位置。 玩家飛機被擊中后,為了平衡游戲的可玩性,玩家飛機將有短暫時間無敵,即不進 行碰撞檢測,同時在屏幕右上角顯示無敵時間。 根據(jù)游戲設定,敵人飛機。不能與玩家飛機重合,則他每走一步都需要檢測一下是 否與玩家飛機碰撞。sprite 類中提供了 collideswith 函數(shù),用于判斷是否與某個 畢業(yè)論文 (設計 )用紙 佳木斯大學教務處 第 11 頁 sprite、tiledlayer、image 的對象有圖象上的重合(即游戲中的碰撞)。同理,還需 要檢測玩家子彈與敵機、敵機與玩家子彈是否碰撞。如果發(fā)生碰撞,將相關精靈圖片替 換為爆炸圖片。 敵人飛機需要具有一定的智能性,以便對玩家攻擊,使游戲具有一定的可玩性。敵 人可以在適當時候轉向或者開炮火,同時,程序應該檢測敵機是否飛出了界外。 在普通敵機中,有一組敵機的其中一架具有跟蹤功能,其原理為:當其進入屏幕后, 根據(jù)玩家飛機的 x、y 坐標不斷調整自己的 x、y 坐標,已達成跟蹤的效果。由于線程的 關系,敵機器的改變方向有時并不是實時的,這就可以使玩家有躲開撞擊的可能,增強 了游戲的可玩性。 在游戲進行中出現(xiàn)的大型飛機,由于其不可能立即被擊落,所以應該設置其的運行 方法,理論上講還是根據(jù)玩家飛機的坐標,但是,在此設置一個標志位,使得敵人在取 的玩家位置后即開始玩家方向運動,這期間,將不執(zhí)行取得玩家飛機位置重設飛行方向 的步驟。這樣做,即防止了大飛機變成跟蹤飛機,又使得大飛機的運行具有不確定性。 在關尾出現(xiàn)的 boss,其在屏幕上方左右移動并發(fā)射子彈。實際上,此時 boss 應該 通過玩家在游戲運行中的習慣性的運行方向,使用遺傳算法,來動態(tài)判斷玩家下一步的 運行方向,并且指揮普通飛機出現(xiàn)在預測的位置上??上в捎跁r間關系沒有實現(xiàn)。 3.93.9 子彈的運行和控制子彈的運行和控制 玩家的子彈是個精靈數(shù)組,有 9 個元素,表示玩家一次最多可以發(fā)射 3 組 9 發(fā)子彈, 對于一個完整的游戲來講,應該根據(jù)關卡的不同而給予玩家不同的飛機,飛機性能的差 別在于子彈的射程不同。由于本游戲僅有一關,所以子彈速度設定的差別沒有體現(xiàn)出來。 當玩家一次發(fā)射了 3 組子彈,而這 3 組子彈并沒有消失時,玩家將無法發(fā)射子彈。 使用每組子彈的第一發(fā)作為與敵人進行碰撞檢測的精靈,同時相關的標志位也設在 第一發(fā)子彈中。如果玩家子彈與敵機相撞,則敵機消失時,子彈精靈的圖片替換為爆炸 圖片,直到第二次發(fā)射該組子彈時,才將圖片替換為子彈圖片。 3.103.10 內存的優(yōu)化內存的優(yōu)化 手機內存空間小,所以在程序設計時應該注意以下幾點,以盡量減少內存的使用: (1)盡量縮短命名的長度。在應用程序內,對于所建立的類、接口、方法及變量名而 畢業(yè)論文 (設計 )用紙 佳木斯大學教務處 第 12 頁 言,都需要賦予一個識別的名稱,所命名的名稱每多一個字符就會在類文件內多產生一 個字節(jié),對于一個較復雜的應用程序而言就會增加為數(shù)不小的數(shù)據(jù)量。所有這些可以借 助混淆器來幫助實現(xiàn) (2)所有代碼寫為一個類。 (3)只使用一個線程。 (4)盡量不使用靜態(tài)變量。 (5)將 png 圖片合并成一張,減少圖形數(shù)據(jù)的大小。 將 png 格式的小分辨率圖象合并在一張大的高分辨率圖象中,由于減少了頭文件的 大小,將比合并前的總大小減少許多。 3.113.11 內存檢測器內存檢測器 wireless tool kit 提供了許多在運行時監(jiān)視運行狀態(tài)的工具。 包括內存狀況的檢 測(手機上的內存空間十分有限,必須時刻關注機載內存是否大于程序所能使用到的最 大可能的內存空間),網(wǎng)絡狀況的檢測,運行函數(shù)的跟蹤等。 內存檢測器是內存跟蹤測 試隨時間變化的調試器。其中,允許強制垃圾回收(garbage collection)。由于 java 語 言中,不像許多其他的如 c+語言,不需要指定回收函數(shù)中特定不使用的資源,資源回收 機制將自動清空無效變量占用的空間。在程序運行中也可以調用 system 類的 gc()函數(shù)手 動收回廢棄的內存。 3.123.12 關于混淆器關于混淆器 java 語言并沒有完全編譯成二進制可執(zhí)行文件,編譯出的.class 文件是一種介于源 程序和二進制之間的一中基于半解釋的字節(jié)碼,需要虛擬機來執(zhí)行。它包括了所有的信 息。然而這樣會導致.class 很容易被反編譯為源代碼,從而不能保護作者的知識成果。 目前流行的如 decode,jad 等反編譯工具可以以很快的速度生成源文件。如果不加以施行 有效的措施,將造成嚴重的后果。 由此引入混淆器的概念。混淆器將代碼中的所有變量、函數(shù)、類的名稱變?yōu)楹喍痰?英文字母代號,如果缺乏相應的函數(shù)名指示和程序注釋,即使被反編譯,也將難以閱讀。 混淆器的作用不僅僅是保護代碼,它也有精簡編譯后程序大小的作用。由于以上介 紹的減少變量、函數(shù)的命名長度的關系,編譯后也會從.class 文件中減少這些冗余的信 畢業(yè)論文 (設計 )用紙 佳木斯大學教務處 第 13 頁 息。混淆后,體積大約能減少 25%,這對當前費用較貴的無線網(wǎng)絡傳輸是有一定意義的。 3.133.13 本章小結本章小結 第三章中介紹了程序的流程、相關技術的思想及其在本程序中的應用。對游戲基本 算法等做了詳細敘述。具體算法的代碼實現(xiàn)和詳細流程將在下章介紹。 4 4 程序分析和具體實現(xiàn)程序分析和具體實現(xiàn) 4.14.1 游戲進入前的選擇游戲進入前的選擇 畢業(yè)論文 (設計 )用紙 佳木斯大學教務處 第 14 頁 每個 midlet 程序都必須有一個主類,該類必須繼承自 midlet。它控制著整個程序的 運行,并且可以通過相應函數(shù)從程序描述文件中獲取相關的信息。該類中擁有可以管理 程序的創(chuàng)建、開始、暫停(手機中很可能有正在運行程序卻突然來電的情況,這時應進 入暫停狀態(tài)。)、結束的函數(shù)。本程序主類為 lzhhdm,并實現(xiàn)接口 commandlistener。 首先顯示的是游戲的背景介紹(圖 4-1),為此,在類 lzhhdm 定義 form 類對象 a,在 startapp()函數(shù)中判斷 issplash 是否為真,如果為真的話,將創(chuàng)建 form 類的實例 a,并且調用 append()方法在表單上放置 stringitem 類的實 例以顯示游戲背景信息。使用語句 ok=new command(“ok“,command.ok,1);實例化 command 類對象 ok。調 用 addcommand()命令建立 ok 命令與 form 之間的關聯(lián),調用 setcommandlistener()命令使 form 與 commandlistener 建立 關聯(lián)。調用 displayable 的 seturrent()函數(shù)顯示背景介紹窗口。 圖 4-1 游戲背景介紹 當玩家點擊 ok 后將調用 display.setcurrent(menuscreen) 以顯示游戲菜單 menuscreen(圖 4-2)。 類 menuscreen 繼承自 canvas 類,并實現(xiàn)接口 runnable 和 commandlistener。在類 menuscreen 中定義了 lowcolor 和 highcolor、highbgcolor 三個整型變量及布爾型變量 co。其 中 lowcolor 賦值為 0x000000ff,代表蘭色,higcolor 賦值為 0x00ff0000,代表紅色,highbgcolor 賦值為 0x00cccccc,代表 蘭灰色,即背景條。當玩家按住上或下鍵時,在函數(shù) keypressed (int code)中的整型變量 menuindex 相應的減 1 或加 1,相應的,在 paint()函數(shù)中會 根據(jù) menuindex 繪制選項是否被選中。在函數(shù) run()中,如果 co 為真,則不停的 repaint(),設置 co 的意義在于,當進入游戲主畫面后,co 賦值為 false,以終止繪制選 項的 repaint(),提高游戲速度。 當移動選項條到某項,并點擊 ok 時,在 commandaction()方法中根據(jù) menuindex 圖 4-2 游戲的菜單 畢業(yè)論文 (設計 )用紙 佳木斯大學教務處 第 15 頁 的值判斷選擇了哪個選項,列如當選擇“關于”時,將調用 lzhhdm 類中的 renwushow() 方法以顯示”關于”界面(圖 4-3),在 renwushow()方法中,form 類對象 a=null,表示 清空 form,并重新調用用 append()方法在表單上放置 stringitem 類的實例以顯示游戲關 于信息,“幫助“界面的顯示與”關于“界 面相同,只不過調用的是 helpshow()方法。 4.24.2 mybulletsmybullets 類類 在介紹游戲主類 gamescreen 類之前, 應該先簡要說明一下玩家子彈類 mybullets 類,實際上,mybullets 類是應該刪除的,其 要實現(xiàn)的功能應該放在 gamescreen 類中, 但是由于設計游戲的過程也是一個學習的過 程,而在當時,我并沒有意識到這一點。 mybullets 類繼承自 sprite 類,以實 現(xiàn)玩家子彈的相關功能。首先,創(chuàng)建子彈狀 態(tài)數(shù)組 private int bullets,其中,i 0代表子彈的 x 坐標,i1代表子彈的 y 坐標,i2代表子彈 y 方向速度,i3代表子彈存活狀態(tài)(由于此類是在早期設計 的,而之后子彈存活狀態(tài)使用了子彈射程作為標志位,所以其并沒有起到作用)。類中定 義的方法 setfirstposition()起到定義玩家子彈發(fā)射坐標的作用(此方法在設計時起到的 作用是消除每按一次開火玩家子彈位置就重新定位這個 bug,但是,這個 bug 完全可以用 圖 4-3 關于界面 進入游戲 y1-1550 pzbzover=0 顯示敵人 玩家被擊落 了嗎 ? 玩家是否還有 機會? 繼續(xù)游戲 是否過關 返回主界面 y y n y y n 圖 4-4 gamescreen 類主要關系流程圖 n 畢業(yè)論文 (設計 )用紙 佳木斯大學教務處 第 16 頁 設置標志位的方法消除)。方法 newposition()實現(xiàn)的功能為更新玩家的子彈位置,并且 檢測玩家子彈與普通敵人的碰撞及記錄玩家戰(zhàn)果(更新子彈位置的功能可以由使用 move() 加設置標志位的方法取代;由于設計這個類的時候并沒有考慮到添加 boss 等,所以在此 檢測碰撞,但添加 boos 等功能后,此處的檢測完全可以和飛機對飛機等的碰撞檢測封裝 在同一個方法中)。 mybullets 類在 gamescreen 中建立了對象數(shù)組 huokebullet9,代表玩家所能發(fā)射 的 9 發(fā)子彈。 4.34.3 游戲邏輯及游戲邏輯及 gamescreengamescreen 類類 gamescreen 類是游戲的主類,決定著敵人何時出現(xiàn),控制著敵人出現(xiàn)的方法,判斷 敵人及玩家是否被擊中等。它運行在獨立的線程中,以恒定的頻率刷新畫面。本程序設 置為 1/20 秒。其主邏輯如圖 4-4 所示。 .1 gamescreengamescreen 類所實現(xiàn)的功能類所實現(xiàn)的功能 gamescreen 類要實現(xiàn)地圖的滾動、敵人飛機的相關屬性、玩家的相關屬性等功能。 gamescreen 類包括了 layermanager,這樣所有靜態(tài)和動態(tài)的圖象都不需要手動刷新, 只需要在 layermanager 中加入所有的需要控制的精靈,在統(tǒng)一由 layermanager 刷新即可, 因此,在 gamescreen 中創(chuàng)建 layermanager 的對象 lm,并在構造函數(shù)中實例子化。 其他精靈類的對象如敵人飛機、玩家飛機、玩家飛機的子彈、敵人的子彈、boss 及 boss 所屬的子彈都需在 gamescreen()類中建立相應的對象,并在構造喊數(shù)中實例化,且 由 lm.appned()方法添加到 layermanager 類對象 lm 中。 .2 地圖的創(chuàng)建地圖的創(chuàng)建 由于手機存儲空間的限制,不可能將整張地圖完整地存儲在手機中,為了節(jié)約空間, 往往提出地圖中相同的圖片組成一張 png 格式的圖片,然后象拼圖一樣拼出地圖來,專 業(yè)的游戲設計者往往自己寫一個地圖編輯器,以使拼圖過程不是那么痛苦。 創(chuàng)建地圖就需要使用 tiledlayer。tiledlayer 指的是由一塊一塊類似用瓷磚拼湊起 來的畫面。地圖實際即為 tiledlayer 的一個對象。先利用 tiledlayer 的構造函數(shù)建立 tiledlayer,根據(jù)構造函數(shù)的參數(shù)可以給定 cell 數(shù)組 的大小,并且地圖圖片切割成等尺 寸的畫面,并調用 setcell()設置具體的圖象格內容。地圖 圖片如圖 4-5 所示。 圖 4-5 地圖 畢業(yè)論文 (設計 )用紙 佳木斯大學教務處 第 17 頁 (0,y1) y1=y1+1; view window 向下移動 (0,0) 圖 4-6 圖 4-6 因此,創(chuàng)建一個返回 ttiledlayer 的方法 createbackground(),以便在 gamescreen()的構造函數(shù)中調用。在方法中,定義整型數(shù)組 map1以存儲 cell 的索引值。 并使用 tiledlayer.setcell(column,row,map1i)設定 ttiledlayer 的內容,以形成地 圖。其中 i 的值由循環(huán) for(int i=0;i0 時,碰撞后,將變量 planert 賦值為 1,在之后的 if(planert=1)判 斷語句中,重新設定玩家飛機的圖片和可視狀態(tài),同時使用 setposition()函數(shù)設定玩家 非的位置在屏幕下方。設定 pzbz=1,即不檢測碰撞,玩家有短暫時間無敵,無敵時間由屏 幕右上角進度條表示。設定 inputno=1,即飛入屏幕的過程中手機鍵盤是不可以用的。設 置 planert=2,即以上這些設置只執(zhí)行一便。 在 if(planert=2)判斷語句中,使用語句 move( 0,-2)使飛機自己向上運動,使用 if(c1.gety()(getwidth()-c1.getwidth() 語句判斷(getwith()為屏幕的寬度,c1.getwidth()為玩家飛機 c1 的寬度),如果條件為 真,則使用 c1.setposition(getwidth()-c1.getwidth(),c1.gety()語句將飛機設置 在緊靠屏幕右邊的位置。上、下、左的設置原理同上。 語句 if(keystateipalnepo,通過改變標志位的值使得 drawsteing()不在執(zhí)行,四字消失。 如果玩家被擊落后并沒有點“返回“,而此時,背景會一直運動到關尾,考慮到其 圖 4-9 畢業(yè)論文 (設計 )用紙 佳木斯大學教務處 第 23 頁 與關尾 boss 共用 3 發(fā)子彈,如 sboos 不消失,將會出現(xiàn)子彈亂飛的情況。所以,如果判 斷語句 if(sboss.gety()=getheight()為真,則表示離地圖的終點只有一個屏幕的距 離時,sbz 賦值為-1、sbpzbz 賦值為 1(含義上面已經(jīng)說明)。同時調用 sboss.move(0,-3), 使 sboos 快速飛出屏幕,直到判斷語句 if(sboss.gety()0 時,飛機向左下方運行,使用語句 setframe(0)、move(-3,3)達成向左下方運動 的效果。當 aippc1.getx()判斷 j1 在 c1 的左或右側,并且實時根據(jù)判斷情況使用 setframe()和 move()改變飛機的形態(tài),使 用語句 if(j1.getx()c1.getx() cloud1.setposition(80,planepoup-(140); cloud2.setposition(112,planepoup-(90); 畢業(yè)論文 (設計 )用紙 佳木斯大學教務處 第 25 頁 cloud3.setposition(175,planepoup-(200); cloud4.setposition(223,planepoup-(70); 其原理為:將屏幕的 x 數(shù)軸和 y 數(shù)軸各分成 5 份,即在 x 軸的 5 個范圍內每個范圍 出現(xiàn)一朵白云,y 軸的每個范圍內也只能出現(xiàn)一朵。所以的白云的起始位置在每次游戲開 始時是固定的。 白云位置設定后,使用 move(0,1)使白云移動,由于白云初始位置設定在屏幕的不同 區(qū)域內,故其移動出屏幕的先后順序是不同的,使用 if(cloud.gety()planepo)判斷 白云是否飛出屏幕。如果為真則使用 cloud.
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 北部灣大學《微積分(上)》2023-2024學年第一學期期末試卷
- 2024年電動自行車配送服務協(xié)議
- 2025年度網(wǎng)絡安全審計與合規(guī)性檢查服務協(xié)議
- 2025版國際學校招生入學合同3篇
- 2025年度安全生產信息化管理責任書協(xié)議提高管理效率
- 2025年度生態(tài)環(huán)保工程安全生產施工協(xié)議匯編2篇
- 建筑水泥售賣合同范文
- 2025版跨境電商企業(yè)股東變更與市場拓展協(xié)議3篇
- 建造民房住宅合同范文
- 2025年度環(huán)保項目貸款擔保合同范本3篇
- 2024屆消防安全知識競賽題庫及答案(80題)
- 工程師個人年終總結
- 構詞法(講義)(學生版)-2025年高考英語一輪復習(新教材新高考)
- 2024年河南省公務員錄用考試《行測》試題及答案解析
- GB 17353-2024摩托車和輕便摩托車防盜裝置
- 2024秋期國家開放大學本科《納稅籌劃》一平臺在線形考(形考任務一至五)試題及答案
- 房租收條格式(3篇)
- 期末試卷(試題)2024-2025學年培智生活語文二年級上冊
- 《技術規(guī)程》范本
- DBJ50T-城鎮(zhèn)排水系統(tǒng)評價標準
- 紅色簡約中國英雄人物李大釗課件
評論
0/150
提交評論