畢業(yè)論文---- 基于j2me的手機(jī)游戲開(kāi)發(fā)_第1頁(yè)
已閱讀1頁(yè),還剩49頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、<p>  本 科 生 畢 業(yè) 論 文(設(shè)計(jì))</p><p>  題目 基于J2ME的手機(jī)游戲開(kāi)發(fā)關(guān)鍵技術(shù)研究與應(yīng)用 </p><p><b>  摘要</b></p><p>  無(wú)線通訊領(lǐng)域的飛速發(fā)展,使得移動(dòng)電話在人們的生活中占有越來(lái)越重要的地位。由于其便攜性和普及性的特點(diǎn),手機(jī)上的應(yīng)用程序尤其是娛樂(lè)程序也逐漸成為市

2、場(chǎng)的新熱點(diǎn)。</p><p>  J2ME平臺(tái)作為Java體系的一個(gè)分支,廣泛應(yīng)用于消費(fèi)和嵌入式設(shè)備中,它主要針對(duì)資源受限制的設(shè)備做Java開(kāi)發(fā)。J2ME通過(guò)虛擬機(jī)、配置和簡(jiǎn)表實(shí)現(xiàn)跨平臺(tái)性,虛擬機(jī)建立在本地操作系統(tǒng)之上,配置層建立在虛擬機(jī)基礎(chǔ)上并定義了虛擬機(jī)和java語(yǔ)言的特性,簡(jiǎn)表層為具體的設(shè)備類型定義了特定的要求。</p><p>  本文首先介紹J2ME平臺(tái)的相關(guān)概念與規(guī)范,分析國(guó)內(nèi)

3、外的應(yīng)用趨勢(shì)與關(guān)鍵技術(shù)。然后結(jié)合一款網(wǎng)絡(luò)游戲的開(kāi)發(fā),詳細(xì)分析在J2ME平臺(tái)上如何在游戲中進(jìn)行動(dòng)畫(huà)效果顯示、圖片變色處理、網(wǎng)絡(luò)通訊。</p><p>  關(guān)鍵字:J2ME,移動(dòng)信息設(shè)備概要描述,手機(jī)網(wǎng)絡(luò)游戲</p><p><b>  Abstract</b></p><p>  This is an age of wireless commun

4、ication and mobile phone has already become an indispensable part of our daily life. As a result, entertainment applications on mobile phones are popping up like flowers after a spring rain.</p><p>  Running

5、 on JVM and targeting at resource limited devices, J2ME wins its great popularity as the best platform for mobile applications in industry for its platform independence and great flexibility. </p><p>  via t

6、he case study of a mobile phone Internet game application, the paper studies in detail several key issues in the game design including cartoon design and painting, graphic processing and rendering, network communications

7、 etc. Optimization issues are also discussed in detail.</p><p>  Keywords: J2ME, MIDP, mobile phone Internet application</p><p><b>  目錄</b></p><p><b>  第一章緒論1<

8、;/b></p><p>  1.1 J2ME的背景與應(yīng)用現(xiàn)狀1</p><p>  1.2 手機(jī)游戲的發(fā)展現(xiàn)狀2</p><p>  1.3 研究目的與內(nèi)容3</p><p>  第二章J2ME架構(gòu)與技術(shù)特點(diǎn)4</p><p>  2.1 J2ME架構(gòu)4</p><p>  

9、2.2 J2ME組件4</p><p>  2.3 移動(dòng)設(shè)備上游戲的限制5</p><p>  2.3.1 內(nèi)存5</p><p>  2.3.2 手機(jī)的界面6</p><p>  2.3.3 缺少庫(kù)文件支持6</p><p>  第三章一款基于J2ME的游戲--《天下2》的設(shè)計(jì)7</p>

10、<p>  3.1 《天下2》簡(jiǎn)介7</p><p>  3.2 《天下2》系統(tǒng)架構(gòu)設(shè)計(jì)8</p><p>  3.3關(guān)鍵技術(shù)研究10</p><p>  3.3.1 動(dòng)畫(huà)渲染技術(shù)10</p><p>  3.3.2 網(wǎng)絡(luò)通訊11</p><p>  3.3.3 用戶與界面的交互11</p&

11、gt;<p>  第四章圖像和動(dòng)畫(huà)渲染的處理12</p><p>  4.1 MIDP 2.0下的一般處理方式12</p><p>  4.1.1 GameCanvas12</p><p>  4.1.2 Layer12</p><p>  4.1.3 LayerManager13</p><p&

12、gt;  4.1.4 Sprite13</p><p>  4.1.5 TiledLayer13</p><p>  4.2 《天下2》對(duì)圖像顯示部分的改進(jìn)14</p><p>  4.2.1 《天下2》圖像顯示模塊的結(jié)構(gòu)14</p><p>  4.2.2 圖像變色的設(shè)計(jì)18</p><p>  4.3 J

13、2ME平臺(tái)下圖像顯示技術(shù)的探討21</p><p>  第五章網(wǎng)絡(luò)通訊設(shè)計(jì)23</p><p>  5.1 J2ME平臺(tái)網(wǎng)絡(luò)通訊23</p><p>  5.2 網(wǎng)絡(luò)游戲中數(shù)據(jù)包設(shè)計(jì)23</p><p>  5.3 《天下2》網(wǎng)絡(luò)數(shù)據(jù)包的設(shè)計(jì)24</p><p>  5.3.1 數(shù)據(jù)包通用規(guī)則24<

14、/p><p>  5.3.2 數(shù)據(jù)包頭定義26</p><p>  第六章界面和用戶交互的研究與設(shè)計(jì)28</p><p>  6.1 移動(dòng)平臺(tái)上的界面交互28</p><p>  6.2 《天下2》界面控件的設(shè)計(jì)29</p><p>  6.3 網(wǎng)絡(luò)通訊與界面控件的結(jié)合:商人NPC的設(shè)計(jì)31</p>

15、<p>  6.3.1 NPC部分的系統(tǒng)結(jié)構(gòu)31</p><p>  6.3.2 商人NPC的界面控件32</p><p>  6.3.3 商人NPC專用的數(shù)據(jù)包32</p><p>  6.3.4 商人NPC的流程34</p><p>  第七章J2ME程序優(yōu)化的研究37</p><p> 

16、 7.1 內(nèi)存優(yōu)化37</p><p>  7.2 程序執(zhí)行速度優(yōu)化38</p><p>  7.3 使用工具優(yōu)化38</p><p>  第八章總結(jié)與展望40</p><p>  附錄A:Java下RGB空間和HLS空間的相互轉(zhuǎn)換41</p><p><b>  參考文獻(xiàn)44</b>

17、;</p><p><b>  致謝45</b></p><p><b>  緒論</b></p><p>  1.1 J2ME的背景與應(yīng)用現(xiàn)狀</p><p>  自Java問(wèn)世以來(lái),Sun Microsystems已成功地將Java平臺(tái)技術(shù)推廣到臺(tái)式機(jī)及服務(wù)器。隨著移動(dòng)電話和個(gè)人數(shù)字助理(PD

18、A)的日益普及和性能的不斷提高,將Java技術(shù)應(yīng)用于移動(dòng)設(shè)備這個(gè)發(fā)展方向,將在未來(lái)得到更高的重視。</p><p>  J2ME(Java 2 Micro Edition)是為小型設(shè)備設(shè)計(jì)的Java平臺(tái)。它包含專門設(shè)計(jì)的輕量級(jí)虛擬機(jī),一個(gè)最小化的核心庫(kù)和標(biāo)準(zhǔn)Java庫(kù)的輕量級(jí)替代物。J2ME是無(wú)線PDA和高性能的移動(dòng)電話的理想移動(dòng)客戶機(jī)平臺(tái)。</p><p>  Sun Microsyst

19、ems 將 J2ME 定義為“一種以廣泛的消費(fèi)性產(chǎn)品為目標(biāo)的高度優(yōu)化的 Java 運(yùn)行時(shí)環(huán)境,包括尋呼機(jī)、移動(dòng)電話、可視電話、數(shù)字機(jī)頂盒和汽車導(dǎo)航系統(tǒng)?!?自從 1999 年Developer Conference 上聲明之后,J2ME 為小型設(shè)備帶來(lái)了 Java 語(yǔ)言的跨平臺(tái)功能,允許移動(dòng)無(wú)線設(shè)備共享應(yīng)用程序。[1][4]</p><p>  在另一方面,隨著移動(dòng)通信技術(shù)的高速發(fā)展,移動(dòng)設(shè)備的性能日益提高,同時(shí)

