序言
做了一段時(shí)間的j2me的手機(jī)游戲開(kāi)發(fā),學(xué)習(xí)到了很多東西,包括j2me體系結(jié)構(gòu),2d手機(jī)游戲開(kāi)發(fā)常用技術(shù)等等。現(xiàn)在把一些總結(jié)和心得寫(xiě)出來(lái),以供手機(jī)游戲開(kāi)發(fā)愛(ài)好者學(xué)習(xí)和交流。(有很多是參考別人寫(xiě)的東西)
一. 研究背景
近年來(lái)隨著移動(dòng)通信技術(shù)的突飛猛進(jìn),移動(dòng)開(kāi)發(fā)這個(gè)新鮮的字眼慢慢成為
開(kāi)發(fā)者關(guān)注的熱點(diǎn)。目前的移動(dòng)開(kāi)發(fā)技術(shù)大體分為三個(gè)陣營(yíng):首當(dāng)其沖的便是由SUN公司提出的,與具體操作系統(tǒng)無(wú)關(guān)的,已得到各種設(shè)備廣泛支持的J2ME技術(shù),還有就是主要由NOKIA公司倡導(dǎo)的,主要使用C++語(yǔ)言的基于Symbian操作系統(tǒng)的開(kāi)放應(yīng)用平臺(tái),以及微軟力推的主要使用C#配合.NETCF進(jìn)行開(kāi)發(fā)的Windows Mobile Smart Phone平臺(tái)。
由于J2ME秉承了Java技術(shù)的跨平臺(tái)、穩(wěn)定安全、開(kāi)放易擴(kuò)展等優(yōu)秀特性,
加上支持J2ME技術(shù)的終端設(shè)備的大量普及,使其很自然的成為了當(dāng)前嵌入式/移動(dòng)應(yīng)用開(kāi)發(fā)的首選平臺(tái)。
中國(guó)作為全球最大的移動(dòng)通信市場(chǎng),手機(jī)游戲產(chǎn)業(yè)一旦啟動(dòng),其能量將不亞于目前的電腦網(wǎng)絡(luò)游戲,可以預(yù)見(jiàn)手機(jī)游戲行業(yè)正蘊(yùn)藏了無(wú)數(shù)的商機(jī),未來(lái)?yè)碛袕V闊的市場(chǎng)前景。
二. J2ME的體系結(jié)構(gòu)
2.1 Java技術(shù)
Sun公司的Java目前有三個(gè)平臺(tái),即J2EE( Java2 Enterprise Edition ),J2SE( Java2 Standard Edition )和J2ME。作為平臺(tái), J2EE定位于服務(wù)器端, J2SE定位于客戶(hù)端,J2ME則定位于嵌入式系統(tǒng)。它們都要基于Java虛擬機(jī)(JVM)才能運(yùn)行。
2.2 J2ME的層次結(jié)構(gòu)
J2ME采用模塊化的結(jié)構(gòu),底層是宿主機(jī)的操作系統(tǒng),內(nèi)部則分為三層, Java Virtual Machine(虛擬機(jī)層); Configuration(配置層); Profile(簡(jiǎn)表層)。J2ME有兩類(lèi)虛擬機(jī):CVM(C虛擬機(jī))和KVM(K虛擬機(jī)), CVM功能比KVM功能更為強(qiáng)大; Configuration層:Configuration是J2ME對(duì)于嵌入式設(shè)備的規(guī)范,在這些規(guī)范中,定義了設(shè)備至少要符合的運(yùn)算能力、供電能力和內(nèi)存大小等規(guī)范,按照規(guī)范一般把嵌入式設(shè)備分為CLDC(Connected Limited Device Configuration)和CDC(Connected Device Configuration)兩大類(lèi)。Profile層:這一層對(duì)于用戶(hù)和程序開(kāi)發(fā)人員來(lái)說(shuō)是最常見(jiàn)的。Profile中定義了與特定嵌入式設(shè)備緊密相關(guān)的擴(kuò)充類(lèi)庫(kù),這些擴(kuò)充類(lèi)庫(kù)是建立在Configuration所定義的核心類(lèi)庫(kù)基礎(chǔ)上的,它是架構(gòu)在Configuration之上的規(guī)范。針對(duì)移動(dòng)電話(huà)內(nèi)存小、速度慢和I/O差的特點(diǎn), J2ME對(duì)JVM、Configuration和Profile三層做了特殊的實(shí)現(xiàn)。在JVM層,J2ME在手機(jī)上移植了KVM(Kilobyte Virtual Machine),只需要幾百KB的內(nèi)存就可以運(yùn)行;在Configuration層, J2ME規(guī)定了CLDC(Connected Limited Device Configuration),它對(duì)設(shè)備的運(yùn)算能力和內(nèi)存大小都有具體的限制。CLDC不支持浮點(diǎn)運(yùn)算;在Profile層, J2ME規(guī)定了MIDP(Mobile Information Device Profile)。MIDP定義了在手機(jī)上運(yùn)行的Java程序的規(guī)范,包括應(yīng)用程序生命周期、各種UI界面組件、支持Record存儲(chǔ)數(shù)據(jù)和HTTP連接等等,這些在CLDC的基礎(chǔ)上的附加功能是通過(guò)擴(kuò)充新的Java類(lèi)庫(kù)來(lái)實(shí)現(xiàn)的。
下面的圖是Java2的體系結(jié)構(gòu)圖:

