【目次】
概要
フォルダ構成
サーバを立てる
クライアントの準備
サンプルを実行してみる
複数人でのマッチング対戦
prefork_battle_matching サンプルは MonobitEngine による、プレイヤーマッチング(マッチングルーム)の管理から
バトルシーン導入までの一連の流れを組み込んだもので、先の echo_sample_lite よりも本格的な、
そして、より MO / MOBA のネットワークゲーム開発に適したフレームワークです。
しかしながら、ゲームルール部分については自由に書き換え可能なため、
さまざまなゲームジャンルに対応が可能です。
また、サーバ側に多くのゲーム内要素を処理させることで、
よりセキュアなネットワークゲームを提供できます。
このサンプルプロジェクトを触っていただくことで、
「MonobitEngine を使ってどんなネットワークゲームが作れるの?」
「ゲームのどの部分がフレームワーク依存で、どこからゲームデザインが可能なの?」
「サーバ側でのゲーム内要素の管理の仕方は?」
といった、おそらく開発者の皆さんが本当に知りたい疑問への答えが見えてくるはずです。

フォルダ構成▲
フォルダ構成は以下のようになります。
prefork_battle_matching_lite
├ client … prefork_battle_matching クライアントプロジェクト
├ server … prefork_battle_matching サーバプロジェクト
└ tools … RPCスタブ環境一式
■ client/cocos2d-x-3.0
cocos2d-x 3.0 向けに作られた、クライアントプロジェクトが入っています。
開発者の方にカスタマイズしていただける部分は以下のファイル群になります。
・client/cocos2d-x-3.0/prefork_battle_matching/Classes/ClientScene01.cpp
・client/cocos2d-x-3.0/prefork_battle_matching/Classes/ClientScene01.h
・client/cocos2d-x-3.0/prefork_battle_matching/Classes/ClientScene02.cpp
・client/cocos2d-x-3.0/prefork_battle_matching/Classes/ClientScene02.h
・client/cocos2d-x-3.0/prefork_battle_matching/Classes/ClientScene03.cpp
・client/cocos2d-x-3.0/prefork_battle_matching/Classes/ClientScene03.h
・client/cocos2d-x-3.0/prefork_battle_matching/Classes/ClientScene04.cpp
・client/cocos2d-x-3.0/prefork_battle_matching/Classes/ClientScene04.h
・client/cocos2d-x-3.0/prefork_battle_matching/Classes/ClientScene05.cpp
・client/cocos2d-x-3.0/prefork_battle_matching/Classes/ClientScene05.h
・client/cocos2d-x-3.0/prefork_battle_matching/Classes/sample/core/Client.cpp
・client/cocos2d-x-3.0/prefork_battle_matching/Classes/sample/core/Client.h
・client/cocos2d-x-3.0/prefork_battle_matching/Classes/sample/pu/GameRpcClientPU.cpp
・client/cocos2d-x-3.0/prefork_battle_matching/Classes/sample/pu/GameRpcClientPU.h
なお、上記ファイル以外はライブラリとして用意しているものですので、
不用意に触らないようにしてください。
■ server
Linux向けに作られた、各種サーバプロジェクトが入っています。
開発者の方にカスタマイズしていただける部分は以下のファイル群になります。
☆ Battleサーバ
・server/battle/src/RPC_BTL_Battle.cpp
・server/battle/src/RPC_BTL_Battle.hpp
・server/battle/src/RPC_BTL_RoomHub.cpp
・server/battle/src/RPC_BTL_RoomHub.hpp
☆ Matchingサーバ
・server/matching/src/sample/RPC_BTL_Matching.cpp
・server/matching/src/sample/RPC_BTL_Matching.hpp
なお、上記ファイル以外はライブラリとして用意しているものですので、
不用意に触らないようにしてください。
■ tools
RPCのコードに展開する元のRubyコードが入っています。
RPCにつきましては、後述のRPC編にて触れていきます。
サーバを立てる▲
■ サーバを立てる前に
サーバを起動する前に、サーバプログラム側のシェルスクリプトを
それぞれのサーバ環境に合わせて変更する必要があります。
先に、Linuxサーバの root 権限から ifconfig コマンドを実行し、
イーサネットのIPアドレスを調べておいてください。
# ifconfig
その後、各種サーバの実行シェルスクリプトを開き、以下の太字の部分を
該当するサーバのIPアドレスに合わせて書き換えてください。
◎ battle サーバ(server/battle/battle.sh)
./battle -l 7101 -L 127.0.0.1 -f 7000 -F 127.0.0.1 -c 6501 -C 192.168.189.128 -n 0x4000000 -N 0x4ffffff -p 1 -d 0x10100001
◎ battle2 サーバ(server/battle2/battle2.sh)
./battle2 -l 7102 -L 127.0.0.1 -f 7000 -F 127.0.0.1 -c 6502 -C 192.168.189.128 -n 0x5000000 -N 0x5ffffff -p 1 -d 0x10200001
◎ matching サーバ(server/matching/matching.sh)
./matching -l 9101 -L 127.0.0.1 -f 7000 -F 127.0.0.1 -c 8501 -C 192.168.189.128 -n 0x24000000 -N 0x24000000 -b 0x1400000000001
◎ matching2 サーバ(server/matching2/matching2.sh)
./matching2 -l 9102 -L 127.0.0.1 -f 7000 -F 127.0.0.1 -c 8502 -C 192.168.189.128 -n 0x25000000 -N 0x25000000 -b 0x1500000000001
■ server のビルド
server のビルドに移ります。
任意のディレクトリに配置後、以下のコマンドを実行して
ビルド用シェルの実行権限を割り当ててください。
$ bash ./setup.sh
続けて、Linux上の適切なディレクトリ上に配置し、server のディレクトリから
以下のコマンドを実行してください。
$ ./server.sh debug
■ server の起動
最後に以下のコマンドを実行して、server を起動させましょう
$ ./server.sh start
すると以下の表示がなされ、server が起動します。
Starting Server:
sync start
matching start
matching2 start
battle start
battle2 start
battle_pulist start
battle_pulist2 start
クライアントの準備▲
■ cocos2d-x ライブラリのデプロイ
現在提供している prefork_battle_matching プロジェクトは、ライブラリ(libcocos2dx)を除外しています。
そのため、まずは cocos2d-x ライブラリをプロジェクト内の所定位置にデプロイします。
エクスプローラで /client/cocos2d-x-3.0/prefork_battle_matching を開き、
その中に cocos2d-x-3.0 の SDK として提供されているライブラリ群を cocos2d フォルダに入れてください。

