摘要:該文介紹了M3G(移動3D圖形標準,Mobile 3D Graphics)和JABWT(Java藍牙無線規范,Java APIs for Bluetooth Wireless Technology)的功能及優點,并且以多人賽車游戲為例,給出一個基于藍牙技術的3D多人手機游戲的設計與實現。
關鍵詞:M3G;JABWT;手機游戲
中圖分類號:TN929文獻標識碼:A文章編號:1009-3044(2009)33-9522-03
Design and Implementation of 3D Multi-player Mobile Game Supported by Bluetooth Wireless Technology
WANG Tian-shun, SHENG Guang-lei
(Shengda College of Economics TradeManagement, Zhengzhou University, Zhengzhou 451191, China)
Abstract: This paper introduces the functions and advantages of M3G (Mobile 3D Graphics API) and JABWT (Java APIs for Bluetooth Wireless Technology) and gives an example of multi-player car racing game for describing the design and implementation of 3D multi-player mobile games supported by Bluetooth wireless technology.
Key words: M3G; JABWT; mobile game
1 概述
隨著手機相關硬件性能的不斷提高,如處理器速度的加快、存儲容量的增加、3D圖形顯示和渲染技術在手機上的成熟,以及手機應用程序開發包和操作系統平臺功能的不斷增強,使得手機移動類游戲成了開發熱點,一個極具吸引力且快速發展的產業。該文首先介紹了M3G(JSR 184[1])和JABWT(JSR82[2])協議,之后給出了一個基于藍牙的3D多人賽車游戲的實現。
2 相關規范
2.1 M3G概述
JCP(Java Community Process,Java社區過程)于2003年11月發布了M3G(JSR184),同時SuperScape和Hibrid公司實現了M3G規范協議,并且基于該規范的3D引擎以及程序開發包也分別投入市場。這一系列的事件標志著開發基于J2ME的手機3D程序成為一個新興產業,手機上的3D應用將會是一個非常大的發展方向,比如3D游戲、3D虛擬現實技術,用戶界面,3D屏保等。
2.2 JABWT概述
JABWT(Java APIs for Bluetooth Wireless Technology,JSR82)規定了一個標準的J2ME藍牙開發平臺,保證開發出來的程序可以在任何J2ME設備上運行,而不必考慮由于硬件平臺和協議棧的不同對應用程序產生的影響[3]。基于JABWT的J2ME藍牙開發模式不僅提高了開發效率,同時由于JABWT規范通過統一的Java語言平臺和標準的藍牙開發平臺,使得J2ME藍牙設備可以根據環境動態的下載并執行第三方開發的藍牙應用代碼。
3 藍牙3D多人手機游戲的設計與實現
基于M3G和JABWT規范的藍牙3D多人手機游戲的程序流程圖如圖1所示。
游戲開始首先要輸入玩家的名稱,然后Slave端發布服務,Master根據發現的玩家信息,選擇哪幾個玩家參與游戲。
根據游戲的要求,定義了四種傳輸數據類型:
PlayerAction:對游戲中的鍵盤事件進行的窮舉,根據事件決定玩家角色如何運動;
PlayerState:定義了玩家控制的角色所需參數,用來進行坐標校正;
MasterCommand:Master端的命令,Slave根據Master端發送命令的不同進行不同的響應;
SlaveCommand:Slave端的命令,Master根據Slave端命令的不同進行不同的響應;
這些命令信息的發送需要在本地進行序列化,在遠端進行反序列化,故定義了EM3DSerialization接口,所有以上四類需要傳輸數據的類都必須繼承自這個接口。
接口定義如下:
public interface EM3DSerialization {
public byte[] serialize() throws IOException;
public void deserialize( byte[] data ) throws IOException;
}
一個Slave端發送信息的需要通過Master轉發到其它Slave端,而Master端發送的信息則不必轉發,信息的發送與接收如圖2所示。
建立連接后,手機屏幕上的當前顯示對象為BluetoothCanvas類的一個實例,它派生自Canvas類,內部生成2類線程:
重繪線程,用于屏幕重繪(每個實例僅有一個);
通訊線程,用于和遠端用戶進行信息的接收(Master端根據連接的Slave數量創建相應數目的線程,Slave端僅一個和Master端的連接);
因為生成的通訊線程是BluetoothCanvas類的內部對象,故所有信息的發送需要統一調用BluetoothCanvas類中的方法:transportCommand()和serialize()。transportCommand()方法根據事先定義的通訊規則(根據命令的來源與功能的不同,如屏幕按鍵事件,Master轉發事件,計算網絡延遲事件,坐標校正事件)封裝、發送數據。欲發送的命令信息經過序列化后返回一個字節數組。
發送來的數據在接收線程的run()方法中進行命令解析,根據事先定義的通訊規則,由keyParseCommand()、 masterParseCommand()和 slaveParseCommand()分別調用deserialize()方法對讀入的字節數組進行反序列化。
transportCommand()方法主要代碼如下所示:
//command是傳遞的按鍵、命令等信息
//_transmitMsg判斷是否需要轉發
//index可以指定轉發向哪個連接
//keyPressed值在解析按鍵信息時有用,默認為1,僅在keyPressed事件中賦值為true
//canvasEvent用來區別是按鍵還是系統產生的消息
public synchronized void transportCommand( int command , boolean _transmitMsg, int index ,
boolean keyPressed , boolean canvasEvent)
{ //計算網絡延遲用
if( MasterCommand.MASTER_RE_NETSYNCHRONIZE == command ) {……}
if( SlaveCommand.SLAVE_NETSYNCHRONIZE == command ) {……}
if( SlaveCommand.SLAVE_NETSYNCHRONIZE2 == command ) {……}
//對PlayerAction對象進行參數設定,準備傳輸
if(Role.ROLE_MASTER == role) {……}
else if (Role.ROLE_SLAVE == role) {……}
//Master端要將該消息轉發給其它Slave端
if(MasterCommand.MASTER_RETRANSMITMSG == command) {……}
//發送消息
//Master向所有的Slave廣播本地產生的事件
//Slave向Master發送本地產生的事件,故Master需要轉發該信息到其它Slave端
for( int i=0; i } serialize()方法主要代碼如下所示: public void serialize(EM3DSerialization em3dSerialization, BluetoothConnection bluetoothConnection) {OutputStream os = bluetoothConnection.getOutputStream(); em3d_data = em3dSerialization.serialize(); //數據傳輸: //1、把數據序列化后的長度傳出 //2、byte數組傳出 bluetoothConnection.writeInt(em3d_data.length); os.write(em3d_data); os.flush(); em3d_data = 1; }} deserialize()方法主要代碼如下所示: public void deserialize(EM3DSerialization em3dSerialization, BluetoothConnection bluetoothConnection) {InputStream is = bluetoothConnection.getInputStream(); int length = bluetoothConnection.readInt(); em3d_data = new byte[length]; is.read(em3d_data); em3dSerialization.deserialize(em3d_data); } 在BluetoothCanvas類的重繪方法中一個Graphics3D類的實例對該Canvas的Graphics對象進行綁定,來繪制3D世界。進行場景繪制的代碼如下所示: public void paint( Graphics g ) { iG3D = iG3D.getInstance(); iG3D.bindTarget(g, true, 0); try{ iG3D.render(scene); }catch(Exception e){} finally { iG3D.releaseTarget(); } } 3D世界和汽車均是通過3DMax建模產生,首先建立模型,模型構造完畢后,通過3DMax自帶的導出工具生成m3g格式的文件,通過JSR184的Loader類讀入,并通過Canvas渲染到屏幕表面上。聯機游戲的效果如圖3所示: 圖3 聯機效果圖 4 結束語 根據調查顯示,69%的調查者表示比起一起玩手機上的網絡游戲,他們更愿意和朋友一起玩通過藍牙聯接的局域網游戲。而3D游戲也己經成為一個不可逆轉的大趨勢,各手機制造商都把支持3D游戲作為一個新的賣點。在手機等移動設備飛速發展的今天,相信J2ME必定會在無線設備嵌入式系統開發中應有更廣闊的應用前景。 參考文獻: [1] Sun Microsystems.JSR184: Mobile 3D Graphics API for J2ME[S]. [2] Sun Microsystems.JSR82:JavaTM APIs for Bluetooth[S]. [3] Nokia.Game Over Bluetooth:Recommdations to Game Developers[S].