20、用戶對(duì)于移動(dòng)設(shè)備上應(yīng)用程序的需求也越來(lái)越多。但是,移動(dòng)設(shè)備制造商本身的軟件開(kāi)發(fā)能力和資源都有限,無(wú)法充分滿足用戶的需要。同時(shí),由于以前主要移動(dòng)設(shè)備上的程序主要用C語(yǔ)言開(kāi)發(fā),并采用專用的操作系統(tǒng),其他眾多軟件開(kāi)發(fā)商也無(wú)法為其開(kāi)發(fā)新的應(yīng)用程序。這種兩難的局面嚴(yán)重的限制了移動(dòng)設(shè)備上新應(yīng)用的推廣于普及。</p><p>  Java技術(shù)的開(kāi)放性、安全性和龐大的社會(huì)已有資源,以及其跨平臺(tái)性,即“編寫(xiě)一次,到處運(yùn)行”的特點(diǎn),

21、使Java技術(shù)成為智能手機(jī)軟件平臺(tái)的事實(shí)標(biāo)準(zhǔn)。采用Java技術(shù)后,編寫(xiě)應(yīng)用程序和提供服務(wù)的人就不必關(guān)心接受其服務(wù)的手機(jī)采用的是什么操作系統(tǒng)和芯片,只要按照J(rèn)ava的要求寫(xiě)出的程序就可以運(yùn)行;同樣,生產(chǎn)手機(jī)的廠商也不必顧慮將來(lái)誰(shuí)來(lái)提供增值服務(wù)??梢钥闯?,采用Java技術(shù),可以建立完整、高效的無(wú)線數(shù)據(jù)增值服務(wù)產(chǎn)業(yè)鏈,從而為用戶提供靈活、個(gè)性化、內(nèi)容方式多樣的服務(wù)。</p><p>  如今支持Java已經(jīng)成了主流手機(jī)

22、的標(biāo)準(zhǔn),支持下載新的Java應(yīng)用也是手機(jī)的一個(gè)重要賣點(diǎn)。到2005年6月,全世界已經(jīng)有大約1億部Java手機(jī)在使用,除中國(guó)大陸外共有53個(gè)移動(dòng)運(yùn)營(yíng)商正式推出了基于Java技術(shù)的無(wú)線數(shù)據(jù)增值服務(wù)。</p><p>  在國(guó)內(nèi),中國(guó)移動(dòng)通信集團(tuán)已經(jīng)建立了無(wú)線Java增值服務(wù)體系,并推出了“百寶箱”等服務(wù)品牌,包括游戲百寶箱、娛樂(lè)百寶箱、商務(wù)百寶箱、生活百寶箱等,已經(jīng)于2003年7月10日開(kāi)始正式商用。</p&g

23、t;<p>  中國(guó)聯(lián)通公司也正在其CDMA 1X網(wǎng)絡(luò)上建立無(wú)線Java增值服務(wù)體系,目前系統(tǒng)正在建設(shè)過(guò)程中,并且2003年9月26日中國(guó)聯(lián)通、北京振戎融通公司和Sun公司在人民大會(huì)堂宣布聯(lián)合發(fā)起成立“UniJa技術(shù)聯(lián)盟”,三方將在聯(lián)通CDMA 1X網(wǎng)絡(luò)上的Java增值服務(wù)方面全面合作。</p><p>  1.2 手機(jī)游戲的發(fā)展現(xiàn)狀</p><p>  所謂“手機(jī)游戲”,就

24、是依托移動(dòng)通信網(wǎng)絡(luò)運(yùn)行在手機(jī)終端上的游戲。從誕生到現(xiàn)在,手機(jī)游戲經(jīng)歷了從最初的簡(jiǎn)單文字類游戲、簡(jiǎn)單的圖形界面游戲到可下載的單機(jī)版游戲再到大型手機(jī)網(wǎng)絡(luò)游戲的發(fā)展歷程,手機(jī)游戲的業(yè)務(wù)形態(tài)日益成熟,展示出廣闊的市場(chǎng)前景。有關(guān)機(jī)構(gòu)預(yù)測(cè),在未來(lái)5年里,手機(jī)游戲?qū)⒃跉W洲形成30億歐元的大市場(chǎng)。另?yè)?jù)IDC預(yù)測(cè),到2006年,手機(jī)游戲業(yè)務(wù)的軟件、硬件及服務(wù)所帶來(lái)的收入將達(dá)到40億美元。近兩年來(lái),手機(jī)游戲業(yè)務(wù)在日韓等國(guó)已經(jīng)顯示出勃勃生機(jī),成為一個(gè)潛力巨大

25、的文化產(chǎn)業(yè)。以日本NTT DoCoMo目前的經(jīng)營(yíng)狀況為例,移動(dòng)游戲已經(jīng)成為該公司的重要收入來(lái)源。日本最大的游戲網(wǎng)站BanDai擁有200多萬(wàn)用戶,每個(gè)用戶每月平均花2.75美元在i-mode手機(jī)上玩游戲,這為DoCoMo和BanDai帶來(lái)約550萬(wàn)美元的收入。</p><p>  與日、韓等國(guó)相比,中國(guó)的手機(jī)游戲市場(chǎng)起步比較晚,但中國(guó)有一個(gè)巨大的手機(jī)用戶群,手機(jī)游戲擁有廣闊的市場(chǎng)前景。目前,在中國(guó)有8000多萬(wàn)電

26、腦網(wǎng)絡(luò)用戶,而中國(guó)的手機(jī)用戶卻已經(jīng)超過(guò)3億。與PC游戲不同,手機(jī)游戲擺脫了線纜的束縛,具有隨時(shí)、隨地、隨身的特點(diǎn),更適合人們?cè)谝苿?dòng)中休閑和娛樂(lè)。顯然,手機(jī)游戲產(chǎn)業(yè)一旦啟動(dòng),其能量將不亞于目前的電腦網(wǎng)絡(luò)游戲。數(shù)據(jù)顯示,2004年中國(guó)手機(jī)游戲市場(chǎng)規(guī)模超過(guò)8億元人民幣,預(yù)計(jì)在2005年手機(jī)游戲產(chǎn)業(yè)市場(chǎng)規(guī)模將達(dá)到14.41億元人民幣。雖然目前手機(jī)游戲用戶數(shù)只占3億用戶的很小一部分,但隨著手機(jī)游戲產(chǎn)業(yè)發(fā)展環(huán)境的日益成熟,其發(fā)展速度將一日千里。&l

27、t;/p><p>  其中的手機(jī)網(wǎng)絡(luò)游戲,是手機(jī)游戲產(chǎn)業(yè)未來(lái)發(fā)展的重要趨勢(shì)和遠(yuǎn)景。區(qū)別于傳統(tǒng)手機(jī)游戲,手機(jī)網(wǎng)絡(luò)游戲應(yīng)該具有什么網(wǎng)絡(luò)游戲和手機(jī)單機(jī)游戲的雙重特點(diǎn)。手機(jī)游戲主要作用應(yīng)該是一種大眾化的移動(dòng)數(shù)據(jù)增值服務(wù),而良好的游戲的便捷性和操作性是影響游戲可玩度的主要標(biāo)準(zhǔn)之一。手機(jī)游戲在操縱性能上受到一定的制約。往往是通過(guò)類比化的按鍵和簡(jiǎn)便易懂的游戲手段快速的完成實(shí)時(shí)的操作過(guò)程。而另外一個(gè)方面網(wǎng)絡(luò)游戲必須有非常有效的信息交

28、互平臺(tái),傳統(tǒng)的PC或者TV網(wǎng)絡(luò)游戲的平臺(tái)并不適應(yīng)于硬件條件簡(jiǎn)單的手機(jī)使用。手機(jī)網(wǎng)絡(luò)游戲的信息交互平臺(tái)相對(duì)簡(jiǎn)單,但必須滿足用戶的最基本交流需要。</p><p>  1.3 研究目的與內(nèi)容</p><p>  基于移動(dòng)設(shè)備的應(yīng)用軟件,從以前的只提供基本的語(yǔ)音,通訊錄和SMS功能,到后來(lái)提供WAP(Wireless Application Protocol)等基本的附加應(yīng)用,再到目前逐漸豐富的

29、各種應(yīng)用。J2ME平臺(tái)的出現(xiàn),為第三方軟件開(kāi)發(fā)商為移動(dòng)設(shè)備開(kāi)發(fā)應(yīng)用軟件帶來(lái)了極大的便利,開(kāi)發(fā)商可以方便的將應(yīng)用軟件移植到移動(dòng)設(shè)備上。豐富的Java資源和Java開(kāi)發(fā)人員,可以大大的縮短開(kāi)發(fā)周期。同時(shí)也可以為移動(dòng)應(yīng)用提供在線升級(jí)和動(dòng)態(tài)下載的服務(wù)。</p><p>  本次研究的目的主要在于分析基于J2ME平臺(tái)進(jìn)行手機(jī)游戲開(kāi)發(fā)所用到的核心技術(shù),如繪圖、圖形與動(dòng)畫(huà)顯示,響應(yīng)用戶輸入,網(wǎng)絡(luò)通訊。并且還要針對(duì)J2ME平臺(tái)本

