為什麼做這個:
我想給自己最近釋出的遊戲加入藍牙對戰功能,我的遊戲使用了cocos2d-html5、JSBinding、cocos2d-x。我在網上搜了下,沒找到相關的文章。如果你想實作類似的功能,我希望這個demo能對你有所啟發。
注意事項:- 這篇文章不會讨論如何使用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 — 裝置間接受和發送資料的打包和解包