/client/cocos2d-x-3.0/prefork_battle_matching/cocos2d/ フォルダの中身が以下のようになれば問題ありません。

■ サーバ接続先IPアドレスの変更
先にサーバ側で ifconfig コマンドを使って調べた IPアドレスについて、今度はクライアント側からの接続先として
IPアドレスを設定します。
パッケージエクスプローラ上の prefork_battle_matching > Classes > ClientScene01.cpp
を開き、13行目にて定義している
ClientScene01::m_TargetAddr の初期値を、ifconfig で調べたサーバ側のIPアドレスに書き換えてください。

<Android版>
■ eclipse にプロジェクトを登録
デプロイが完了したら、eclipse にプロジェクトを登録します。
eclipse のメニューから ファイル > 新規 > プロジェクト を選択し、以下の画面で、Android > 既存コードからの
Android プロジェクトを
選択し、[ 次へ ] ボタンをクリックします。

先ほどデプロイした client/cocos2d-x-3.0/prefork_battle_matching/cocos2d/ 内にある
cocos/2d/platform/android/java (libcocos2dx) を
インポートするように選択し、[ 完了 ] ボタンをクリックしてください。

同様の手順で、client/cocos2d-x3.0/prefork_battle_matching/proj.android/ (prefork_battle_matching)をインポートするように選択し、
[ 完了 ] ボタンをクリックしてください。

パッケージエクスプローラ上の表示が以下のようになっていれば問題ありません。

■ クライアントのビルド
クライアントをビルドするには、build_native.py を実行する必要があります。
/client/cocos2d-x-3.0/prefork_battle_matching/proj.android 内に含まれている build_native.py
を
コマンドプロンプトから実行してビルドしてください。

実行後、以下のような表示がなされればビルド完了です。