30、身的缺點(diǎn),以及具體的應(yīng)用,提出自己的改進(jìn)方法和解決方案。</p><p>  J2ME架構(gòu)與技術(shù)特點(diǎn)</p><p>  2.1 J2ME架構(gòu)</p><p>  圖1-1:J2ME體系結(jié)構(gòu)</p><p>  僅僅將J2ME從J2SE中區(qū)分開(kāi)來(lái)并不能解決所有的兼容性問(wèn)題。圖1-1顯示了J2ME平臺(tái)的多層結(jié)構(gòu)。由于有多種多樣的移動(dòng)設(shè)備,它們?yōu)?/p>

31、了不同的目的設(shè)計(jì)為了現(xiàn)實(shí)中平衡移植性和性能與可比性,J2ME包含了幾個(gè)稱為配置(Configuration)、簡(jiǎn)檔(Profile)、可選包(Optional Packages)的組件。[12]每一種配置和簡(jiǎn)檔的有效配合針對(duì)的是一種特定的設(shè)備。配置提供了最基本和一般性的語(yǔ)言功能。簡(jiǎn)檔在配置之上,它支持了更高級(jí)的API,如圖形界面(GUI)、永久性存儲(chǔ)、安全和網(wǎng)絡(luò)連接??蛇x包可以與標(biāo)準(zhǔn)簡(jiǎn)檔綁定以滿足特定程序的需要。</p>

32、<p>  2.2 J2ME組件</p><p>  在配置這一層,J2ME中最重要的兩個(gè)配置是CDC和CLDC</p><p>  連接受限設(shè)備配置(Connected Limited Device Configuration,CLDC[7])是用于最小的無(wú)線設(shè)備的。它們有160K及160K以上的內(nèi)存,低速的16/32位處理器。CLDC具有有限的算術(shù)、字符串和IO功能,并缺少像

33、JNI(Java Native Interfae,Java本地接口)和自定義類加載這樣的功能。CLDC虛擬機(jī)(稱為KVM)只支持J2SE核心庫(kù)的一小部分。</p><p>  連接設(shè)備配置(Connected Device Configuration,CDC)用于具有至少2M內(nèi)存和32位處理器的高級(jí)無(wú)線設(shè)備。與CLDC不同,CDC支持JVM的全部功能,因此可以利用大部分J2SE的庫(kù)。</p><

34、;p>  從上述的標(biāo)準(zhǔn)中可以看出CLDC 主要指那些資源非常受限的設(shè)備比如手機(jī)、PDA、雙工尋呼機(jī)等。而CDC 主要指處理能力相對(duì)較強(qiáng)的設(shè)備,比如機(jī)頂盒、汽車導(dǎo)航系統(tǒng)等。</p><p>  在簡(jiǎn)檔這一層,最重要和最成功的J2ME簡(jiǎn)檔是移動(dòng)信息設(shè)備簡(jiǎn)檔(Mobile Information Device Profile,MIDP),它基于CLDC。MIDP針對(duì)的是最小設(shè)備,如手機(jī)。目前大部分的主流手機(jī)都已經(jīng)

35、支持MIDP。MIDP為移動(dòng)應(yīng)用提供的核心應(yīng)用包括用戶界面、網(wǎng)絡(luò)連接、本地?cái)?shù)據(jù)存儲(chǔ)及應(yīng)用生命周期管理等,統(tǒng)稱為標(biāo)準(zhǔn)Java運(yùn)行環(huán)境和Java API等。</p><p>  MIDP規(guī)范是由Java Community Program定義的,它是一個(gè)專門用于為移動(dòng)信息設(shè)備動(dòng)態(tài)地、安全地提供圖像性能要求高、需要網(wǎng)絡(luò)支持的應(yīng)用平臺(tái)。[9]</p><p>  在MIDP中定義了一種新的應(yīng)用程序

36、模型MIDlet,它是被Application Management Software(AMS)管理的。AMS 負(fù)責(zé)MIDlet 的安裝、下載、運(yùn)行和刪除等操作。在被AMS 管理的同時(shí),MIDlet 可以和應(yīng)用管理軟件通信通知應(yīng)用管理軟件自己狀態(tài)的變化,通常是通過(guò)方法notifyDestroyed()和notifyPaused()實(shí)現(xiàn)的。[10]</p><p>  2.3 移動(dòng)設(shè)備上游戲的限制</p>

37、;<p>  在開(kāi)發(fā)J2ME移動(dòng)游戲過(guò)程中,開(kāi)發(fā)人員面對(duì)的最大的困難和障礙是,本來(lái)在PC機(jī)和控制臺(tái)上習(xí)以為常的應(yīng)用在移動(dòng)設(shè)備上卻遇到各種限制,包括內(nèi)存的、屏幕尺寸的、甚至色彩的限制。 </p><p>  由于游戲中的用戶輸入、圖形圖像、動(dòng)畫(huà)、聲音和振動(dòng)的高交互性,這種限制在移動(dòng)游戲中表現(xiàn)得比移動(dòng)應(yīng)用程序更加明顯。此外,不僅要注意不同制造商之間產(chǎn)品的不同,也要了解同一個(gè)制造商的不同移動(dòng)設(shè)備模型的差別

38、。不同手機(jī)的模式在內(nèi)存、色彩、屏幕尺寸和用戶界面等各個(gè)方面都有很多不同。[11]</p><p><b>  2.3.1 內(nèi)存</b></p><p>  一般情況下,內(nèi)存被認(rèn)為是內(nèi)存區(qū)域中的堆棧,在游戲執(zhí)行的時(shí)候儲(chǔ)存信息,在游戲終止后被釋放。顯而易見(jiàn),手機(jī)上可以使用的內(nèi)存總量要比PC機(jī)上少的多,因此在開(kāi)發(fā)游戲的時(shí)候,要先查看所針對(duì)機(jī)型的內(nèi)存容量,注意自己程序內(nèi)存使用

39、情況,已防止需要的內(nèi)存空間超過(guò)可以分配的大小。</p><p>  另外的存儲(chǔ)空間包括RMS(Record Management System)。它可以用來(lái)存儲(chǔ)玩家的最高分?jǐn)?shù)或者上次保存的設(shè)置??晒┦褂玫腞MS大小也是要注意的。</p><p>  PC機(jī)上的硬盤和內(nèi)存在使用一段時(shí)間后就會(huì)出現(xiàn)碎片,在手機(jī)的存儲(chǔ)空間上也會(huì)出現(xiàn)這種情況。例如需要寫(xiě)一個(gè)大的對(duì)象到內(nèi)存中,但是卻找不到足夠的一整塊

40、連續(xù)的空間,于是系統(tǒng)就將它分成幾塊分別存儲(chǔ)在內(nèi)存的各個(gè)空閑空間中。這不但會(huì)導(dǎo)致存儲(chǔ)空間訪問(wèn)時(shí)間的增加,當(dāng)內(nèi)存中大的對(duì)象被清除后會(huì)留下很多內(nèi)存空洞,從而導(dǎo)致新的對(duì)象被存儲(chǔ)時(shí)也會(huì)遍布內(nèi)存各處。</p><p>  2.3.2 手機(jī)的界面</p><p>  最近幾年,各個(gè)手機(jī)制造商開(kāi)始放棄傳統(tǒng)的手機(jī)界面,進(jìn)而追求更為個(gè)性化的按鍵和控制,這歸結(jié)于制造商對(duì)更加友好的用戶界面的孜孜不倦的追求。雖然一

41、些制造商已經(jīng)意識(shí)到?jīng)]有絕對(duì)最好的用戶界面,只有對(duì)某些有特殊需求的特定的群體比較好的用戶界面,這主要取決于用戶除了使用手機(jī)打電話外還做什么,比如聽(tīng)音樂(lè)、玩游戲、或這記錄商業(yè)事件。當(dāng)然,新界面的設(shè)計(jì)也擴(kuò)展了手機(jī)市場(chǎng)的邊界和吸引力。這意味著又增加了開(kāi)發(fā)者需要考慮的一個(gè)因素,比如,把數(shù)字鍵“5”設(shè)定為開(kāi)火,但是也許在某些手機(jī)上這個(gè)鍵不是很方便就可以按到的。</p><p>  2.3.3 缺少庫(kù)文件支持</p>

42、;<p>  由于J2ME是J2SE的子集,所以它并沒(méi)有包含所有的包和類。也就是說(shuō)要么不使用這些類,要么自己擴(kuò)展所需要的類。例如,J2ME中不支持浮點(diǎn)數(shù)(float),故不能進(jìn)行小數(shù)運(yùn)算,也不能使用sin、cos和tan運(yùn)算,但是在游戲開(kāi)發(fā)中,小數(shù)是經(jīng)常要用到的。然而,可以用定點(diǎn)數(shù)學(xué)運(yùn)算的方式來(lái)代替小數(shù)運(yùn)算。比方說(shuō),如果想精確到小數(shù)點(diǎn)后三位,可以用1000來(lái)表示1.000。在變換的過(guò)程中要不斷的乘以或者除以10,以得到正確

