版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、網(wǎng)絡(luò)工程專業(yè)論文題 目:基于嵌入式系統(tǒng)的java游戲的設(shè)計與實現(xiàn) 專 業(yè): 網(wǎng) 絡(luò) 工 程 目 錄摘 要7Abstract7一 前 言71.2引 言81.3手機游戲特征81.4手機游戲的類型91.5 手機軟件現(xiàn)狀91.6 本游戲的未來91.7 手機未來的發(fā)展方向10二 開發(fā)環(huán)境及相關(guān)技術(shù)的介紹112.1 Java語言的特點112.2 J2ME 是什么?112.3 J2ME智能客戶端122.4 J2ME 總體架構(gòu)122.5 簡單環(huán)境的搭建:13三 J2ME 手機游戲需求分析143.1 本程序需解決的有關(guān)技術(shù)問題143.2 程序流程圖153.3 繪圖與MIDP2.0新增的GameCanvas包16
2、3.3.1 提供低級繪制的Canvas類163.3.2 Graphics類163.3.3 PNG格式163.4 有關(guān)繪圖的一些技術(shù)163.5 內(nèi)存使用的最佳化173.6 混淆器(Obfuscator)的使用173.7 模擬器的相關(guān)調(diào)試18四 程序分析和編寫手機代碼184.1 游戲進入前的選擇184.2 主游戲邏輯及其涉及到的若干類184.2.2 游戲的設(shè)定204.2.3 游戲中的幫助和程序控制器204.2.4 游戲版權(quán)聲明234.2.5 游戲的主要程序244.2.6 游戲的主程序33五 常見錯誤分析345.1 畫圖錯誤345.2 變量沒有定義或沒有初始化345.3 在 GameScreen 類
3、中不能用線程345.4 在玩游戲時出會發(fā)出兩張同樣的牌35參考資料36致 謝36摘 要J2ME(Java 2 Micro Edition) 是近年來隨著各種不同設(shè)備,尤其是移動通信設(shè)備的飛速發(fā)展而誕生的一項新的開發(fā)技術(shù)。它定位在消費性電子產(chǎn)品的應(yīng)用上,對設(shè)備的智能化、多樣化,提供了革命性的解決方案,并因其“Write Once, run anywhere”的Java特性而提高開發(fā)的效率。 隨著手機的日益普及、Java功能在移動設(shè)備上的實現(xiàn),Java應(yīng)用程序產(chǎn)生的手機增值服務(wù)逐漸體現(xiàn)出其影響力,對豐富人們的生活內(nèi)容、提供快捷的資訊起著不可忽視的作用。本論文著眼于J2ME技術(shù)的應(yīng)用,開發(fā)一款可商用
4、的手機游戲程序撲克豪斯。本程序的界面和運作方式于臺式游戲豪斯,將老少皆宜的經(jīng)典作品移植到手機上來,為更流行的硬件平臺提供應(yīng)用軟件。 本論文介紹了手機的軟硬件特性、J2ME的相關(guān)技術(shù)及本程序的結(jié)構(gòu)分析和具體功能的實現(xiàn)。 關(guān)鍵詞:J2ME,手機游戲, Java,撲克豪斯 AbstractJ2ME is a kind of fast developing technology implemented on various devices especially mobile communication equipments. It focuses on application for consumpt
5、ive electronic products, providing revolutionary solution to the intelligentization and diversification of the equipment. It improve the efficiency of the development process thanks to its “Write Once, run anywhere” nature. When cell phone is getting ever more popular nowadays, with the implementati
6、on of Java technology on mobile equipment, increment of capital on communication service exhibits its force on peoples everyday life, providing them ever fast information just in hand. This dissertation focuses on implementation of J2ME technology and has developed a commercial game suite run on mob
7、ile phonesPokerMachine. This application inherits many characters of the old fashioned game Battle City which developed by Nintendo in 1980s. It transports the classical product to mobile phones, offering corresponding software for such more popular hardware platform. This dissertation introduces th
8、e characteristic of Nintendo FC machine and its software, J2ME and its relative technology as well as this programs structure and analysis of implementation in details. Key words: J2ME, mobile game, Java, tank, Battle City. 一 前 言 1.2引 言 手機游戲成績斐然,成為IT產(chǎn)業(yè)中增長最快的部分之一.縱觀IT產(chǎn)業(yè)的歷史,計算機游戲已經(jīng)成為技術(shù)創(chuàng)新背后的動者渴望更加強大的硬件
9、計算能力;渴望不受不同的軟件的限制?無論是將圖形強制在人工智能(AI)上 還是網(wǎng)絡(luò)安全性。游戲開發(fā)者和玩家常常是前沿計算機技術(shù)的最早的采用者。由于他們的創(chuàng)新天性,游戲不再是由大型采購公司控制的技術(shù)產(chǎn)品?游戲領(lǐng)域總是有充足的空間給那此 在這方面有天分的單個創(chuàng)新者。隨著技術(shù)對游戲經(jīng)驗的促進,游戲市場持續(xù)增長。商業(yè)IT革命為我們節(jié)省了時間力之一。計算機游戲和金錢,從而提高了我們的工作水平,我們因此花費更多的時間和金錢在游戲上,來改善生活的整體質(zhì)量。甚至在當(dāng)今困難的經(jīng)濟時代,游戲仍保持快速增長,他仍然是盈利行業(yè)的組成部分。Java開發(fā)者應(yīng)該注意到這里蘊藏著的巨大的商機。1.3手機游戲特征手機游戲的盈利
10、主要是由于它們的涉及面很廣。手機已經(jīng)與現(xiàn)代生活方式緊緊地結(jié)合在一起。他們是最普遍攜帶的個人用品中僅次于鑰匙和錢包的東西。傳統(tǒng)的臺式機游戲?qū)⒛繕?biāo)鎖定在低級趣味的人和青少年身上,而手機游戲則每個人都可以訪問的到?隨時,隨地。盡管每個手機游戲都不貴,但是巨大的使用量(如:每人每星期一個新游戲)將使得這個市場商機無限并且有利可圖。但是,對于開發(fā)者來說,將控制臺游戲遷移到手機游戲工程很大因為他們所面向的對象、生活方式和分布式模型都有著極大的區(qū)別。讓我們從手機游戲的需求談起吧。 一個成功的手機游戲大多具有以下特征: 1:易于學(xué)習(xí): 既然手機游戲面向的是普通消費者而不是計算機高手,那么他們不可能深入的學(xué)習(xí)游
11、戲技巧。消費者不會花幾個小時去研究一個3美元的手動操作的游戲。所以游戲必須是一下載就可以玩的。保持游戲的簡單是最基本的要求。 2:可中斷性: 多任務(wù)處理是手機生活方式的基本特征。手機用戶常常在任務(wù)(如等一個電子郵件或者等車)之間有一小段時間。而游戲、日歷管理、通訊和工作數(shù)據(jù)訪問使用的是同一個設(shè)備。所以一個好的手機游戲應(yīng)該提供短時間的娛樂功能,并且允許用戶在游戲和工作模式之間順利切換。3:基于訂閱:手機游戲的盈利成功取決于他們巨大的使用量。一開始開發(fā)和設(shè)計每個游戲都是昂貴的。如果一個手機游戲開發(fā)者要賺錢的話,重要的是:同一個游戲引擎,多個標(biāo)題,基本的故事情節(jié)類似?;谟嗛喌挠螒蚴遣粩喈a(chǎn)生收入的最
12、好方法。 4:豐富的社會交互: 不管一個游戲設(shè)計得多好,只要玩家找到了它的根本模式或者玩完了所有的游戲路徑很快就會厭煩這個游戲。對于一個基于訂閱的游戲,重要的是與別的玩家合作以增強所玩游戲的智力和隨機性。在今天紛繁復(fù)雜的多玩家游戲中具有豐富社會交互的游戲證明是成功的。 1.4手機游戲的類型 基于以上標(biāo)準,最有可能成功的手機游戲就是那些臨時小游戲,它可為廣泛的玩家在所有的社交場合提供娛樂。特別是,下列類型的游戲?qū)⑹敲魈熳罹哂袣Φ挠螒颍?1:多玩家游戲: 這些游戲可以提供手機訪問以便建立在線游戲團體。或者,他們利用手機專有特征如多媒體通訊和基于位置的服務(wù),從而創(chuàng)建完全不同的社會結(jié)構(gòu)。好的游戲設(shè)
13、計和管理是這種類型游戲成功的關(guān)鍵。 2:基于內(nèi)容的游戲:這些游戲傳送版權(quán)的多媒體內(nèi)容,如名人的圖片、視頻片斷、音頻立體聲、和私人的體育節(jié)目,給那些音樂/電影/體育迷們。它成功的關(guān)鍵就是提供值得訂閱的高品質(zhì)的內(nèi)容流。 3:高沖擊的視頻游戲:PC 和臺式游戲已經(jīng)從2D 進化到3D。手機游戲也會遵循這種趨勢?,F(xiàn)在已經(jīng)出現(xiàn)手機3D工具箱和聽筒。但是,3D是非常資源集中型的。他們要求開發(fā)者和圖形設(shè)計者都是專家級的。專業(yè)的商店最有可能開發(fā)這些游戲。 1.5 手機軟件現(xiàn)狀 在信息社會中,手機及其他無線設(shè)備越來越多的走進普通百姓的工作和生活,隨著信息網(wǎng)絡(luò)化的不斷進展,手機及其他無線設(shè)備上網(wǎng)絡(luò)勢在必行。但是傳統(tǒng)
14、手機存在以下弊端: 1. 傳統(tǒng)手機出廠時均由硬件廠商固化程序,程序不能增加、刪除,有了錯誤也不能更新、修改,若要增加新功能必須另換一部手機。 2. 傳統(tǒng)手機訪問互聯(lián)網(wǎng)是通過WAP(Wireless Application Protocal),所有網(wǎng)絡(luò)資源必須接通網(wǎng)絡(luò)才能在線訪問,非常耗時、費用亦很高。 而Java技術(shù)在無線應(yīng)用方面的優(yōu)勢非常明顯: 1. 應(yīng)用程序可按需下載,而不是購買由硬件商提供的套件,可升級空間大。 2. Java技術(shù)提供了一個類庫,它使的應(yīng)用開發(fā)商可以創(chuàng)建更為直覺、豐富的用戶界面(GUI); 3. Java技術(shù)使網(wǎng)絡(luò)帶寬的應(yīng)用更為有效,因為應(yīng)用程序可以下載到器件上,并在本地
15、運行,僅僅是在連接到服務(wù)器時才會占用網(wǎng)絡(luò)帶寬。 基于以上分析,Java手機將是未來手機的發(fā)展方向,是業(yè)界的熱點。1.6 本游戲的未來 看過周潤發(fā)主演的賭神都知道里的豪斯是很好玩的,也很有發(fā)展前途。一,這個游戲?qū)κ謾C的要求不高;二,這個游戲簡單;三,當(dāng)這個游戲做成網(wǎng)絡(luò)游戲時,可以是各個玩家斗智的平臺;要實現(xiàn)這點技術(shù)要求并不難。在本設(shè)計的基礎(chǔ)上再加上某些技術(shù)就可以了:a) 網(wǎng)絡(luò)的連接 b) 能讀能存網(wǎng)絡(luò)數(shù)據(jù)庫 c) 牌不再是用隨機產(chǎn)生這么簡,它應(yīng)該根據(jù)玩家的積分來產(chǎn)生,這樣會更好。 1.7 手機未來的發(fā)展方向 手機游戲的盈利主要是由于它們的涉及面很廣。手機已經(jīng)與現(xiàn)代生活方式緊緊地結(jié)合在一起。他們是
16、最普遍攜帶的個人用品中僅次于鑰匙和錢包的東西。傳統(tǒng)的臺式機游戲?qū)⒛繕?biāo)鎖定在低級趣味的人和青少年身上,而手機游戲則每個人都可以訪問的到隨時,隨地。盡管每個手機游戲都不貴,但是巨大的使用量(如:每人每星期一個新游戲)將使得這個市場商機無限。只要有好的游戲,就會有更廣的使用量。 二 開發(fā)環(huán)境及相關(guān)技術(shù)的介紹 2.1 Java語言的特點 1. 平臺無關(guān)性 Java引進虛擬機原理,并運行于虛擬機,實現(xiàn)不同平臺之間的Java接口。使用Java編寫的程序能在世界范圍內(nèi)共享。Java的數(shù)據(jù)類型與機器無關(guān)。 2. 安全性 Java的編程類似C+,但舍棄了C+的指針對存儲器地址的直接操作,程序運行時,內(nèi)存由操作系
17、統(tǒng)分配,這樣可以避免病毒通過指針入侵系統(tǒng)。它提供 了安全管理器,防止程序的非法訪問。 3. 面向?qū)ο?Java吸收了C+面向?qū)ο蟮母拍?,將?shù)據(jù)封裝于類中,實現(xiàn)了程序的簡潔性和 便于維護性,使程序代碼可以只需一次編譯就可反復(fù)利用。 4. 分布式 Java建立在TCP/IP網(wǎng)絡(luò)平臺上,提供了用HTTP和FTP協(xié)議傳送和接收信息的庫函數(shù),使用其相關(guān)技術(shù)可以十分方便的構(gòu)建分布式應(yīng)用系統(tǒng)。 5. 健壯性 Java致力與檢查程序在編譯和運行時的錯誤,并自動回收內(nèi)存,減少了內(nèi)存出錯的可能性。Java取消了C語言的結(jié)構(gòu)、指針、#define語句、多重繼承、goto語句、操作符、重載等不易被掌握的特性,提供垃圾
18、收集器自動回收不用的內(nèi)存空間。 2.2 J2ME 是什么? 據(jù)J2ME應(yīng)用程序調(diào)用的API,J2ME應(yīng)用程序分為標(biāo)準應(yīng)用程序和不易移植的應(yīng)用程序兩種。 據(jù)J2ME應(yīng)用程序調(diào)用的API,J2ME應(yīng)用程序分為標(biāo)準應(yīng)用程序和不易移植的應(yīng)用程序兩種。 術(shù)語: CDC:連接設(shè)備配置 CLDC:連接限制設(shè)備配置 JRE:Java運行環(huán)境 MIDP:Mobile Information Device Profile規(guī)范 OTA:Over The Air 非OTA:數(shù)據(jù)線、藍牙(Bluetooth)、紅外線(IrDA)、多媒體信息服務(wù)(MMS)、Email附件 2.3 J2ME智能客戶端 J2ME平臺被認為是
19、最杰出的手機游戲平臺,它為開發(fā)者、設(shè)備制造商、網(wǎng)絡(luò)通信公司和消費者廣泛接受。它有一些非常重要的特征對所有組織都有益 2.4 J2ME 總體架構(gòu) J2ME 使用配置和簡表定制 Java 運行時環(huán)境 (JRE)。作為一個完整的 JRE,J2ME 由配置和簡表組成,配置決定了使用的 JVM,而簡表通過添加特定于域的類來定義應(yīng)用程序。 配置將基本運行時環(huán)境定義為一組核心類和一個運行在特定類型設(shè)備上的特定 JVM。我們將在 J2ME 配置一章中詳細討論配置。 簡表定義應(yīng)用程序;特別地,它向 J2ME 配置中添加特定于域的類,定義設(shè)備的某種作用。我們將在 J2ME 簡表一章中深入介紹簡表。 下面的圖表描述
20、了不同的虛擬機、配置和簡表之間的關(guān)系。它同時把 J2SE API 和它的 Java 虛擬機進行了比較。雖然 J2SE 虛擬機通常被稱為一種 JVM,但是 J2ME 虛擬機、KVM 和 CVM 都是 JVM 的子集。KVM 和 CVM 均可被看作是一種 Java 虛擬機 - 它們是J2SE JVM 的壓縮版,并特定于 J2ME。 移動通信的時代即將來臨,通信相關(guān)待業(yè)變得前景可期,而除了移動通信的主要通信工具手機,其功能越來越強大之外,有更多的廠商相繼投入移動通信設(shè)備的生產(chǎn)與開發(fā),其平臺和操作系統(tǒng)的復(fù)雜度比目前混亂的PDA有過之而不及,除了Symbian 針對手機推出操作系統(tǒng) Symbian OS
21、(過去稱做EPOC,)操作系統(tǒng)之外,微軟也針對手機推出操作系統(tǒng) Smartphone 2002 (Stinger),但是日前市面上的手機仍以使用廠商自行開發(fā)的操作系統(tǒng)者居多。 平臺的復(fù)雜紛亂對一般用戶當(dāng)然沒什么影響,但是對于程序開發(fā)人員來說,這么多不同的程序發(fā)展平臺,光看完頭就昏了。如果每個平臺都有自己的程序?qū)懛ㄒ约俺绦驇欤敲垂馐强瓷厦孢@些平臺至少就要學(xué)習(xí)五種以上程序的寫法。當(dāng)然,只專精一種平臺當(dāng)然是很好的事情??墒浅绦騿T不禁要說:“如果我們寫出來的軟件可以在不經(jīng)過修改源代碼的情況下就能夠在這些平臺上執(zhí)行,那不是更完美嗎?“對程序開發(fā)人員來說,這樣的投資報酬率當(dāng)然是最大的。 2.5 簡單環(huán)境
22、的搭建: 1、 下載JDK和J2ME無線工具包() 安裝SUN JDK:j2sdk-1_4_0_03-windows=i386 安裝SUN J2ME SDK:j2me_wireless_toolkit-1_0_3-win 2 關(guān)于Wireless Tool Kit WTK(Wireless Tool Kit)是Sun公司針對J2ME推出的用于手機和Palm等 移動設(shè)備的開發(fā)包,是除手機廠商的專用開發(fā)包外唯一的手機模擬器開發(fā)包。 它通用性高,開發(fā)出的應(yīng)用程序可保證能運行在大部分設(shè)備上,而不像專用 廠商具有一定的不兼容性。雖然它沒有強大的功能和完善的調(diào)試手段,但它 提供運行模擬器的最基本組件,是其
23、他IDE需集成采用的必備元素。 3, 用于手機游戲開發(fā)的環(huán)境不是只建立一個 java sdk 就可以了,它還需要了一個一個庫類,叫 java toolkit。首先安裝 java sdk 再在原來的目錄下安裝java toolkit這個新的環(huán)境就可以滿足我們的需要了。然后我們編寫一個最簡單的程序用來驗證這個環(huán)境是否可以用來編寫我們的手機程序。 編寫以下代碼: 保存成 Hello.java 文件。 import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class Hello extends MID
24、let private Display display; public Hello() display = Display.getDisplay(this); public void startApp() TextBox t = new TextBox(Hello MIDlet, Hello MIDP!, 256, 0); display.setCurrent(t); public void pauseApp() public void destroyApp(boolean unconditional) 啟動Ktoolbar 新建一個工程,取名 Hello 。把以上文件拷到 Hello 文件的
25、目錄編譯。能通過編譯并能運行,說明這個開發(fā)環(huán)境就能滿足我們的需要了。 三 J2ME 手機游戲需求分析 3.1 本程序需解決的有關(guān)技術(shù)問題 1. 游戲程序是一項精度要求很高的程序系統(tǒng),因為其代碼利用率很高。一個實時運行的最終作品,每秒都會運行成千上萬行程序,繪圖事件、鍵盤事件都會以極高的頻率在后臺等待響應(yīng),若有絲毫的差別都將很容易導(dǎo)致程序在運行不久后可能出現(xiàn)嚴重錯誤,甚至死循環(huán)。因此,其邏輯設(shè)計應(yīng)當(dāng)相當(dāng)嚴謹,需將所有可能發(fā)生的事件及意外情況考慮在設(shè)計中。 2. 游戲中為了美觀,適用性強,可能需要采用外部文件引入的圖片貼圖,有關(guān)貼圖,在MIDP2.0中提供了用于增強游戲功能的game包,使得解決靜
26、態(tài)或動態(tài)、畫面背景、屏幕刷新的雙緩沖等都有較好的解決方案。 3. 一開始就把牌全部分配好,這樣就可以簡單而有效地避免了牌的重復(fù),也可以大大地簡化了程序代碼的編寫。 4. 牌的轉(zhuǎn)化可以用一個函數(shù)來實現(xiàn),這樣就可以使代碼更模塊化,利用也就可以更高5牌慢慢移動的實現(xiàn)。牌的移動是用線程來實現(xiàn)的,用Thread.sleep() 這個函數(shù)來作時間延遲,讓坐標(biāo)變量緩慢地變化。然后通過刷新畫圖,就會使人覺得牌是在緩慢地移動。 6是否是要牌還是放棄(認輸),它通過向右鍵(要牌)和向左鍵(放棄)來操作的。當(dāng)點擊向右鍵時,發(fā)生點擊事伯,變量發(fā)生相應(yīng)的變化,然后觸發(fā)畫圖事件。 7當(dāng)玩家都跟到5張牌時,就要判斷牌的大小
27、了,它通過多次循環(huán),來確定其大小。 以上相關(guān)技術(shù)細節(jié)和整體流程將分別在以下小節(jié)闡述。 3.2 程序流程圖 MIDlet suite是MIDP應(yīng)用程序的最小單位,JAM負責(zé)將手機內(nèi)的MIDlet suite以圖形 v 化的方式呈現(xiàn),讓用戶能夠選取欲執(zhí)行的MIDlet suite,一旦選取了某個MIDlet suite,操作系統(tǒng)就會激活KVM執(zhí)行里面的MIDlet。MIDlet及相關(guān)的支持類組成了MIDP應(yīng)用程序的實際內(nèi)容。每個MIDlet都必須繼承javax.microedition.midlet.MIDlet這個抽象類。在MIDP規(guī)格中定義了MIDlet的生命周期,以及可以存在的三種狀態(tài),包括
28、Paused、Active以及Destroyed,每一個MIDlet在任何時刻只可能處于其中的一個狀態(tài)這 v 三種狀態(tài)的轉(zhuǎn)換關(guān)系如圖所示: 本程序采用面向?qū)ο蟮脑O(shè)計模式,對游戲中的所有物體賦予對象的概念和屬性。運行程序后允許用戶選擇執(zhí)行選項菜單,在開始游戲后將先從外部文件載入牌的圖文件,對背景的所有物體進行繪圖。在主程序運行的線程中,畫面刷新將以一定的頻率采用雙緩沖技術(shù)對屏幕重繪,實時反映整個游戲的進行狀態(tài)。用戶控制的牌運行在主線程中,隨屏幕刷新的頻率而移動。牌將在游戲開始時逐漸新增線程,每增加一個牌對象就新增加一條線程,一旦線程數(shù)滿到最大值(本程序暫設(shè)置最大值為幾千多個),就不允許線程的再增
29、加。這個線程問題就是本設(shè)計的一個 bug。 本程序主要的流程如圖32所示: 流程簡略解釋: 程序一開始執(zhí)行是先從主類 test.java 來開始。這個類從 MIDlet 類繼承過 來,在程序的開始函數(shù) startApp() 中我用 Navigator.current = Navigator.MAIN_SCREEN; 這個等式把程序的執(zhí)行轉(zhuǎn)到 MainScreen.java 文件(程序的畫面)來。而這個類繼承 List ,這個 List 類可以更方便地控制程序的選擇。在這個文件中列出一個菜單供用戶去選擇,如下: 開始 設(shè)定 版權(quán)聲明 離開 當(dāng)點擊開始時,程序轉(zhuǎn)到 GameScreen 這個類去。
30、GameScreen 這個類繼承 Canvas,Canvas 專門是用來控制游戲的。里面包括屏幕的繪圖,一些變量的初始化。 當(dāng)點擊設(shè)定時,程序轉(zhuǎn)到SetScreen 這個類。這個類用于登錄幫助網(wǎng)站的,當(dāng)然這個是需要網(wǎng)絡(luò)支持的。 當(dāng)點擊版權(quán)聲明時,程序轉(zhuǎn)到 CopyScreen 這個類,這個類繼承 Alert,它用于描述版權(quán)的一些信息。 當(dāng)點擊離開時,程序退出 test 類。 3.3 繪圖與MIDP2.0新增的GameCanvas包 3.3.1 提供低級繪制的Canvas類 為了能有程序開發(fā)人員控制接口的外觀和行為,需要使用大量的初級用戶接口類,尤其在游戲程序中,幾乎完全依賴的就是Canvas抽
31、象類進行繪圖。從程序開發(fā)的觀點看,Canvas類可與高級Screen類交互,程序可在需要時在Canvas中摻入高級類的組件。Canvas提供了鍵盤事件、指點桿事件(如果設(shè)備支持),并定義了允許將鍵盤按鍵映射為游戲控制鍵的函數(shù)。鍵盤事件由鍵代碼指定,但這樣控制游戲會導(dǎo)致缺乏通用性,并不是每個設(shè)備的鍵盤布局都適合游戲的操作。應(yīng)當(dāng)將鍵代碼轉(zhuǎn)換為游戲鍵的代碼,以便硬件開發(fā)商能定義他們自己的游戲鍵布局。本程序中,操縱用戶坦克運行的按鍵都定義為游戲控制鍵,這樣便能適應(yīng)所有的機器。 3.3.2 Graphics類 Graphics類提供了簡單的2D繪圖功能。它具有24位深度色彩的繪制能力,以三原色分別各占一
32、個字節(jié)表示其顏色。程序只能在paint()函數(shù)中使用Graphics繪制,GameCanvas可調(diào)用getGraphics()函數(shù)直接繪制在緩沖區(qū)上,可以在任何時間請求傳輸?shù)角芭_。其對象會被傳給Canvas的paint()函數(shù), 以便最終顯示。 3.3.3 PNG格式 PNG(Portable Network Graphics)格式是MIDlet唯一支持的圖象格式,PNG具體格式由PNG Specification,Version 1.0定義的。PNG格式提供透明背景的圖象,這對繪制游戲畫面和被操縱主角極有幫助。坦克之間或與障礙物碰撞時就不會因為背景有特定的顏色,顯示出的效果像貼上的圖片而缺乏
33、真實感,物體之間輕微重疊時最上層圖片也不會覆蓋超過其有效象素外的部分。 PNG格式圖片中包含許多定義其圖片特性的冗余部分(Chunks)。這些代碼包含在每一個單獨的png格式圖象中,然而如果將多個png圖象合并在一張幅面稍大一些的整圖中,多個chunks就可以得到精簡,圖片的大小可以得到控制。使用Image 類中的createImage函數(shù)可從整圖中分割出所需要的元素。在Game包中的TiledLayer和Sprite類都整合了這樣的 功能。本程序中的地圖元素都集成在一張tile.png圖片中,實現(xiàn)了方便的管理和程序體積的精簡。 3.4 有關(guān)繪圖的一些技術(shù) 在沒有MIDP2.0前,進行游戲繪圖
34、一般需要手動編程使用雙緩沖。需要在paint()方法內(nèi)所想要畫的圖形畫在一張預(yù)先準備好的背景,等所有繪圖操作都完成后再將背景的數(shù)據(jù)拷貝到實際的屏幕上。Image類提供了一個建立背景的靜態(tài)方法createImage(int width, int height),再利用getGraphics()方法取得屬于這個背景的Graphics對象,所進行的繪圖操作都會作用在背景上,等到全部的繪圖操作完成后,再調(diào)用drawImage()方法將背景的數(shù)據(jù)復(fù)制到實際顯示的屏幕上。 3.5 內(nèi)存使用的最佳化 通常在MIDP應(yīng)用程序的手機執(zhí)行環(huán)境中,所牽涉的內(nèi)存有下列三種: 應(yīng)用程序存儲內(nèi)存 RecordStore存
35、儲內(nèi)存 執(zhí)行時期內(nèi)存(Java Heap) 其中前兩種是持久性的內(nèi)存,關(guān)閉電源后還能保持數(shù)據(jù)的正確性,通常這兩種內(nèi)存所能存儲的容量是合并計算的,這個上限對每種手機都不一樣,大部分在一兩百KB內(nèi)。在這樣的情況下需要在不影響原有功能的情況下適當(dāng)?shù)目s減JAR文件的大小,除了可以克服內(nèi)存空間的限制外,也能大幅度縮短下載的時間(費用也降低了),勢必會有更多的人愿意下載所開發(fā)的程序。其方法有第一就是盡量縮短命名的長度。在應(yīng)用程序內(nèi),對于所建立的類、接口、方法及變量名而言,都需要賦予一個識別的名稱,所命名的名稱每多一個字符就會在類文件內(nèi)多產(chǎn)生一個字節(jié),對于一個較復(fù)雜的應(yīng)用程序而言就會增加為數(shù)不小的數(shù)據(jù)量。所
36、有這些可以借助混淆器來幫助實現(xiàn)。 第二是減少復(fù)雜的程序結(jié)構(gòu),為一些共同的行為建立一個抽象類(Abstract Class) 來表示繼承的子類的共通性。 第三是減少圖形數(shù)據(jù)的大小。將PNG格式的小分辨率圖象合并在一張大的高分辨率圖象中,由于減少了chunks,將比合并前的總大小減少許多。 3.6 混淆器(Obfuscator)的使用 Java 語言并沒有完全編譯成二進制可執(zhí)行文件,編譯出的.class文件是一種介于源程序和二進制之間的一中基于半解釋的字節(jié)碼,需要虛擬機來執(zhí)行。它包括了所有的信息。然而這樣會導(dǎo)致.class很容易被反編譯為源代碼,從而不能保護作者的知識成果。目前流行的如decode
37、,JAD等反編譯工具可以以很快的速度生成源文件。如果不加以施行有效的措施,將造成嚴重的后果。 由此引入混淆器的概念?;煜鲗⒋a中的所有變量、函數(shù)、類的名稱變?yōu)楹喍痰挠⑽淖帜复?,如果缺乏相?yīng)的函數(shù)名指示和程序注釋,即使被反編譯,也將難以閱讀。 混淆器的作用不僅僅是保護代碼,它也有精簡編譯后程序大小的作用。由于以上介紹的減少變量、函數(shù)的命名長度的關(guān)系,編譯后也會從.class文件中減少這些冗余的信息?;煜螅w積大約能減少25%,這對當(dāng)前費用較貴的無線網(wǎng)絡(luò)傳輸是有一定意義的。 為了能與各種IDE集成,就像Java2 SDK一樣,混淆器采用命令行參數(shù)的形式,以便可被其調(diào)用。目前流行的Obfusc
38、ator有RetroGuard等。 3.7 模擬器的相關(guān)調(diào)試 IDE整合的Wireless Tool Kit提供了許多在運行時監(jiān)視運行狀態(tài)的工具。 包括內(nèi)存狀況的檢測(手機上的內(nèi)存空間十分有限,必須時刻關(guān)注機載內(nèi)存是否大于程序所能使用到的最大可能的內(nèi)存空間),網(wǎng)絡(luò)狀況的檢測,運行函數(shù)的跟蹤等。如圖3-4,是內(nèi)存跟蹤測試隨時間變化的調(diào)試器。其中,允許強制垃圾回收(Garbage Collection)。由于Java語言中,不像許多其他的如C+語言,不需要指定回收函數(shù)中特定不使用的資源,資源回收機制將自動清空無效變量占用的空間。在程序運行中也可以調(diào)用System類的gc()函數(shù)手動收回廢棄的內(nèi)存。
39、 四 程序分析和編寫手機代碼 4.1 游戲進入前的選擇 每個MIDlet程序都必須有一個主類,該類必須繼承自MIDlet。它控制著整個程序的運行,并且可以通過相應(yīng)函數(shù)從程序描述文件中獲取相關(guān)的信息。該類中擁有可以管理程序的創(chuàng)建、開始、暫停(手機中很可能有正在運行程序卻突然來電的情況,這時應(yīng)進入暫停狀態(tài)。)、結(jié)束的函數(shù)。 本設(shè)計程序進入時,首先載入畫面的不是游戲運行狀態(tài),而是提供選項,當(dāng)選擇 開始 時正式運行。因此,在 MainScreen的構(gòu)造函數(shù)中分配了List類,即選項畫面的內(nèi)存空間。在startApp()函數(shù)中,隨即調(diào)用了Displable的setCurrent()函數(shù)將當(dāng)前屏幕設(shè)置為N
40、avigator.MAIN_SCREEN。在 版權(quán)聲明 界面前,建造了一個Alert類。Alert對象用于顯示提示、警告,還有版權(quán)信息等告之用戶信息的臨時閃現(xiàn)的屏幕,它可作為setCurrent的參數(shù),提前顯示在最終需要顯示的屏幕前。當(dāng)程序轉(zhuǎn)到 GameScreen 時,畫面將永久顯示游戲本身,直到用戶點擊相應(yīng)按鈕手動結(jié)束。但是當(dāng)顯示的畫面元素超過一屏大小時,將自動轉(zhuǎn)換為永久狀態(tài)。 4.2 主游戲邏輯及其涉及到的若干類 4.2.1 程序的菜單選項 這個寫在 MainScreen.java 文件中,這個類繼承 List 。同時也繼承了接口commandListener,這樣,就可以使用高級界面的
41、Command按鈕。繼承了commandListener的類必須擁有commandAction(),以決定對按鍵采取什么樣的行為。即按鈕事件觸發(fā)后需執(zhí)行的函數(shù)。在設(shè)置好commandlistener后,需要調(diào)用setCommandListener()以將按鈕事件激活。用append 方法來加入菜單: append(開始,null); append(設(shè)定,null); append(版權(quán)聲明,null); append(離開,null); setCommandListener(this); 再用 getString(int) 函數(shù)來獲得菜單的選項。 MainScreen.java 文件: imp
42、ort javax.microedition.lcdui.*; public class MainScreen extends List implements CommandListener private static Displayable instance; synchronized public static Displayable getInstance() if(instance = null) instance = new MainScreen(); return instance; private MainScreen() super(進入Game,IMPLICIT); / 菜
43、單選擇 append(開始,null); append(設(shè)定,null); append(版權(quán)聲明,null); append(離開,null); / 事件偵聽 setCommandListener(this); public void commandAction(Command c,Displayable s) / 事件偵聽 String cmd= getString(getSelectedIndex(); / 把得到的值傳給程序控制器,用程序控制器來決定指引程序的執(zhí)行。 Navigator.flow(cmd); 4.2.2 游戲的設(shè)定 這個寫在 SetScreen.java 文件中,而這個
44、類繼承 Form 類,同時也繼承了接口commandListener,這樣,就可以使用高級界面的TextField按鈕。繼承了commandListener的類必須擁有commandAction(),以決定對 TextField 值獲取采等行為。在設(shè)置好commandlistener后,需要調(diào)用setCommandListener()函數(shù)來把值傳入程序中。 SetScreen.java 文件: import javax.microedition.lcdui.*; public class SetScreen extends Form /繼承 CommandListener 接口 impleme
45、nts CommandListener private static Displayable instance; synchronized public static Displayable getInstance() if(instance = null) instance = new SetScreen(); return instance; / 定義 TextField (文本輸入框) TextField url; Gauge volume; private SetScreen() super(設(shè)定); url = new TextField(請輸入服務(wù)器位置,socket:/127.0
46、.0.1:99,40,TextField.URL); append(url); volume = new Gauge(音量,true,10,3); / 軟鍵菜單 addCommand(new Command(輔助說明,Command.HELP,1); addCommand(new Command(返回,Command.BACK,1); / 事件偵聽 setCommandListener(this); public void commandAction(Command c,Displayable s) Navigator.flow(c.getLabel(); 4.2.3 游戲中的幫助和程序控制器
47、 首先調(diào)用 HelpScreen 類,然后賦一個值輔助說明給 Navigator 類,當(dāng)Navigator接收到這個值時,就顯示幫助字符串。 HelpScreen.java import javax.microedition.lcdui.*; public class HelpScreen extends Form implements CommandListener public HelpScreen(String c) super(輔助說明); append; addCommand(new Command(返回,Command.BACK,1); setCommandListener(thi
48、s); public void commandAction(Command c,Displayable s) Navigator.flow(c.getLabel(); 這個寫在Navigator.java 里,它接收 SetScreen.,MainScreen等類傳過來的值。然后根據(jù)它觸發(fā)的按鈕事件,來調(diào)用相對應(yīng)的事件。 /Navigator.java import javax.microedition.lcdui.*; import javax.microedition.midlet.*; import java.util.*; public class Navigator final pu
49、blic static int MAIN_SCREEN = 1; final public static int GAME_SCREEN = 2; final public static int SET_SCREEN = 3; final public static int GAME_HELP_SCREEN = 4; final public static int SET_HELP_SCREEN = 5; public static MIDlet midlet; public static Display display; public static int current; / 自定義一個類
50、 / 重載函數(shù) public static void show(Object obj) switch(current) case MAIN_SCREEN: display.setCurrent(MainScreen.getInstance(); break; case GAME_SCREEN: display.setCurrent(GameScreen.getInstance(); break; case SET_SCREEN: display.setCurrent(SetScreen.getInstance(); break; case GAME_HELP_SCREEN: display.s
51、etCurrent(new HelpScreen(String)obj); break; case SET_HELP_SCREEN: display.setCurrent(new HelpScreen(String)obj); break; public static void flow(String cmd) switch(current) case MAIN_SCREEN : if(cmd.equals(開始) current = GAME_SCREEN ; show(null); else if(cmd.equals(設(shè)定) current = SET_SCREEN; show(null
52、); else if(cmd.equals(版權(quán)聲明) display.setCurrent(CopyScreen.getInstance(); else if(cmd.equals(離開) midlet.notifyDestroyed(); break; case GAME_SCREEN : if(cmd.equals(輔助說明) current = GAME_HELP_SCREEN; show(游戲的操作方式:向右鍵要牌,向左鍵放棄!順子并同花最大,其次四張相同的牌,順子,再次三張相同的牌和兩個到順子,再次到同花.); else if(cmd.equals(返回) current = MA
53、IN_SCREEN; show(null); break; case SET_SCREEN : if(cmd.equals(輔助說明) current = SET_HELP_SCREEN; show(設(shè)定方式); else if(cmd.equals(返回) current = MAIN_SCREEN; show(null); break; case GAME_HELP_SCREEN : if(cmd.equals(返回) current = MAIN_SCREEN; show(null); break; case SET_HELP_SCREEN: if(cmd.equals(返回) current = SET_SCREEN; show(null); break; 4.2.4 游戲版權(quán)聲明 / CopyScreen.java import javax.microedition.lcdui.*; public c
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 植樹節(jié)倡議國旗下講話稿(34篇)
- 歐姆定律教案
- 2024屆浙江省選考十校聯(lián)盟下學(xué)期高三年級七調(diào)考試(月考卷)數(shù)學(xué)試題
- 科藝交融:教學(xué)新視角-跨學(xué)科教學(xué)法的創(chuàng)新實踐
- 豐都交通發(fā)展現(xiàn)狀及未來趨勢分析簡介
- 公眾演講技巧教學(xué)課件
- 女性健康知識講座課件
- 烹飪、營養(yǎng)、衛(wèi)生之間的關(guān)系
- 2024八年級數(shù)學(xué)上冊階段拔尖專訓(xùn)3依據(jù)特點巧妙化簡習(xí)題課件新版北師大版
- 2024年哈爾濱客運資格專業(yè)能力考試考什么
- 部編版語文四年級上冊 《16.麻雀》課件 (共14張PPT)
- 中小學(xué)生心理健康量表MHT
- 保安證書表格
- 五年級語文上冊課件-第6單元口語交際-父母之愛(部編版)(共15張PPT)
- 《思想道德與法治》2021版教材第二章
- 流行病學(xué)課件:第23章 流行性感冒
- 辦公家具項目實施方案、供貨方案
- 青少年肥胖以及預(yù)防
- DB3303∕T 020-2020 公共機構(gòu)食堂陽光采購規(guī)范
- 幼兒園課件《我會保護自己》
- 合理應(yīng)用抗菌藥物
評論
0/150
提交評論