開發程序:瘋狂的炸彈
開發進度:第三期
本期要點:設計服務器端數據處理功能
開發平台:java平台
手機網游只有客戶端是玩不起來的,必須要有服務器端。開發服務器端,最核心的就是設計服務器端的數據處理功能(完整的實例程序請到http://www.shudoo.com/bzsoft下載)。
在一般的服務器端程序中,服務器端程序主要包含數據存儲、程序邏輯控制和網絡編程等部分,數據存儲和程序邏輯控制結合的比較緊密,可以統稱為數據處理。為了方便網絡數據的傳輸和整個程序的維護,程序的服務器端最好跟客戶端的開發語言一致。
PC上程序的服務器端開發,對安全性和響應時間等要求都比較苛刻,要求數據傳輸處理快、存儲安全,響應時間短。不過手機程序的網絡傳輸速度相對PC要慢不少,所以手機網游的服務器端要求相對較低不高,開發也更容易。
服務器端數據處理設計思路
當客戶端第一次連接服務器端時,服務器端分配一個唯一的用戶ID給客戶端,在客戶端獲得該用戶ID以後,每隔一定時間向服務器端查詢,看服務器端是否有匹配的用戶可以進行對戰。
如果沒有則向客戶端反饋繼續等待的指令,如果有匹配的用戶則為這兩個客戶端分配房間ID,並生成地圖數據信息,開始游戲對戰。進入游戲界面以後每隔一定時間獲得一次地圖數據,當用戶移動角色時向服務器端發送移動指令,服務器端根據客戶端的移動請求進行邏輯處理並對應的修改地圖數據(見圖)。
當客戶端連接到服務器端時,服務器端進行邏輯處理,分配一個唯一的用戶ID給客戶端。在獲得房間ID時實現的思路和用戶ID實現一樣,而對於游戲界面的地圖數據,包括各個地圖塊的數據和玩家位置、方向等信息,則使用Java中一個自定義類進行代表,每個房間的數據就是該類的一個對象。
分析數據處理技術
在《瘋狂的炸彈》游戲中,要處理的數據主要有三種:用戶ID分配邏輯、玩家分配邏輯和玩家移動控制邏輯。用戶ID分配邏輯是為玩家分配唯一的編號,比較簡單;玩家分配邏輯是將處於等待狀態的兩個客戶端分配到一個房間,並初始化游戲數據的邏輯;玩家移動控制邏輯是判斷玩家是否可以實現移動,並修正移動以後的游戲數據,比較復雜。
玩家移動控制邏輯的原理如下所示:在游戲界面中,依次存儲每個單元格中顯示的圖片序號,玩家也按照行號和列號來存儲位置,整個界面是一個11行10列的區域,所以在移動是按照單元格判斷移動即可。在移動時,先判斷當前用戶ID是對戰玩家中的用戶1還是用戶2,然後判斷以後的單元格是否超出地圖區域,如果沒有超出地圖區域則按照移動方向,修改玩家的行號和列號。
服務器端數據處理設計步驟
第一步:創建項目
啟動Eclipse,選擇“File→New→Java Project”,設置項目名稱為“BomberServer”,並一路選擇“Next”, 完成項目的建立。然後新建一個入口類,選擇“File→New→Class”,設置名稱為“Server”,點擊“Finish”。創建項目的代碼下載地址是http://www.shudoo.com/bzsoft。
第二步:創建游戲數據類
選擇“File→New→Class”,設置名稱為“GameData”,點擊“Finish”完成游戲數據類的創建。然後輸入該類的代碼,其中關鍵碼如下所示(完整代碼下載地址:http://www.shudoo.com/bzsoft):
/* 界面相關數據 */
/** 盒子層地圖數據 */
byte[][] boxMap = new byte[ROWS][COLS];
/** 樹木層地圖數據 */
byte[][] treeMap = new byte[ROWS][COLS];
/** 房子層地圖數據 */
byte[][] houseMap = new byte[ROWS][COLS];
/** 草叢層地圖數據 */
byte[][] brushwoodMap = new byte[ROWS][COLS];
/** 炸彈層地圖數據 */
byte[][] bombMap = new byte[ROWS][COLS];
第三步:數據處理
選擇“File→New→Class”,設置名稱為“LogicEngine”,點擊“Finish”完成數據處理類的創建,該類包含所有游戲數據和數據處理的代碼,關鍵碼如下所示(完整代碼下載地址:http://www.shudoo.com/bzsoft):
if(userID == userID1){ //用戶1
c = playerC1;
r = playerR1;
playerDire1 = dire; //改變人物方向
}else{ //用戶2
c = playerC2;
r = playerR2;
playerDire2 = dire; //改變人物方向
}
//邊界檢測
if(isInMap(c,r,dire)){
switch(dire){ //根據方向移動
case DIRE_UP:
r--;
break;
case DIRE_DOWN:
r++;
break;
case DIRE_LEFT:
c--;
break;
case DIRE_RIGHT:
c++;
break;
}
//移動到的單元格無內容
if(isSpace(userID,r,c)){
movePlayer(userID,dire);
}else{ //不能移動
//推箱子的情形
pushBox(userID,c,r,dire);
第四步:運行程序
在Eclipse主界面左側的“Package Explorer”中,選中項目源代碼Server.java,單擊鼠標右鍵,選擇“Run As→Java Application”即可運行程序。
讀者反饋
開發qq群:看了上期的文章有一個疑問,手機網游開發中,必須要用到監聽模式嗎?有其他替換的方式嗎?
小編:是的,必須使用監聽模式,沒有其他方式替換!這就如同網絡通信要用到HTTP協議一樣,是必須的。
開發QQ群:我想請教一下,如何在程序中添加彈出菜單的功能,彈出的菜單後如果沒有點擊則自動隱藏。
小編:設計彈出菜單可以用popmenu,不同的平台具體使用方法不同,你要根據自己的情況處理。彈出的菜單一般不需要手工行關閉,當失去焦點或焦點轉移時,菜單就會自動隱藏。
開發QQ群:我的程序老報錯,Exception in thread "main" java.lang.NoSuchMethodError: Box.<init>(DDD)V at BoxDemo7.main(BoxDemo7.java:21)
小編:在源代碼BoxDemo7.java文件的第21行中,調用的Box類的構造方法不存在。建議你閱讀一下Box類的源代碼,查找一下在BoxDemo7中要調用的構造方法是否存在。
開發QQ群: 我最近才看到《電腦報》在講手機編程,我想問問Windows Mobile的開發工具在哪裡下載?我在很多軟件下載站都沒有看到。
小編:專業的軟件很多軟件下載站都沒有,這很正常。建議你去微軟官網直接下載。SDK下載地址:http://download.microsoft.com/download/f/2/3/f232f773-7edc-4300-be07-d3b76a5b3a91/Windows Mobile 6 Professional SDK Refresh.msi。
簡體中文模擬下載地址器:http://download.microsoft.com/download/0/1/2/012bfbba-9fe5-4e68-86c9-d434446d97dd/0804/Windows%20Mobile%206%20Professional%20Images%20(CHS).msi。
讀者問題:在手機來電時立即暫停程序,這個功能是怎麼實現的?
高手 ttu:不同平台實現的方法不一樣,不過思路是相通的,我拋磚引玉說說思路吧。在J2ME技術中,實現手機來電時暫停功能的方法有兩種:
方法1:利用MIDlet類的生命周期知識。在手機來電時,系統會自動調用MIDlet子類中的pauseApp方法,只需要將暫停程序的代碼寫在該方法內部或在該方法內部進行調用即可。
方法2:利用Canvas類的知識。在手機來電時,如果當前顯示的界面是Canvas類的子類,則系統會自動調用Canvas類的hideNotify方法,只需要將暫停程序的代碼寫在該方法內部或在該方法內部進行調用即可。
對應的,如果在通話結束的時候繼續程序,則對應的將繼續的代碼寫在startApp或showNotify方法書寫代碼即可。
讀者問題:我的公司要開發藥品管理系統,要支持PDA,能給我一些建議嗎?
你是手機編程的高手嗎?你能解答上面這位讀者的疑問嗎?不要猶豫,來我們這裡展示一下你的風采吧,來信請發到[email protected](也可以給我們發送問題)。