cocos2d-html5 + JSBinding + cocos2d-x + GameKit よりブルーツゥースマルチプレイヤー機能を実装する方法(デモ付き)

前書き:
最近リリースしたゲーム(cocos2d-html5 + JSBinding + cocos2d-x)にブルーツゥースマルチプレイヤー機能を追加しようと思って一応既存解決法をネットで調べてみましたが何も出でこなかったので自分でなんとか解決法を見つけ出す事にした。
もし貴方にも似たような機能をさがしているならぜひ読み続けてくださいね。

1-jpg

1-jpg
1-jpg
1-jpg
1-jpg

注意したいこと:
. この記事にはGameKitよりブルーツゥースマルチプレイヤー機能の実装に関する情報はありません
. GameKitよりブルーツゥースマルチプレイヤー機能の実装するのはこちのチュートリアルをお勧めます
. 僕はObjective-Cが苦手でC++も何年手放ししていたのでデモには色んな誤ちがあるということをご了承下さい
. このデモは僕が会社帰り僅かな時間を利用して作りだしたのだからマルチプレイヤーのベーシックな機能しかありません
. この記事は主に別々のプログラミング言語(Javascript <> Objective-C <> C++)の間に関数の呼び出すデータの転送することを目をつけています

デモについて:
. JavascriptからC++の関数を呼び出す方法 (spidermonkey)
. Objective-CとC++のミックス (.mm)
. C++からJavascriptの関数を呼び出す方法 (spidermonkey)
. サーバーとしてゲームをホストする
. クライアントとしてゲームを参加する
. サーバーとクライアント間の通信 (データの送信と受信)

通信の流れ
. 「サーバーとしてゲームをホストする」や「クライアントとしてゲームを参加する」などの機能は皆Javascriptから始まるのです (MyLayer)
. ここは「クライアントとしてゲームを参加する」を例にします
. Javascript側からC++側(AppDelegate.h/mm)に定義されている「joinServer」という関数(サーバーのpeerIDとMyLayerのインスタンスを引数として)を呼び出す

例: joinServer(peerID, this);
. C++側の「joinServer」関数が呼び出され(spidermonkeyのおかげで)引き継ぎObjective-C側のGamekitブルーツゥース関する関数を呼び出す
例: [clientObject connectToServerWithPeerID:peerID];
. 接続が完成したらObjective-CからC++を通知します(delegate)
例: self.delegate->clientDidConnect();
. 通知が受けてC++側からJavascriptに定義されている「clientDidConnect」を呼び出す
. Javascript側C++からの通知が受けて対応操作をする(UI野更新とか、ゲームデータ更新とか)
. これで「クライアントとしてゲームを参加する」の流れが終了です
流れを簡単に纏めるとこういう風になります: Javascript -> C++ -> Objective-C -> C++ -> Javascript

デモコード構造
. MyApp.js — Javascript — 「サーバーとしてゲームをホストする」や「クライアントとしてゲームを参加する」など機能の原点
. GlobalJsFunc — C++ — spidermonkeyで使用するグローバル変数と関数(その関数はJavascript側から呼び出される)
. AppDelegate — C++ — Objective-CとJavascriptのブリッジ(言語間の通信を処理する)
. MatchmakingClient/MatchmakingClient — Objective-C — GameKitよりブルーツゥース機能を実装
. MatchmakingProtocol — C++ — ブルーツゥース関連イベントプロトコール(採用で採用)
. Packet — Objective-C — ブルーツゥース通信データの処理(パックとアンパック)

デモに興味ある方にはGithubへ

もし何か問題がありましたら何時でもコメントしてください〜
PS:僕の最新ゲームに興味がある方には是非チェックしてくださいね^_^