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

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

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

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