Java2體系結(jié)構(gòu)圖
2.3 M ID let介紹
手機(jī)程序其實(shí)是完全基于MIDP開(kāi)發(fā)的。使用J2ME的CLDC/MIDP編寫(xiě)的Java程序被稱(chēng)為MIDlet。MIDlet具有良好的兼容性和可移植性。所有基于MIDP的程序的主類(lèi)都必須是基于MIDlet的。MIDlet是一個(gè)Java類(lèi),主要實(shí)現(xiàn)startApp( )、pauseApp( )、destroyApp()方法,以實(shí)現(xiàn)MIDlet程序的狀態(tài)轉(zhuǎn)換功能。MIDlet在應(yīng)用程序生命周期中有三種可能的狀態(tài),分別是:運(yùn)行、暫停和退出。MIDlet在移動(dòng)電話(huà)上運(yùn)行的完整過(guò)程,就是一個(gè)MIDlet狀態(tài)轉(zhuǎn)換過(guò)程。MIDlet程序運(yùn)行時(shí),總是從實(shí)現(xiàn)java.microedition.midlet的MIDlet接口類(lèi)的構(gòu)造方法開(kāi)始,構(gòu)造方法執(zhí)行完一次后就不再重復(fù)執(zhí)行。然后通常是運(yùn)行startApp()、pauseApp(),這兩個(gè)方法可以重復(fù)多次執(zhí)行。最后是運(yùn)行destroyApp()方法,這個(gè)方法執(zhí)行完時(shí)就意味整個(gè)MIDlet程序運(yùn)行結(jié)束。
目前MIDP的最新版本是2.0,MIDP2.0是在MIDP1.0規(guī)范的基礎(chǔ)上設(shè)計(jì)的,保證了同MIDP1.0的兼容性,即MIDP2.0的手機(jī)能運(yùn)行MIDP1.0的應(yīng)用程序。
MIDP 2.0為移動(dòng)設(shè)備提供了眾多新的特性,主要有:對(duì)多媒體支持的增強(qiáng),
支持對(duì)聲音文件的處理;支持更多的網(wǎng)絡(luò)協(xié)議,增加了對(duì)HTTPs、Socket、報(bào)文
以及串口通訊的支持;支持OTA(Over the air Provisioning)技術(shù),讓用戶(hù)可以動(dòng)態(tài)的安裝更新移動(dòng)設(shè)備的應(yīng)用程序等。MIDP 2.0相對(duì)于MIDP 1.0來(lái)說(shuō),最大的進(jìn)步就是新添加了用于支持游戲的API,它們被放在javax.microedition.lcdui.game包中。游戲開(kāi)發(fā)包提供了一系列針對(duì)無(wú)線(xiàn)設(shè)備的游戲開(kāi)發(fā)類(lèi),使得游戲程序可以更加充分的利用設(shè)備自身的圖形處理功能,并將原來(lái)很多需要手動(dòng)編寫(xiě)的代碼如屏幕雙緩沖、圖像剪裁等都交給API間接調(diào)用本地代碼來(lái)實(shí)現(xiàn),在提高處理性能的同時(shí)也大大的提高了開(kāi)發(fā)工作的效率。
下面是MIDlet的狀態(tài)轉(zhuǎn)換圖:

MIDlet狀態(tài)轉(zhuǎn)換圖
三. MIDP開(kāi)發(fā)環(huán)境配置
所需要的主要軟件:Eclipse,EclipseMe,Antenna,Jboss,J2se和J2ME Wireless Toolkit。
首先安裝J2se SDK,注意環(huán)境變量設(shè)置。
其次安裝WTK,設(shè)置環(huán)境變量。
Eclipse無(wú)需安裝,自解壓,綠色軟件。
打開(kāi)Eclipse后,安裝EclispeMe插件。
Jboss為服務(wù)器,與OTA發(fā)布程序結(jié)合使用。
四.游戲設(shè)計(jì)思想
在開(kāi)發(fā)Java游戲程序時(shí),通常要考慮使用多線(xiàn)程來(lái)實(shí)現(xiàn):負(fù)責(zé)改變圖形和刷新顯示屏幕、處理用戶(hù)的輸入,處理游戲中各種角色動(dòng)作的參數(shù)變化。
游戲的大體處理流程可以整理為:初始化游戲,接收用戶(hù)輸入,游戲邏輯處理,屏幕顯示輸出。具體流程如下圖所示:

游戲處理流程圖
用戶(hù)輸入和刷新顯示屏幕的處理過(guò)程會(huì)自動(dòng)放入事件處理線(xiàn)程中運(yùn)行,改變各種角色動(dòng)作的參數(shù)和改變圖像的位置和形態(tài)的代碼放入由用戶(hù)創(chuàng)建的新線(xiàn)程中運(yùn)行,并且它們?cè)谟脩?hù)線(xiàn)程中周期性地執(zhí)行。
五.游戲框架
游戲程序的框架實(shí)質(zhì)上就是指游戲引擎,無(wú)論游戲的大小,都要有游戲引擎起控制作用。簡(jiǎn)單的來(lái)說(shuō),游戲引擎就是用于控制所有游戲功能的主程序,從計(jì)算碰撞、物理系統(tǒng)和物體的相對(duì)位置,到接受玩家的輸入,以及按照正確的音量輸出聲音等。游戲框架打好后,就意味游戲引擎的完成,游戲引擎的完成就意味整個(gè)游戲基本成型。游戲引擎的結(jié)構(gòu)各不相同,不過(guò)基本上都是在一個(gè)游戲主循環(huán)內(nèi)實(shí)現(xiàn)。程序里面的主循環(huán)包含了程序框架的最主要的結(jié)構(gòu)體。J2ME的程序一般都包含兩個(gè)類(lèi),一個(gè)是MIDlet,一個(gè)是Canvas。一般都是把游戲的主要代碼放在Canvas這個(gè)類(lèi)里面。這個(gè)類(lèi)是基于事件驅(qū)動(dòng)的程序,有三個(gè)主要相應(yīng)函數(shù)void paint(Graphics g), void keyPressed( int keyCode), void keyReleased( int keyCode)。眾所周知, Java語(yǔ)言在語(yǔ)言的低層就支持多線(xiàn)程,在Java中可以使用兩種方式來(lái)實(shí)現(xiàn)多線(xiàn)程操作,這兩種方式依次是: (1)繼承Thread類(lèi)或?qū)崿F(xiàn)Runnable接口; (2)就是java. util包中的Timer和TimerTask類(lèi)。
下面給出一個(gè)通用的游戲框架:
游戲通用框架
其中SplashForm顯示進(jìn)入游戲前的歡迎畫(huà)面,MenuForm管理菜單操作,
InstructionForm顯示游戲的介紹及幫助信息,HscoreForm顯示高分記錄信息,
GameOverForm顯示游戲結(jié)束信息,GamePlayForm為游戲運(yùn)行的主界面,負(fù)責(zé)游戲的內(nèi)部邏輯處理,GameMIDlet作為一個(gè)狀態(tài)機(jī)來(lái)管理系統(tǒng)各個(gè)界面之間的調(diào)度切換。
六.手機(jī)游戲程序設(shè)計(jì)
6.1 MIDP高級(jí)界面開(kāi)發(fā)
高級(jí)界面開(kāi)發(fā)類(lèi)Screen類(lèi)共有4個(gè)繼承它的子類(lèi),分別是Alert,Form,List,TextBox,這四個(gè)子類(lèi)本身就是屏幕類(lèi),可以直接在屏幕上顯示。其中Alert是用來(lái)顯示提示信息的屏幕類(lèi),List是用來(lái)顯示列表的屏幕類(lèi),TextBox是用來(lái)輸入文字信息的屏幕類(lèi)。Form屏幕類(lèi)被設(shè)計(jì)成可以包含多個(gè)不同類(lèi)型的控件,使用Form類(lèi)可以管理屏幕上的Item控件,基本的Item控件有Item,image,imageItem,stringItem,TextField,dataField,ChoiceGroup。在MDIP2.0中開(kāi)發(fā)平臺(tái)中,Form類(lèi)新增加了CustomItem類(lèi)和Spacer類(lèi)。
6.2 MIDP低級(jí)界面開(kāi)發(fā)
正如高級(jí)界面屏幕類(lèi)都是繼承Screen類(lèi),低級(jí)界面屏幕都是繼承一個(gè)名為Canvas的屏幕類(lèi)。Canvas類(lèi)提供了一系列鍵盤(pán)低級(jí)事件和繪圖接口,據(jù)圖繪圖的操作則有一個(gè)名為Graphics的圖形類(lèi)來(lái)完成。 Canvas的中文意思是畫(huà)布,既表示可以在它上面繪制不同的圖案。因此Canvas本身提供了一個(gè)繪圖接口函數(shù)Paint(Graphics g),凡是繼承Canvas的類(lèi)都必須實(shí)現(xiàn)Paint函數(shù),因此可以在Paint函數(shù)中實(shí)現(xiàn)屏幕的繪畫(huà)代碼。因此繼承canvas的繼承類(lèi)的程序結(jié)構(gòu)如下所示:
Class MyCanvas extends Canvas
{
......
protected void paint(Graphics g)
{
......
}
…..
}
6.3 MIDP2.0游戲開(kāi)發(fā)包
在MIDP2.0的眾多新特性中,最重要的一個(gè)便是新增加的游戲開(kāi)發(fā)包。由于移動(dòng)信息設(shè)備通常僅有非常有限的計(jì)算能力,因此游戲開(kāi)發(fā)包中提供了許多
能夠提高Java游戲的性能的API,并且把原來(lái)很多需要手動(dòng)編寫(xiě)的代碼如屏幕
雙緩沖、圖像剪裁等都交給API間接調(diào)用本地代碼來(lái)實(shí)現(xiàn),加上各個(gè)設(shè)備廠(chǎng)家
有相當(dāng)大的自由來(lái)對(duì)其進(jìn)行優(yōu)化,所以在MIDP2.0下游戲程序的性能比MIDP1.0
版本的有了更加優(yōu)秀的表現(xiàn)。游戲開(kāi)發(fā)包的推出簡(jiǎn)化了游戲開(kāi)發(fā)的復(fù)雜,提高
了游戲的效率,并為游戲開(kāi)發(fā)者提供了更多的靈活性。目前市場(chǎng)上已經(jīng)有多款
支持MIDP2.0的手機(jī),如SonyEricssonW700、MOTO E680、Nokia 3250等等。
MIDP游戲開(kāi)發(fā)包,放在javax.microedition.lcdui.game中,其包結(jié)構(gòu)非常簡(jiǎn)潔,由GameCanvas、Layer、LayerManager、Sprite和TiledLayer五個(gè)類(lèi)組成,如下圖所示:
MIDP游戲開(kāi)發(fā)包
1.GameCanvas:該類(lèi)是javax.microedition.lcdui.Canvas類(lèi)的子類(lèi),提供了基本的游戲用戶(hù)接口。GameCanvas除了從Canvas繼承下來(lái)的方法外,還提供了專(zhuān)門(mén)針對(duì)游戲的功能,例如鍵盤(pán)狀態(tài)查詢(xún)功能、利用雙緩沖同步屏幕圖像輸出功能等,這些功能都極大的簡(jiǎn)化了游戲開(kāi)發(fā)工作并提高了程序運(yùn)行的性能。
2.Layer:該類(lèi)是一個(gè)抽象類(lèi),代表游戲中的一個(gè)可視化元素,Sprite和TiledLayer都是它的子類(lèi)。這個(gè)抽象類(lèi)搭好了層(Layer)的基本框架并提供了一些基本的屬性,如位置,大小,可視與否。出于優(yōu)化的考慮,不允許直接產(chǎn)生Layer的子類(lèi)(不能包外繼承),另外Layer的子類(lèi)必須實(shí)現(xiàn)一個(gè)paint(Graphics)方法,使得它們能夠被渲染。
3.LayerManager:該類(lèi)是用于管理游戲中的層次(Layer的子類(lèi)),LayerManager通過(guò)實(shí)現(xiàn)分層次的自動(dòng)渲染,實(shí)現(xiàn)期望的圖像視覺(jué)效果,從而簡(jiǎn)化了游戲開(kāi)發(fā)。開(kāi)發(fā)者可以通過(guò)設(shè)置一個(gè)可視窗口(ViewWindow),來(lái)控制用戶(hù)在游戲中的可視范圍。
4.Sprite:該類(lèi)是Layer的子類(lèi),中文通常翻譯為“精靈”,在游戲中通常用于顯示一幀或多幀的連續(xù)圖像,而且所有的幀都是相同大小的,并且由一個(gè)Image對(duì)象提供。Sprite可以通過(guò)控制來(lái)顯示其中的任意一幀,從而實(shí)現(xiàn)任意順序的動(dòng)畫(huà);Sprite類(lèi)還提供了許多變換(翻轉(zhuǎn)和旋轉(zhuǎn))模式和碰撞檢測(cè)方法,能大大簡(jiǎn)化游戲邏輯的實(shí)現(xiàn)。
5.TiledLayer:該類(lèi)也是Layer的子類(lèi),TiledLayer又稱(chēng)“磚塊”,這個(gè)類(lèi)允許開(kāi)發(fā)者在不必使用非常大的Image對(duì)象的情況下創(chuàng)建一個(gè)大的圖像內(nèi)容。TiledLayer有許多單元格構(gòu)成,每個(gè)單元格能顯示由一個(gè)單一Image對(duì)象提供的一組貼圖中的某一個(gè)貼圖。單元格也能被動(dòng)畫(huà)貼圖填充,動(dòng)畫(huà)貼圖的內(nèi)容能非常迅速地變化;這個(gè)功能對(duì)于動(dòng)畫(huà)顯示非常大的一組單元格非常有用,例如一個(gè)充滿(mǎn)水的動(dòng)態(tài)區(qū)域。通常游戲中的地圖場(chǎng)景都是用這樣的技術(shù)來(lái)設(shè)計(jì)實(shí)現(xiàn)的。
七.游戲開(kāi)發(fā)核心技術(shù)
7.1多線(xiàn)程技術(shù)
眾所周知, Java語(yǔ)言在語(yǔ)言的低層就支持多線(xiàn)程,在Java中可以使用兩種方式來(lái)實(shí)現(xiàn)多線(xiàn)程操作,這兩種方式依次是: (1)繼承Thread類(lèi)或?qū)崿F(xiàn)Runnable接口; (2)就是java. util包中的Timer和TimerTask類(lèi)。
7.2雙緩存技術(shù)
在游戲中,當(dāng)角色在一定的場(chǎng)景中有動(dòng)作時(shí),如行走。就要用背景擦除角色,然后在另外一個(gè)位置重畫(huà)角色,這樣在某一瞬間,可能在角色的位置看到背景。由于這發(fā)生在瞬間,所以會(huì)出現(xiàn)閃爍。用雙緩存技術(shù)可以消除動(dòng)畫(huà)閃爍。緩存區(qū)是繪圖時(shí)使用的屏外內(nèi)存區(qū)。使用雙緩存不是直接繪制屏幕,而是繪制到后緩存區(qū),然后將整個(gè)緩存區(qū)復(fù)制到屏幕上,后緩存區(qū)只是普通的圖像環(huán)境。
3.GameCanvas
2D游戲開(kāi)發(fā)的基本思想是游戲界面有多個(gè)圖形層次組成,例如游戲背景可以在一個(gè)圖形層次上,而游戲任務(wù)可以在另一個(gè)圖形層次上。每一個(gè)圖形層次都可以分別使用Layer控制。而Layer類(lèi)包含了制作游戲背景的TiledLayer和制作游戲精靈的Sprite類(lèi)。由于一個(gè)界面的圖形層次可能不僅僅局限在兩個(gè)層次上,可能背景本身就是由多個(gè)層次的圖形構(gòu)成的,所以處理多個(gè)圖形層次是有LayerManager類(lèi)負(fù)責(zé)。
4.數(shù)據(jù)存儲(chǔ)
數(shù)據(jù)存儲(chǔ)技術(shù)是游戲開(kāi)發(fā)中一項(xiàng)重要的技術(shù),在游戲程序中通常都有一些
配置信息需要保存,例如:游戲難度設(shè)置、控制設(shè)置和高分記錄等等。在J2ME
中實(shí)現(xiàn)這些都需要用到持久性存儲(chǔ)-即記錄管理系統(tǒng)(Record Management
System,RMS)。
八.關(guān)于3D手機(jī)游戲開(kāi)發(fā)
MIDP 2.0 3D游戲開(kāi)發(fā)API式有JSR-184包提供的,在進(jìn)行3D游戲開(kāi)發(fā)的時(shí)候需要引入JSR-184開(kāi)發(fā)包。JSR-184開(kāi)發(fā)包是為通用的支持Java技術(shù)的各種移動(dòng)設(shè)備提供開(kāi)發(fā)3D圖像而設(shè)計(jì)的,但是由于是為移動(dòng)設(shè)備提供的,所以被設(shè)計(jì)成輕量級(jí)別。正如2D游戲開(kāi)發(fā)需要圖片資源一樣,3D游戲的開(kāi)發(fā)也需要3D模型的資源,即使用一些3D模型或者3D動(dòng)畫(huà)編輯工具提前創(chuàng)建了3D動(dòng)畫(huà)所需要的模型數(shù)據(jù),JSR-184支持的3D數(shù)據(jù)的文件是后綴名為.m3g的文件。這種資源文件可以使用一些3D工具生成,比如3D max等。
3D動(dòng)畫(huà)的創(chuàng)建本身就是及其復(fù)雜的,需要處理建模,渲染,光線(xiàn)來(lái)源等多方面的內(nèi)容。而3D游戲的開(kāi)發(fā)需要處理大量的3D動(dòng)畫(huà),因此開(kāi)發(fā)過(guò)程也是非常復(fù)雜的。
結(jié)束語(yǔ)
關(guān)于手機(jī)游戲開(kāi)發(fā)的東西很多,不能逐一介紹,只能將一些核心的東西。建議幾本書(shū)籍:
《精通Java手機(jī)游戲與應(yīng)用程序設(shè)計(jì)》
《J2ME手機(jī)游戲開(kāi)發(fā)技術(shù)詳解》
posted on 2010-03-18 21:14
landon 閱讀(4338)
評(píng)論(5) 編輯 收藏 所屬分類(lèi):
Program