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

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

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

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