<iOS版>
■ MLNClient.framework.zip を解凍
/client/cocos2d-x-3.0/prefork_battle_matching/lib/ios/MLNClient.framework.zip を解凍することで、
MLNClient.framework フォルダが作成されます。
■ クライアントのビルド
XCode で /client/cocos2d-x-3.0/prefork_battle_matching/proj.ios_mac/prefork_battle_matching.xcodeproj を開き、
Product -> Build を実行し、「Build Succeeded」となれば、ビルド完了です。

サンプルを実行してみる▲
<Android版>
■ eclipse 上で実行してみる
eclipse の実行再生ボタンを押下し、(Androidアプリケーションを選択して)起動します。
※ エミュレータを起動すると縦向きがデフォルトになりますので、CtrlキーとF11キーを同時押しして
縦向きから横向きに切り替えてください。
起動後、以下の画面が表示されますので、「マッチングサーバ接続」のボタンを押します。

マッチングルール&マッチング値はそのままに「マッチングスタート」のボタンを押下します。

しばらくするとログが流れます。
Matching Start
Entry MatchingRoom Success roomId = ....
Appintment Battle Success
Exit MatchingRoom Success
Matching End
m_CharaId=0x.....
xxx.xxx.xxx.xxx:xxxx 0x............
Battle Waiting
ログが流れたところで、「強制バトルスタート」のボタンを押下します

その後再びログに追加されます。
Battle Start
流れたログと同時に、バトル開始となります。今回はサンプルということで
チャット形式になっています。
チャット入力欄に発言内容を入力し、「発言する」のボタンを押下します

ボタンを押下すると、以下のようなログが流れ、チャットが出来る状態になります。
Chat=CharaId=0x........ ClientId=0x........ : <発言内容>

なお一定時間経過すると BattleEnd となり、起動する前に戻ります。
<iOS版>
■ XCode 上で実行してみる
XCode の実行再生ボタンを押下し、iOSシミュレーターを起動します。
複数人でのマッチング対戦▲
サンプルのマッチング人数は「1人のみ」に設定されていますので、複数人でのマッチングを可能にしましょう。
■ マッチングルームの収容人数を変更するには?
マッチングルームの収容人数を変更するには、server/matching/src/sample/RPC_BTL_Matching.hpp
の 28行目に定義している
m_RoomCharaMax の値を変更します。
下記のように初期値は「1」ですので、この値を増やすことでマッチングルームの収容人数を増やすことが出来ます。
protected:
uint64 m_AutoRoomId; // 自動ルームID
static const uint64 m_RoomCharaMax = 1; // TODO マッチング規定人数
■ バトルルームの収容人数を変更するには?
一方、バトルルームの収容人数を変更するには、server/battle/src/RPC_BTL_Battle.cpp の 14行目に定義している
RPC_BTL_Battle::MAX_ENTER_NUM の値を変更します。
下記のように初期値は「2」ですので、この値を増やすことでバトルルームの収容人数を増やすことが出来ます。
const uint8 RPC_BTL_Battle::MIN_ENTER_NUM = 1; ///< ルーム入室可能な最小人数
const uint8 RPC_BTL_Battle::MAX_ENTER_NUM = 2; ///< ルーム入室可能な最大人数
■ サーバを再度 make しなおして実行する
変更を加えたら、サーバを再度 make しなおして実行しましょう。
まずはサーバを停止するコマンドを実行します。
$ ./server.sh stop
すると以下の表示がなされ、サーバが停止します。
Stopping Server:
battle_pulist stop
battle_pulist2 stop
battle stop
battle2 stop
matching stop
matching2 stop
sync stop
サーバが停止したら、以下のコマンドを入力し、再度makeを掛けます。
$ ./server.sh debug
make が終わったところでサーバを再起動しましょう。
$ ./server.sh start
■ 注意:複数人のマッチング対戦の場合、複数分のクライアントを起動させること。
m_RoomCharaMax に「マッチングルーム内に入ることが出来る最大人数」を指定していますが、この数値を「2」以上にしている場合、
少なくとも指定している台数分だけのクライアントを起動しない限り、この画面から先に進むことはありません。
これは prefork_battle_matching サンプルの仕様です。
サンプルが提供している機能は「マッチング→バトルの遷移」であり、マッチング中の演出に関しては
こちらで用意せず、開発者様に組み込んでいただくことになります。
本サンプルではマッチング中の演出については省略しています。
そのため、複数人でのマッチング対戦のデモを見たい場合には、相応の台数分だけのクライアントアプリを起動させてください。