43、的結(jié)果。至于角度可以用0、30、60、90、120、150、180、210、240、270、300、330、360這種對(duì)應(yīng)角度值的整數(shù)值來(lái)代替,事實(shí)上由于移動(dòng)設(shè)備的屏幕往往都很小,所以太精確的計(jì)算也是沒(méi)有意義的。</p><p>  一款基于J2ME的游戲--《天下2》的設(shè)計(jì)</p><p>  3.1 《天下2》簡(jiǎn)介</p><p>  《天下2》是一款RPG性質(zhì)

44、的手機(jī)網(wǎng)絡(luò)游戲,可以實(shí)現(xiàn)線上線下兩部分功能,線上部分完成所有的交互性事件如交易、PK、聊天、組隊(duì)、攻城。線下部分可以當(dāng)成一個(gè)單機(jī)版的RPG游戲來(lái)玩如練功、任務(wù)。離線時(shí),系統(tǒng)還有呼喚功能,即通過(guò)系統(tǒng)將離線的玩家呼喚上來(lái)完成游戲過(guò)程。</p><p>  突破WAP游戲的靜態(tài)畫(huà)面顯示和文字界面的操作復(fù)雜,和單機(jī)版的有窮性,具備無(wú)窮任務(wù)和新地圖,具備pc機(jī)上的打斗升級(jí),打造裝備,在線交易,比武,賭博,聊天等多種網(wǎng)游元素

45、。</p><p>  圖3-1:游戲的功能劃分</p><p>  圖3-1顯示了這款游戲需要實(shí)現(xiàn)的功能。整個(gè)游戲種的世界包括以下幾部分:</p><p>  地圖:游戲世界的場(chǎng)景。</p><p>  時(shí)間:游戲世界的時(shí)間,目前不設(shè)置專門的游戲時(shí)間,而采用現(xiàn)實(shí)時(shí)間。</p><p>  角色:關(guān)于游戲角色的種類,每

46、個(gè)角色的背景、屬性、屬性發(fā)展空間和規(guī)則。</p><p>  物品:包括道具、武器、裝備等。</p><p>  NPC:提供一些系統(tǒng)功能的虛擬角色,有商人、鐵匠(武器和裝備的升級(jí)功能)、任務(wù)NPC,幫派大使、傳送商人。</p><p>  社會(huì):用戶之間形成關(guān)系的功能,包括幫派、組隊(duì)等。</p><p>  戰(zhàn)斗:用戶和其他用戶、NPC發(fā)送

47、的戰(zhàn)斗活動(dòng),包括:練功、任務(wù)、攻城、PK等。</p><p>  任務(wù):用戶實(shí)現(xiàn)一系列目標(biāo)后,可以得到一個(gè)任務(wù)結(jié)果,結(jié)果包括財(cái)富值、道具等兩類。</p><p>  交易:用戶和用戶之間發(fā)生的關(guān)于物品的交流活動(dòng),包括買、賣、送。</p><p>  交流:用戶之間交流的功能,包括聊天、BBS。</p><p>  用戶:用戶進(jìn)入游戲的入口功能

48、。包括:注冊(cè)、登陸、登出。</p><p>  主菜單:系統(tǒng)級(jí)的菜單,程序啟動(dòng)的入口。</p><p>  3.2 《天下2》系統(tǒng)架構(gòu)設(shè)計(jì)</p><p>  圖3-2:《天下2》程序架構(gòu)</p><p>  《天下2》的系統(tǒng)整體結(jié)構(gòu)如圖3-2所示。從圖中可以看到,除主程序外,還包括了音樂(lè)播放模塊、網(wǎng)絡(luò)通訊模塊、界面顯示模塊。在界面顯示模塊種

49、,又包含圖像顯示和界面控件2個(gè)子模塊。</p><p>  主程序?yàn)檎麄€(gè)游戲的入口。它是一個(gè)繼承自javax.microedition.midlet.MIDlet的一個(gè)類TXMain。這也是J2ME程序的統(tǒng)一規(guī)范。按照規(guī)范程序的運(yùn)行從startApp()函數(shù)開(kāi)始。在這里要做好所有程序運(yùn)行的準(zhǔn)備工作,包括聲音播放器的初始化,本地?cái)?shù)據(jù)的讀取,網(wǎng)絡(luò)連接的初始化,全部要在這個(gè)部分完成。一旦某一部分初始化時(shí)發(fā)生錯(cuò)誤,程序?qū)?/p>

50、不能運(yùn)行。如初始化過(guò)程正常結(jié)束,將通過(guò)調(diào)用界面顯示模塊,進(jìn)入程序的開(kāi)始界面。</p><p>  界面顯示模塊實(shí)現(xiàn)了整個(gè)程序核心功能。游戲中的場(chǎng)景由一個(gè)虛的基類TXScene來(lái)定義。TXScene包含了一個(gè)TXView對(duì)象view,這個(gè)類繼承自javax.microedition.lcdui.game.GameCanvas。由它負(fù)責(zé)響應(yīng)用戶的按鍵輸入,并處理最終的畫(huà)圖操作。這個(gè)類中最重要的部分,是對(duì)游戲循環(huán)的定義

51、</p><p>  private class GameCycle extends TimerTask {</p><p>  public void run() {</p><p>  if (socket != null)</p><p>  socket.netCommand();</p><p>  // 處

52、理網(wǎng)絡(luò)數(shù)據(jù),處于連接狀態(tài)時(shí)讀取數(shù)據(jù),并通知socket繼續(xù)監(jiān)聽(tīng)</p><p>  function();// 各個(gè)scene自己的功能函數(shù)處理集合</p><p>  if (!stopped) {</p><p>  synchronized (graphics) {</p><p>  draw();// 畫(huà)背景</p&g

53、t;<p>  view.flushGraphics();</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p>

54、<p>  從上面的代碼段可以看出,每次游戲循環(huán),首先檢查網(wǎng)絡(luò)鏈接狀態(tài),如果有數(shù)據(jù)需要讀取,則先接受網(wǎng)絡(luò)的數(shù)據(jù)包。待網(wǎng)絡(luò)數(shù)據(jù)包處理完畢之后,進(jìn)入各種Scene自己的邏輯處理部分。每種場(chǎng)景在將圖像畫(huà)到屏幕上之前,很可能需要進(jìn)行一些自己的邏輯處理。在基類中,這僅僅是個(gè)抽象函數(shù),而每種場(chǎng)景都會(huì)根據(jù)自己的需要進(jìn)行不同的實(shí)現(xiàn)。在處理完邏輯之后,將進(jìn)行真正的畫(huà)圖操作。繪圖函數(shù)draw()也由各個(gè)子類各自實(shí)現(xiàn)。因?yàn)橛脩舻陌存I輸入,游戲本身的

55、邏輯處理,接受到網(wǎng)絡(luò)數(shù)據(jù)包都可能需要刷新界面,所以很多時(shí)候會(huì)發(fā)生多個(gè)線程同時(shí)調(diào)用graphics的draw函數(shù)的情況,因此為確保線程安全,將draw函數(shù)放到synchronized塊當(dāng)中。</p><p>  從這段代碼中還能看到,GameCycle類繼承自TimerTask。通過(guò)一個(gè)Time就可以按照一定的時(shí)間間隔來(lái)運(yùn)行。</p><p>  圖3-3:游戲中的場(chǎng)景</p>

56、<p>  游戲中一共出現(xiàn)3種場(chǎng)景,開(kāi)始界面和主菜單(TXStart)、正常普通場(chǎng)景(TXWorld)、玩家PK場(chǎng)景(TXPK)。這3種場(chǎng)景都繼承自TXScene。TXStart需要處理的元素包括開(kāi)場(chǎng)動(dòng)畫(huà)、主菜單,以及由用戶選擇主菜單后顯示相應(yīng)的界面,包括注冊(cè)界面,登陸界面,游戲設(shè)置等。游戲場(chǎng)景TXWorld是游戲中大多數(shù)時(shí)候使用的場(chǎng)景。在這個(gè)場(chǎng)景里,玩家進(jìn)行移動(dòng)、戰(zhàn)斗、交易、對(duì)話等各種游戲中可能出現(xiàn)活動(dòng)。最主要的游戲邏輯也

57、需要在這里實(shí)現(xiàn)。這個(gè)場(chǎng)景里要通過(guò)圖像顯示子模塊來(lái)顯示地圖上的人物、建筑物、地圖,還需要通過(guò)界面控件子模塊來(lái)顯示各種在游戲中定義的控件,包括對(duì)話框,輸入筐,消息提示筐等,從而和用戶進(jìn)行有效的交流。</p><p>  在游戲過(guò)程中,隨時(shí)都可能向服務(wù)器端發(fā)送數(shù)據(jù)包,或者從服務(wù)器接受數(shù)據(jù)包。在游戲中,由一個(gè)專門的TXSocket類來(lái)負(fù)責(zé)網(wǎng)絡(luò)聯(lián)接的操作。它在一個(gè)單獨(dú)的線程中執(zhí)行,維護(hù)一個(gè)javax.microeditio

58、n.io.SocketConnection的對(duì)象,來(lái)接受數(shù)據(jù)和發(fā)送數(shù)據(jù)。</p><p>  作為游戲,音樂(lè)也是必不可少的?!短煜?》這個(gè)部分完全采用J2ME平臺(tái)的標(biāo)準(zhǔn)接口實(shí)現(xiàn)。通過(guò)一個(gè)javax.microedition.media.Player對(duì)象來(lái)播放實(shí)現(xiàn)存儲(chǔ)好的mid文件,對(duì)音量的控制也是通過(guò)標(biāo)準(zhǔn)的平臺(tái)接口javax.microedition.media.control.VolumeControl來(lái)實(shí)現(xiàn)。

59、</p><p><b>  3.3關(guān)鍵技術(shù)研究</b></p><p>  3.3.1 動(dòng)畫(huà)渲染技術(shù)</p><p>  MIDP 2.0的一個(gè)重要更新就是提供了GAME API。它的目的就是給游戲開(kāi)發(fā)人員提供統(tǒng)一個(gè)接口,用來(lái)顯示游戲中的圖像和動(dòng)畫(huà)效果。通過(guò)Sprit和TiledLayer類可以方便的構(gòu)建出游戲的背景和位于背景上的各種元素,一

60、些常用操作如位移和碰撞檢測(cè)也都做了封裝。這很好的替代了原來(lái)手機(jī)廠商各自提供的API。</p><p>  但在游戲?qū)嶋H開(kāi)發(fā)中發(fā)現(xiàn),這組API對(duì)圖片變色的處理不夠理想,內(nèi)存消耗和處理速度都不夠理想,因此需要針對(duì)這一點(diǎn)做出適當(dāng)?shù)母倪M(jìn)。為了能夠以較小的代價(jià)實(shí)現(xiàn)圖片的變色顯示功能,需要對(duì)PNG格式文件進(jìn)行重新編碼,建立自己的調(diào)色板,再對(duì)調(diào)色板進(jìn)行操作。</p><p>  本文將在第四章深入的探討

