天天看點

cocos2d-html5+JSBinding+cocos2d-x+GameKit實作藍牙對戰

為什麼做這個:

我想給自己最近釋出的遊戲加入藍牙對戰功能,我的遊戲使用了cocos2d-html5、JSBinding、cocos2d-x。我在網上搜了下,沒找到相關的文章。如果你想實作類似的功能,我希望這個demo能對你有所啟發。

cocos2d-html5+JSBinding+cocos2d-x+GameKit實作藍牙對戰
注意事項:

  • 這篇文章不會讨論如何使用GameKit的藍牙功能
  • GameKit部分的代碼基本上基于raywenderlich網站上這個精彩的 系列教程
  • 我不擅長Objective-C,而且好幾年沒用過C++了,是以代碼中難免有一些不妥的文法,記憶體管理方面也許也有問題
  • 我是在業餘時間研究這些和編寫代碼的,是以功能方面并不完善(例如異常處理方面)
  • 這個例子主要示範了如何在不同語言之間通訊(Javascript、Objective-C、C++),以及使用GameKit實作藍牙對戰功能

Demo包括:

- Javascript如何調用C++函數 (spidermonkey)

- 如何混用C++和Objective-C (.mm)

- C++調用Javascript函數 (spidermonkey)

- 建立遊戲 (作為伺服器)

- 加入遊戲 (作為用戶端)

- 在伺服器和多個用戶端之間通訊 (發送接收資料包)

主要流程:

  • 所有的操作如“建立遊戲伺服器”, “查找伺服器”, “用戶端加入遊戲”等功能都是從Javascript發起的 (MyLayer)
  • 以“用戶端加入遊戲”為例
  • Javascript代碼中調用C++ (AppDelegate.h/mm)定義的“joinServer”函數,并将伺服器的peerID和MyLayer類的執行個體作為參數傳過去,例如

    joinServer(peerID, this);

  • C++的“joinServer”被觸發後(感謝spidermonkey)調用Gamekit中的Objective-C藍牙代碼,例如

    [clientObject connectToServerWithPeerID:peerID];

  • Action完結之後,Objective-C通知C++端,例如

    self.delegate->clientDidConnect();

  • 收到Objective-C的通知後C++調用Javascript定義的“clientDidConnect”
  • C++觸發函數之後,JavaScript可以進行下一步動作
  • 單個操作的流程至此結束

簡單總結一下整個調用過程就是:

Javascript -> C++ -> Objective-C -> C++ -> Javascript

代碼結構:

  • MyApp.js — Javascript — 所有操作的起點
  • GlobalJsFunc — C++ — spidermonkey使用的全局函數和變量(函數會被JavaScript調用)
  • AppDelegate — C++ — Objective-C和Javascript之間的橋梁,Javascript觸發後,調用相應的函數,并傳回結果給Javascript
  • MatchmakingClient/MatchmakingClient — Objective-C — 處理GameKit部分的藍牙功能
  • MatchmakingProtocol — C++ — 連接配接事件的協定,AppDelegate實作了這一協定
  • Packet — Objective-C — 裝置間接受和發送資料的打包和解包

繼續閱讀