分享一個cocos2d-x集成Photon的MMO(大型多人在線)遊戲引擎

分享一個cocos2d-x集成Photon的MMO(大型多人在線)遊戲引擎   

 
 
本人使用cocos2d-x與Photon做了一個簡單的MMO例子,需要開2個以上的客戶端才能看到多人在線的效果,該版本目前支持ios和win32平臺,實現了多人同時在線的功能,希望對大家研究手機網遊有所幫助。


首先給大家介紹一下MMO的一些概念

虛擬世界(IWorld)是一個虛擬的座標系的空間。在這個虛擬空間的實體被稱爲Item。客戶端定義了他們感興趣的area(位置和範圍),並且只能“看見”InterestArea邊界內的items。



計算哪些items進入了interestareas非常消耗CPU的資源,特別是items和interest areas頻繁移動的話。加快計算的一個簡單的方法:虛擬空間劃分爲固定區域,然後計算出哪些區域與interest area重疊。客戶端應收到這些重疊區域的items的所有事件。最簡單的算法是使用貼圖算法(被稱爲Square Tile Algorithm)。



當有item進入客戶端的interestarea裏,客戶端將接收所有由item發出(或通過)的事件。由於一個移動在interest area邊緣的item會頻繁得產生訂閱和未訂閱得變化,以此引入了一個更大的interest area額外的半徑: 訂閱過的items跨出了這個半徑將會退訂,客戶端將不再接受到這個item的事件。



Interest areas有兩個interest閾值。Items進入內半徑變得可見; items離開外半徑變得不可見。這種優化可以減少頻繁的可見變化

1. 不可見item,超出範圍
2. 不可見item在interestarea之外
3. 不可見item進入interestarea,變爲可見
4. 可見item離開interestarea的內半徑
5. 可見item離開interestarea的外半徑,變爲不可見。



然後給大家介紹下Photon網遊的引擎

         Photon是國內引進的第一款集產品、服務和技術支持於一體的網絡引擎,可快速的在多個平臺構建高性能且可擴展的多人在線網絡遊戲應用



Photon在Cocos2d-x中的配置
(1) Photon-iPhone_SDK中的Common-c, Common-cppPhoton-cPhoton-cpp文件夾拷到你工程的目錄中(SDK的下載鏈接http://photon.the9.com/download)


注意:以下操作都是在Targets中的Get Info中進行


(2) "Header Search Paths" 中添加
PhotonLib/Common-c/inc
PhotonLib/Common-cpp/inc
PhotonLib/Photon-cpp/inc
PhotonLib/Photon-c/inc



(3)
"Library Search Paths" 中添加
PhotonLib/Common-cpp/ios_lib
PhotonLib/Photon-cpp/ios_lib



(4) "Other Linker Flags"中添加
-lPhoton-cpp_$(CONFIGURATION)_$PLATFORM_NAME
-lCommon-cpp_$(CONFIGURATION)_$PLATFORM_NAME



(5) 把Configurations中的Debug和Release改成小寫的debug和release




(6) 最後在代碼中加入#include "LitePeer.h"


Photon工作流程

(1).創建一個LitePeer類的實例對象
LitePeer * m_pLitePeer = newLitePeer(this);// 該類繼承了public PhotonListener
(2).調用Connect()方法來嘗試連接服務器,並通過實現IPhotonPeerListener.PeerStatusCallback來得到連接狀態的通知,成功的狀態是StatusCode.Connect
(3).週期性的調用Service()方法來獲取事件,同時發送"命令"(比如每秒十次)
(4).調用OpJoin()來加入遊戲,通過實現OperationResult()來得到連接狀態的通知,成功的狀態是LiteOpCode.Join
(5).調用OpRaiseEvent()向服務器發送數據
(6).通過實現IPhotonPeerListener.EventAction()來獲取服務器的數據更新
(7).調用LitePeer.OpLeave()離開遊戲,若OperationResult()返回LiteOpCode.Leave則表示服務器端已經確認成功離開。
(8).調用Disconnect()以斷開連接,通過PeerStatusCallback()得到連接狀態的通知,StatusCode.Disconnect爲成功斷開連接。


現在你可以使用
Photon引擎的網絡庫了,它比系統的GameKit要強大的多,今後和大家多多交流學習!!




 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章