61、《天下2》中所使用的動(dòng)畫(huà)渲染技術(shù)。</p><p>  3.3.2 網(wǎng)絡(luò)通訊</p><p>  在與服務(wù)器通訊的時(shí)候,J2ME平臺(tái)上可以選擇HTTP和Socket方式。在游戲中更多采用的是Socket方式,因?yàn)檫@樣可以自己定義多種類型的數(shù)據(jù)包,也能合理的利用帶寬。使用平臺(tái)提供的接口,建立Socket連接和發(fā)送、接收消息都比較方便,但難點(diǎn)在于數(shù)據(jù)包格式的設(shè)計(jì)。作為一款復(fù)雜的網(wǎng)絡(luò)游戲,與服務(wù)

62、器的交互非常頻繁,數(shù)據(jù)包的種類也就相當(dāng)繁雜,只有合理數(shù)據(jù)包設(shè)計(jì)才能保證數(shù)據(jù)處理的效率。</p><p>  本文將在第五章詳細(xì)的闡述《天下2》中所使用的網(wǎng)絡(luò)通訊技術(shù)。</p><p>  3.3.3 用戶與界面的交互</p><p>  CLDC并沒(méi)有任何的GUI功能,而在MIDP中定義了一套精簡(jiǎn)的圖形界面API。但是到了游戲中,為了維護(hù)界面的統(tǒng)一性,不可能使用標(biāo)準(zhǔn)

63、的界面控件來(lái)用于用戶的交互。在游戲中需要通過(guò)javax.microedition.lcdui.Canvas和Graphics類來(lái)檢測(cè)用戶輸入以及進(jìn)行界面的顯示。在此基礎(chǔ)上,針對(duì)游戲交互的特點(diǎn),通過(guò)一些圖片資源,定義出一整套的游戲界面控件,這樣才能既給用戶提供方便的操作,又能即時(shí)展示游戲的信息。</p><p>  本文將在第六章對(duì)《天下2》中的用戶界面設(shè)計(jì)以及與用戶的交互做深入的分析。</p>&l

64、t;p>  圖像和動(dòng)畫(huà)渲染的處理</p><p>  4.1 MIDP 2.0下的一般處理方式</p><p>  MIDP 2.0相對(duì)于1.0來(lái)說(shuō),最大的變化就是新添加了用于支持游戲的API,它們被放在javax.microedition.lcdui.game包中。游戲API包提供了一系列針對(duì)無(wú)線設(shè)備的游戲開(kāi)發(fā)類。由于無(wú)線設(shè)備僅有有限的計(jì)算能力,因此許多API的目的在于提高Java

65、游戲的性能,并且把原來(lái)很多需要手動(dòng)編寫(xiě)的代碼如屏幕雙緩沖、圖像剪裁等都交給API 間接調(diào)用本地代碼來(lái)實(shí)現(xiàn)。各廠家有相當(dāng)大的自由來(lái)優(yōu)化它們。[2][3]</p><p>  游戲API使用了MIDP的低級(jí)圖形類接口(Graphics,Image,等等)。整個(gè)game包僅有5個(gè)Class:</p><p>  4.1.1 GameCanvas</p><p>  這個(gè)類

66、是LCDUI的Canvas 類的子類,為游戲提供了基本的“屏幕”功能。除了從Canvas繼承下來(lái)的方法外,這個(gè)類還提供了游戲?qū)S玫墓δ?,如查詢?dāng)前游戲鍵狀態(tài)的能力,同步圖像輸出;這些功能簡(jiǎn)化了游戲開(kāi)發(fā)并提高了性能。</p><p>  GameCanvas類提供了基本的游戲用戶接口。除了從Canvas繼承下來(lái)的特性(命令,輸入事件等)以外,它還提供了專門針對(duì)游戲的功能,比如后備屏幕緩沖和鍵盤狀態(tài)查詢的能力。每個(gè)G

67、ameCanvas實(shí)例都會(huì)有一個(gè)為之創(chuàng)建的專用的緩沖區(qū)。因?yàn)槊總€(gè)GameCanvas實(shí)例都會(huì)有一個(gè)唯一的緩沖區(qū)??梢詮腉ameCanvas實(shí)例獲得其對(duì)應(yīng)的Graphics對(duì)象,而且,只有對(duì)Graphics對(duì)象操作,才會(huì)修改緩沖區(qū)的內(nèi)容。外部資源如其他的MIDlet或者系統(tǒng)級(jí)的通知都不會(huì)導(dǎo)致緩沖區(qū)內(nèi)容被修改。[8]</p><p>  4.1.2 Layer</p><p>  Layer

68、類代表游戲中的一個(gè)可視化元素,例如Sprite 或TiledLayer 是它的子類;這個(gè)抽象類搭好了層(Layer)的基本框架并提供了一些基本的屬性,如位置,大小,可視與否。出于優(yōu)化的考慮,不允許直接產(chǎn)生Layer 的子類(不能包外繼承)。</p><p>  4.1.3 LayerManager</p><p>  對(duì)于有著許多Layer的游戲而言,LayerManager通過(guò)實(shí)現(xiàn)分層次

69、的自動(dòng)渲染,從而簡(jiǎn)化了游戲開(kāi)發(fā)。它允許開(kāi)發(fā)者設(shè)置一個(gè)可視窗口(View Window),表示用戶在游戲中可見(jiàn)的窗口;LayerManager自動(dòng)渲染游戲中的Layer,從而實(shí)現(xiàn)期望的視圖效果。</p><p>  LayerManager管理一系列的Layer。LayerManager簡(jiǎn)化了渲染每個(gè)Layer的過(guò)程,每個(gè)添加的Layer都將在正確的區(qū)域并以正確的順序被渲染。</p><p>

70、;  LayerManager維護(hù)一個(gè)順序列表,以便管理如何追加、插入和刪除Layer。一個(gè)Layer的索引號(hào)關(guān)聯(lián)了它的Z軸位置(z-order);索引號(hào)為0的Layer最接近用戶,索引號(hào)越大的Layer離用戶越遠(yuǎn)。索引號(hào)永遠(yuǎn)是連續(xù)的,即,如果一個(gè)Layer被刪除,后面的Layer的索引號(hào)都將調(diào)整使得索引號(hào)保持連續(xù)。[2]</p><p>  4.1.4 Sprite</p><p>  

