メッセージを受信するには、RealTimeMessageReceivedListenerを実装します。
@Override public void onRealTimeMessageReceived(RealTimeMessage rtm) { byte[] buf = rtm.getMessageData(); String sender = rtm.getSenderParticipantId(); if (buf[0] == 'F' || buf[0] == 'U') { // スコアを更新する int existingScore = mParticipantScore.containsKey(sender) ? mParticipantScore.get(sender) : 0; int thisScore = buf[1]; if (thisScore > existingScore) { // 送信されたメッセージの順序は保証されないため、 // 送信されてきたスコアと現在のスコアを比較する // このチェックは必要 mParticipantScore.put(sender, thisScore); } // スコアを画面に反映する updatePeerScoresDisplay(); // もし最終スコアなら専用のマップに最終スコアを保存し、ゲームを終了 if ((char) buf[0] == 'F') { mFinishedParticipants.add(rtm.getSenderParticipantId()); } } else if (buf[0] == 'S') { // 参加待ち画面を閉じてゲーム開始 dismissWaitingRoom(); startGame(true); } }
このメソッドではRealTimeMessageからバイト配列のデータを取得し、その内容に従った処理を行います。RealTimeMessageからは、送信者のIDやsendReliableRealTimeMessage(...)メソッドで送信されたかどうかなどが取得できます。ソースコード内のコメントにも記述してありますが、受信したメッセージの順序は保証されていません。
ButtonClickerはスコアが大きい方が新しいということが自明であるため、簡単に判別可能ですが、独自プロトコルを設計する場合は受信メッセージが入れ替わる可能性を考慮してください。大事なことなので2度書きました。
ゲームを終了するために退室するには、「GameClient#leaveRoom(RoomUpdateListener listener, String roomId)」メソッドを使用します。結果は「RoomUpdateListener#onLeftRoom(int statusCode, String roomId)」メソッドで通知されます。
Google Play ServicesはGoogle I/O 2013で発表され、それ以降精力的に更新が行われています。それはそれで良いことではあるのですが、開発者に混乱をもたらしてしまったのも事実です。筆者が確認している事象を紹介します。
1つは開発環境と実機の同期が行われなかったことです。Android SDKを更新して、Google Play Servicesを更新してしまうと、実機に入っているGoogle Play開発者サービスが新しいGoogle Play Servicesに対応しておらず、またGoogle Play開発者サービスが新しいGoogle Play Servicesになかなか対応されず、もはやその環境では開発できなくなってしまうという問題が発生していました。
SDK Managerは最新に更新することはできても、バージョンを選択してダウングレードできないため、更新前のAndroid SDKがない場合は、どのように対応すればよかったのか、いまだに謎です。しかし、この問題は、原稿執筆時点の2013年末にはGoogle Play Servicesのバージョンアップによって解消されています。
もう1つは、Google Play Servicesを使用するアプリは新たなmeta-dataの宣言が必要になったことです。
具体的には、以下の宣言を「AndroidManifest.xml」の<application>タグ内に記述しなければならなくなりました。
<meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />
発生したエラーログをよく読めば解決する問題ですが、多くの開発者がこの問題にハマったことでしょう。
なお、現在公開されているサンプルにはこの宣言はあらかじめ含まれています。
蛇足ですが、Google Play ServicesはFroyo(Android 2.2)をサポートしなくなりました。2013年12月の段階で、Froyoは1.6%のシェアなので、これは妥当な判断なのではないかと思います。
マルチプレーゲームの開発には、友達をゲームに招待したり招待を受けたりするためにRoomUpdateListener、RoomStatusUpdateListenerを、ゲームへの招待を検知するためにOnInvitaitonReceivedListnerを、参加者同士のメッセージ送受信のためにRealTimeMessageReceivedListenerを実装することになります。
実装するリスナーが多い上、Intentをブロードキャストして友達を選択する画面などへ画面遷移する必要があり、複雑になりがちです。今回取り上げたサンプルアプリ「ButtonClicker」は、マルチプレーゲームに必要な最低限の実装がシンプルにまとめてあり、ソースコードも800ステップ程度と大きくないため、これを実際に動作させ、ソースコードも全て追って仕組みを理解するのが近道になるでしょう。
しかし、Google Play Game Servicesのマルチプレーは良いことばかりではありません。SNSとしてGoogle+を使用する必要があるという制約があり、分散型システムでしかマルチプレーゲームを実装できないという制限があるためです。その辺りを考慮して、ゲーム開発に取り組んでみてはいかがでしょうか。
Copyright © ITmedia, Inc. All Rights Reserved.