71、Sprite又稱“精靈”,也是一種Layer,可以顯示一幀或多幀的連續(xù)圖像。但所有的幀都是相同大小的,并且由一個(gè)Image對(duì)象提供。Sprite通過(guò)循環(huán)顯示每一幀,可以實(shí)現(xiàn)任意順序的動(dòng)畫(huà);Sprite類還提供了許多變換(翻轉(zhuǎn)和旋轉(zhuǎn))模式和碰撞檢測(cè)方法,能大大簡(jiǎn)化游戲邏輯的實(shí)現(xiàn)。</p><p>  Sprite是一個(gè)基本的可視元素,可以用存儲(chǔ)在圖像中的一幀或多幀來(lái)渲染它;輪流顯示不同的幀可以令Sprite實(shí)現(xiàn)動(dòng)畫(huà)

72、。翻轉(zhuǎn)和旋轉(zhuǎn)等幾種變換方式也能應(yīng)用于Sprite使之外觀改變。作為L(zhǎng)ayer子類,Sprite的位置可以改變,并且還能設(shè)置其可視與否。[5]</p><p>  4.1.5 TiledLayer</p><p>  TiledLayer又稱“磚塊”,這個(gè)類允許開(kāi)發(fā)者在不必使用非常大的Image對(duì)象的情況下創(chuàng)建一個(gè)大的圖像內(nèi)容。TiledLayer有許多單元格構(gòu)成,每個(gè)單元格能顯示由一個(gè)單一

73、Image對(duì)象提供的一組貼圖中的某一個(gè)貼圖。單元格也能被動(dòng)畫(huà)貼圖填充,動(dòng)畫(huà)貼圖的內(nèi)容能非常迅速地變化;這個(gè)功能對(duì)于動(dòng)畫(huà)顯示非常大的一組單元格非常有用,例如一個(gè)充滿水的動(dòng)態(tài)區(qū)域。</p><p>  TiledLayer由一系列單元格組成,單元格可被一組貼圖填充。這個(gè)類允許不必使用特別大的圖像來(lái)創(chuàng)建大的虛擬層。這個(gè)技術(shù)在2D游戲中被廣泛用于創(chuàng)建特別大的可卷動(dòng)的背景。[6]</p><p> 

74、 在游戲中,某些方法如果改變了Layer,LayerManager,Sprite 和TiledLayer 對(duì)象的狀態(tài),通常并不能立刻顯示出視覺(jué)變化。因?yàn)檫@些狀態(tài)僅僅存儲(chǔ)在對(duì)象里,只有當(dāng)隨后調(diào)用我們自己的paint()方法時(shí)才會(huì)更新顯示。這種模式非常適合游戲程序,因?yàn)樵谝粋€(gè)游戲循環(huán)中,一些對(duì)象的狀態(tài)會(huì)更新,在每個(gè)循環(huán)的最后,整個(gè)屏幕才會(huì)被重繪?;谳喸円彩乾F(xiàn)在視頻游戲的基本結(jié)構(gòu)。</p><p>  由上面的這5個(gè)

75、類就能夠?qū)崿F(xiàn)基本的圖像和動(dòng)畫(huà)的顯示功能。由Sprite類來(lái)創(chuàng)建動(dòng)畫(huà)元素,它可以顯示PNG格式文件的某一部分,作為動(dòng)畫(huà)的某一幀??梢苑奖愕膶?duì)它進(jìn)行幀的切換,屏幕上位置的變化。以此來(lái)顯示游戲中人物、怪物等可移動(dòng)的部分。用TiledLayer來(lái)創(chuàng)建游戲的背景。它能夠?qū)⑵聊环指畛傻却蟮娜舾刹糠?,每一部分都可以用PNG文件的一部分來(lái)填充。這就可以方便的畫(huà)出游戲需要的背景圖片。還可以根據(jù)某一塊部分時(shí)候填充了圖片,來(lái)和Sprite類進(jìn)行碰撞檢測(cè)。Sp

76、rite類和TiledLayer類都是Layer類的子類,而LayerManager可以管理這些Layer。它能夠添加和移除一個(gè)Layer,也可以對(duì)這些Layer進(jìn)行排序,從而在重畫(huà)的時(shí)候達(dá)到需要的疊加效果。這樣,對(duì)于一些小游戲來(lái)說(shuō),完全可以滿足要求,并且能夠提供相當(dāng)強(qiáng)的兼容性和可移植性。</p><p>  4.2 《天下2》對(duì)圖像顯示部分的改進(jìn)</p><p>  如前所述,MIDP

77、2.0中新增了專門的game包,里面包含了很多用于顯示圖像和動(dòng)畫(huà)的類。但是《天下2》的實(shí)際使用中,遇到了很多方面的問(wèn)題。最明顯的問(wèn)題是,作為專門處理動(dòng)畫(huà)的Sprite類中每一幀都必須是等寬等高的,但實(shí)際使用中,圖片每一幀的分割都是等高但并不等寬的。另一方面,Sprite類只提供了nextFrame和prevFrame這組函數(shù)來(lái)控制各個(gè)幀的切換,而事實(shí)上經(jīng)常需要直接定位到圖片中的某一幀,頻繁的調(diào)用這組函數(shù)顯然也是不合理的。此外,Sprit

78、e類是由圖片構(gòu)造出來(lái)的,而一旦新建出來(lái)一個(gè)對(duì)象,那么其中圖片將是不可變的。因此,在處理比較復(fù)雜的動(dòng)畫(huà)時(shí)候,將反復(fù)的創(chuàng)建和銷毀許多對(duì)象,這無(wú)論對(duì)于程序運(yùn)行效率還是代碼的重用性都有很大的影響。由此可見(jiàn),完全采用MIDP 2.0中的動(dòng)畫(huà)實(shí)現(xiàn)方法是無(wú)法滿足顯示復(fù)雜動(dòng)畫(huà)要求的。參考MIDP 2.0中圖像和動(dòng)畫(huà)部分的實(shí)現(xiàn)方式,設(shè)計(jì)一套適合游戲的圖像和動(dòng)畫(huà)顯示系統(tǒng)是必須的。</p><p>  4.2.1 《天下2》圖像顯示模

79、塊的結(jié)構(gòu)</p><p>  在《天下2》中,屏幕上的人物,物品等都需要由文件讀取,每個(gè)圖片文件都包含有多幀,每幀的寬度也不盡相同。因此必須將圖片資源統(tǒng)一管理起來(lái),進(jìn)行相關(guān)資源的加載與釋放操作,以及記錄每張圖片各幀的偏移量。此外還需要根據(jù)動(dòng)畫(huà)數(shù)據(jù),組合各個(gè)圖片,拼成用于屏幕顯示的動(dòng)畫(huà)幀。圖形顯示模塊的系統(tǒng)結(jié)構(gòu)圖4-1所示。這個(gè)子模塊中出現(xiàn)的類包括ResorceManger負(fù)責(zé)管理圖片資源,TX2Image是最終顯

80、示的基本單位,TX2Fixity代表地圖上不可移動(dòng)的物體,TX2Sprite代表地圖上可移動(dòng)的物體,TX2Monster和TX2Hero分別是它的不同實(shí)現(xiàn)的子類。</p><p>  圖4-1:圖像顯示子模塊結(jié)構(gòu)圖</p><p>  4.2.1.1 ResourceManager</p><p>  ResourceManager負(fù)責(zé)維護(hù)與該模塊相關(guān)的圖片文件???/p>

81、以根據(jù)不同需要對(duì)圖片進(jìn)行加載和釋放操作。例如,在城鎮(zhèn)中會(huì)顯示建筑物、玩家角色、NPC;到了野外,就需要怪物和野外地形。因此為了有效的利用有限的內(nèi)存,就必須針對(duì)不同的情況,加載資源,并在場(chǎng)景切換的時(shí)候及時(shí)的釋放資源。類里面的為一個(gè)javax.microedition.lcdui.Image對(duì)象的數(shù)組,用于向屏幕上繪制。同時(shí),還需要保存圖片每幀的下標(biāo),已備畫(huà)圖時(shí)使用。</p><p>  另一方面,對(duì)于怪物和玩家角色

82、(英雄),要將各個(gè)幀組合成動(dòng)畫(huà),需要讀取事先存儲(chǔ)好的數(shù)據(jù)。對(duì)于J2ME平臺(tái)來(lái)說(shuō),這部分?jǐn)?shù)據(jù)量較大,以某個(gè)類的靜態(tài)變量形式存儲(chǔ)會(huì)大量增加目標(biāo)代碼的大小,因此考慮已二進(jìn)制形式存儲(chǔ)到文件中,在游戲開(kāi)始時(shí),讀取到ResourceManager的一些靜態(tài)變量當(dāng)中,后來(lái)創(chuàng)建的怪物和英雄都只保留一個(gè)指向ResourceManager中某個(gè)靜態(tài)變量的引用。這樣處理,雖然總的內(nèi)存占用并未減少,但有效的精簡(jiǎn)了編譯后目標(biāo)代碼。</p><

83、p>  4.2.1.2 TX2Image</p><p>  TX2Image是游戲中圖形顯示的基本單位。游戲的部分元素由TX2Image直接顯示。例如道具欄中的各種道具,這些不需要顯示在游戲的地圖上,顯示在屏幕上后也不會(huì)再移動(dòng),直到當(dāng)前控件關(guān)閉。因此該類需要保存的信息包括繪制的位置,該幀的寬度與高度,以及在ResourceManager中對(duì)應(yīng)資源索引和幀索引。圖4-2中各種物品,均是TX2Image的對(duì)象

84、。</p><p>  圖4-2:TX2Image應(yīng)用實(shí)例</p><p>  TX2Image的最終繪制,通過(guò)調(diào)用javax.microedition.lcdui包下Graphics類的drawRegion()函數(shù)實(shí)現(xiàn)。</p><p>  經(jīng)過(guò)實(shí)際測(cè)試可知,在一般該函數(shù)的運(yùn)行效率較高,畫(huà)圖效果比較理想。但在游戲中,為了節(jié)省存儲(chǔ)空間,經(jīng)常會(huì)把向左和向右的2幀只存儲(chǔ)

85、向左的一幀,向右的那一幀通過(guò)將向左的幀翻轉(zhuǎn)后繪制出來(lái)。但經(jīng)測(cè)試發(fā)現(xiàn)drawRegion函數(shù)的翻轉(zhuǎn)性能比較差,同樣的一張圖片,在WTK 2.2的模擬器中比不翻轉(zhuǎn)的情況要慢10倍左右。因此考慮采用其他方式解決翻轉(zhuǎn)問(wèn)題。由于所要處理的翻轉(zhuǎn)只有左右對(duì)翻這一種情況,所以可以將圖片分割為一個(gè)象素寬的多個(gè)部分,每個(gè)部分按照相反的順序畫(huà)出來(lái)。這樣雖然drawRegion函數(shù)被調(diào)用了許多次,但總耗時(shí)卻顯著下降了。該過(guò)程的代碼如下:</p>

86、<p>  for (int j = 0; j < width; ++j)</p><p>  g.drawRegion(rm.images[pictype], rm.offsets[pictype][picindex] + width - j - 1, 0,1, height, 0, destx + j, desty, 20);</p><p>  因?yàn)閐rawRegio

87、n函數(shù)是通過(guò)native方法實(shí)現(xiàn)的,所以無(wú)法看到其源代碼。但根據(jù)測(cè)試結(jié)果推測(cè),drawRegion是通過(guò)將圖片該區(qū)域的RGB值取出來(lái)存到數(shù)組當(dāng)中,再根據(jù)需要的變換類型進(jìn)行,對(duì)數(shù)組進(jìn)行運(yùn)算,再將運(yùn)算后的數(shù)組繪制出來(lái)。因此,整個(gè)運(yùn)算過(guò)程耗時(shí)比較長(zhǎng)。</p><p>  4.2.1.3 TX2Fixity</p><p>  TX2Fixity類用于表示地圖上無(wú)法移動(dòng)的物體,如建筑物,NPC等。

88、它們?cè)诘貓D上的絕對(duì)坐標(biāo)是固定的。但玩家移動(dòng)時(shí),屏幕的顯示區(qū)域也會(huì)相對(duì)地圖做響應(yīng)的移動(dòng),因此,這些對(duì)象也需要隨時(shí)的根據(jù)當(dāng)前屏幕的位置,計(jì)算出自己在屏幕上的坐標(biāo),所以要提供一個(gè)移動(dòng)的函數(shù)offset(int dx, int dy),用于改變自己在屏幕上的位置。這類對(duì)象可能由一個(gè)TX2Image組成,也可能由多個(gè)部分組合而成。但是這類對(duì)象的組合都相對(duì)簡(jiǎn)單,不需要專門存儲(chǔ)各個(gè)部分組合方式的數(shù)據(jù)。圖4-3中的建筑物和NPC均是TX2Fixity的

89、對(duì)象:</p><p>  圖4-3:TX2Fixity應(yīng)用實(shí)例</p><p>  4.2.1.4 TX2Sprite</p><p>  TX2Sprite類是TX2Fixity類的一個(gè)子類,也是一個(gè)抽象類。它代表了地圖上可以移動(dòng)的物體。這里的移動(dòng)并不是簡(jiǎn)單的位移,而是要帶有一定的動(dòng)畫(huà)效果。動(dòng)畫(huà)中各個(gè)幀的組合方式在這個(gè)類里并沒(méi)有規(guī)定,要在子類實(shí)現(xiàn)。這個(gè)類中最重要

90、的是一個(gè)抽象函數(shù)setAct(),外界可以通過(guò)調(diào)用它來(lái)指定TX2Sprite需要顯示的動(dòng)畫(huà)效果。類中還需要有保存動(dòng)畫(huà)信息的數(shù)據(jù),這樣在通過(guò)setAct(int act, int dir)指定動(dòng)作的時(shí)候才能夠根據(jù)存儲(chǔ)好的數(shù)據(jù)組合動(dòng)畫(huà)。兩個(gè)參數(shù)分別指定動(dòng)作類型(移動(dòng)、攻擊、受傷)和方向(上、下、左、右)。動(dòng)畫(huà)的每一幀一般都由多個(gè)部分組成,data中存儲(chǔ)了動(dòng)畫(huà)所需的各個(gè)幀,因此在每次重畫(huà)的時(shí)候需要根據(jù)當(dāng)前幀的數(shù)據(jù),來(lái)設(shè)定images中每個(gè)元素

91、的值。</p><p>  4.2.1.5 TX2Hero和TX2Monster</p><p>  TX2Hero和TX2Monster都是TX2Sprite的子類。它們的不同之處在于動(dòng)畫(huà)的來(lái)源不同。TX2Monster類的動(dòng)作都是存儲(chǔ)好數(shù)據(jù)中的連續(xù)幀,例如第1,2,3幀代表背向移動(dòng),4,5,6幀代表正面移動(dòng)等。這樣的規(guī)則是確定好的,所以TX2Monster在外界調(diào)用setAct()的時(shí)

92、候,可以根據(jù)指定的動(dòng)作,直接找到開(kāi)始幀和結(jié)束幀(maxacition字段)。</p><p>  TX2Hero的動(dòng)作要復(fù)雜些,而且?guī)瑪?shù)很多,又沒(méi)有很強(qiáng)的規(guī)律。所以需要事先儲(chǔ)存好一個(gè)動(dòng)作表。例如,背向移動(dòng)、正向移動(dòng)、側(cè)向移動(dòng)以次為{4, 3, 5, 3}, {1, 0, 2, 0}, {7, 6, 8, 6}。這樣在指定動(dòng)作的時(shí)候,先要去動(dòng)作表中讀取所有的動(dòng)作信息,再根據(jù)這些信息進(jìn)行畫(huà)圖操作。也就是需要一個(gè)sho

93、rt的數(shù)組來(lái)存儲(chǔ)這些信息。</p><p>  這兩個(gè)類的畫(huà)出動(dòng)畫(huà)效果都需要在類中設(shè)置一個(gè)變量來(lái)標(biāo)志當(dāng)前畫(huà)到了哪一幀。這樣,再每次重畫(huà)的時(shí)候,可以改變它的值,指向下一幀,這樣就畫(huà)出了動(dòng)畫(huà)效果。</p><p>  圖4-4中的玩家角色和敵人分別是TX2Hero和TX2Monster:</p><p>  圖4-4:TX2Hero和TX2Monster應(yīng)用實(shí)例<

94、/p><p>  4.2.2 圖像變色的設(shè)計(jì)</p><p>  在J2ME平臺(tái)上一般通過(guò)javax.microedition.lcdui.Graphics類的drawRegion函數(shù)來(lái)實(shí)現(xiàn)。這個(gè)函數(shù)可以繪制一個(gè)PNG圖片的某一部分。它的效率和穩(wěn)定性也都很令人滿意,但這個(gè)操作是不支持變色處理的,如果想用這種方法實(shí)現(xiàn)讓圖片變色,除非準(zhǔn)備多張圖片,這顯然是不可接受的。</p><

95、;p>  Image類中提供了getRGB()方法,Graphics也有drawRGB()方法,這樣可以將圖片中的一部分RGB數(shù)據(jù)取出來(lái),針對(duì)顏色變換的規(guī)則改變RGB數(shù)據(jù)的值,在通過(guò)drawRGB()畫(huà)到屏幕上。這樣可以通過(guò)調(diào)用平臺(tái)提供的接口實(shí)現(xiàn),但是這樣做內(nèi)存占用會(huì)很大,每次畫(huà)圖都要進(jìn)行一次getRGB()和drawRGB(),顯然也會(huì)大大的降低畫(huà)圖的效率,增加畫(huà)圖的延遲時(shí)間。在《天下2》的設(shè)計(jì)中,采用了另外一種實(shí)現(xiàn)方法。<

96、;/p><p>  4.2.2.1對(duì)PNG文件重新編碼</p><p>  實(shí)現(xiàn)圖片變色的第一步,是對(duì)PNG文件進(jìn)行重新編碼,為后期在的渲染做好準(zhǔn)備。在Windows下通過(guò)VC提供的GDI+庫(kù),可以取出每個(gè)點(diǎn)的RGB數(shù)據(jù)。對(duì)PNG文件的每個(gè)象素點(diǎn)進(jìn)行一次掃描,對(duì)其的RGB值進(jìn)行一次統(tǒng)計(jì)。得出共使用了多少種顏色,這就可以生成一個(gè)調(diào)色板。在將RGB數(shù)據(jù)替換成調(diào)色版的索引值,最后使用LZSS算法對(duì)其

97、進(jìn)行一次壓縮,這樣就完成了編碼工作。</p><p>  LZSS算法的是一種基于字典壓縮的滑動(dòng)窗口壓縮算法,其基本原理是以前面出現(xiàn)的串作為字典,然后對(duì)后面出現(xiàn)的相同串用編碼代替,而達(dá)到壓縮的目的,如下是一段要壓縮的文本:</p><p>  ---------------------------------------------</p><p><b>

98、;  |</b></p><p>  for(i=0;i<MAX-1;i++)</p><p>  for(j=i+1;j<MAX;j++)</p><p><b>  |</b></p><p>  ---------------------------------------------<

99、;/p><p>  +--------- 滑動(dòng)窗口 -------------+-向前緩沖-+ </p><p>  LZSS把要壓縮的內(nèi)容讀到一個(gè)滑動(dòng)窗口和向前緩沖區(qū)中,然后把向前緩沖區(qū)中的內(nèi)容與滑動(dòng)窗口中的內(nèi)容進(jìn)行比較發(fā)現(xiàn)“<MAX”與窗口中的第9個(gè)字符開(kāi)始的四個(gè)字符,這樣“<MAX”就編碼為“9,3”,而LZSS用12位作索引4位作長(zhǎng)度,所以總共用16位就可表示“<M

100、AX”,但是,如果找不到匹配的詞組或只匹配一個(gè)字符時(shí)就直接用原字符,不過(guò)在壓縮碼中要有標(biāo)志來(lái)區(qū)分這種區(qū)別,所以每8個(gè)壓縮碼就用一個(gè)字符8位來(lái)表示是否壓縮。</p><p>  LZSS算法在壓縮過(guò)程中是比較復(fù)雜的,它需要用一個(gè)二叉樹(shù)來(lái)加快查找操作,但其解壓過(guò)程十分快。因?yàn)榻鈮簳r(shí)它不需要另外建立詞典,已經(jīng)解壓的文本就是詞典,而且解壓時(shí)不用查找,而是直接定位,所以LZSS的解壓速度和直接拷貝的速度幾乎相同。</

101、p><p>  圖4-5:PNG文件重新編碼后的文件結(jié)構(gòu)</p><p>  圖4-5顯示了重新編碼后的文件格式(括號(hào)中為占用的字節(jié)數(shù))。文件開(kāi)始首先是圖片寬度和長(zhǎng)度值,之后是調(diào)色板的長(zhǎng)度值,假定寬度為w,高度為h,調(diào)色板長(zhǎng)度為L(zhǎng)。調(diào)色板數(shù)據(jù)為一個(gè)int的數(shù)組,數(shù)組長(zhǎng)度為L(zhǎng)。后面為圖片象素?cái)?shù)據(jù),是一個(gè)byte的數(shù)組,保存調(diào)色板的索引值,長(zhǎng)度為h*w。這樣編碼后的文件保證了文件大小和PNG大體相

102、當(dāng)。</p><p>  4.2.2.2 渲染時(shí)的處理</p><p>  在使用的時(shí)候,首先按照這種格式將文件數(shù)據(jù)讀取出來(lái)。保存到ResourceManager當(dāng)中,另外還要定義一個(gè)類TX2PNGImage,繼承自TX2Image。不同的是,增加了一個(gè)自身的調(diào)色板,在創(chuàng)建的時(shí)候,將ResourceManager中與之相對(duì)應(yīng)的圖片的調(diào)色板拷貝過(guò)來(lái),在需要變色的時(shí)候,只要改變自身調(diào)色板中的值

103、即可。這樣可以針對(duì)需要對(duì)進(jìn)行變色處理,而不會(huì)對(duì)ResourceManager中的原始數(shù)據(jù)產(chǎn)生影響,同時(shí)也不用遍歷整個(gè)象素的數(shù)組,大大加快了變色的速度。在畫(huà)圖的時(shí)候,需要申請(qǐng)一塊int的數(shù)組,根據(jù)索引值找到自己調(diào)色板中的顏色數(shù)據(jù),填充到數(shù)組里面。通過(guò)調(diào)用Graphics的drawRGB()函數(shù),畫(huà)到屏幕上。</p><p>  游戲中需要處理的變色包括兩種:顏色的替換和色相的變換。</p><p

104、><b>  圖4-6:顏色替換</b></p><p>  顏色的替換就是要把調(diào)色板中某幾個(gè)顏色替換成另外的顏色。圖4-6中兩個(gè)框起來(lái)的人物,它們都是來(lái)自同一個(gè)圖片文件的同一幀。但是經(jīng)過(guò)了顏色的替換,衣服的顏色就由紅色變成了粉紅色。這時(shí)就需要遍歷TX2PNGImage的調(diào)色板,在找到相應(yīng)的顏色后將顏色值替換掉即可。</p><p><b>  圖4-

105、7:色相變換</b></p><p>  色相變化首先要將RGB數(shù)值轉(zhuǎn)換成HLS數(shù)值。HLS代表色相、亮度和飽和度。色相的變化也就是改變H的值,然后再轉(zhuǎn)換成回RGB值。圖4-7中兩個(gè)人盔甲,由金黃色調(diào)變成了藍(lán)色色調(diào)。根據(jù)類似這樣的顏色變化要求,要遍歷所有的調(diào)色板的值,將其替換成更改后的值。</p><p>  相對(duì)于后面象素?cái)?shù)據(jù)來(lái)說(shuō),調(diào)色板的數(shù)據(jù)量要小的多。因此相對(duì)于每次get

106、RGB( ),再操作RGB數(shù)組中的數(shù)據(jù)來(lái)說(shuō),這樣程序的執(zhí)行效率要高的多。每次重畫(huà)的時(shí)候,雖然最終也是調(diào)用drawRGB()來(lái)實(shí)現(xiàn)的畫(huà)圖功能,但每次操作的都是一個(gè)byte型的數(shù)組,相對(duì)于每次都要通過(guò)getRGB()來(lái)操作int型的數(shù)組,內(nèi)存的峰值需求要小的多。因?yàn)樵谝苿?dòng)設(shè)備上內(nèi)存是相當(dāng)緊張的資源,這樣可以有效的避免因內(nèi)存不足引起的程序崩潰。</p><p>  4.3 J2ME平臺(tái)下圖像顯示技術(shù)的探討</p&

107、gt;<p>  在游戲程序設(shè)計(jì)中,圖像顯示的效果往往是最受關(guān)注的方面。如本章的第一節(jié)所述,Sun也一直致力于制定J2ME平臺(tái)用于游戲的圖像顯示的標(biāo)準(zhǔn)。MIDP 2.0中加入的Game API有效的改變了MIDP 1.0時(shí)代各自廠商使用自己API的局面。從平臺(tái)發(fā)展的角度看,這也是必然趨勢(shì)。</p><p>  但我們也看到,目前發(fā)布的MIDP 2.0中這些API還只是制定了一些最基本的規(guī)范,很多高級(jí)

108、的動(dòng)畫(huà)效果都沒(méi)有實(shí)現(xiàn)。就像前文提到的圖片變色技術(shù),盡管按照這種方式,以比較小的代價(jià)實(shí)現(xiàn)了動(dòng)畫(huà)中的圖片變色的需求。但從程序設(shè)計(jì)流程可以看到,這個(gè)方案也有它自身的缺陷。首先,對(duì)PNG進(jìn)行重編碼,并存儲(chǔ)編碼后的信息這個(gè)步驟就沒(méi)有很強(qiáng)的通用性。如果目標(biāo)圖片較大,這樣的編碼很可能增大圖片文件的大小。其次,按照前面描述的渲染時(shí)處理方法,每次重畫(huà)都要新建一塊RGB的數(shù)組。這個(gè)過(guò)程本身就要求有比較多的空余內(nèi)存,對(duì)程序的運(yùn)行速度也有一定的影響。雖然測(cè)試發(fā)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫(kù)僅提供信息存儲(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)論