Androidでリアルタイムマルチプレーゲームを開発するには:Androidで動く携帯Javaアプリ作成入門(48)(3/3 ページ)
Google Play Game Servicesの機能を使ってゲームへの招待・招待の検知・参加・退出、メッセージの送受信を行う方法を紹介します。
メッセージを受信する
メッセージを受信するには、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 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+を使用する必要があるという制約があり、分散型システムでしかマルチプレーゲームを実装できないという制限があるためです。その辺りを考慮して、ゲーム開発に取り組んでみてはいかがでしょうか。
- グーグルのAPIを使うときに欠かせないGoogle OAuthの作り方と使い方
- 細か過ぎて伝わってないけど開発者が知っておきたいAndroid Mの新機能まとめ
- 腕時計から電話をかけるAndroid Wearアプリの作り方
- Android Wear用アプリの花形、時計アプリ「Watch Face」の基本的な作り方
- Android 5.0発表&スマホと連動する音声認識Android Wearアプリの作り方
- ウェアラブル端末用Android Wearアプリ開発の基礎知識
- 変わらないと生き残れないAndroid Lの新機能まとめ
- Android WearやIoTで注目のAndroidセンサー機能8選
- ウェアラブル時代に見直したいAndroidの加速度/重力センサー、ジャイロスコープ
- あなたの知らないAndroid SDKの便利tools、14選まとめ
- Android 4.4のメモリ使用状況を把握する3つのツールの使い方
- Androidでリアルタイムマルチプレーゲームを開発するには
- 低性能端末でも使えるか? Android 4.4 KitKatの新機能39選
- もはや無料BaaS。ゲーム以外でも使いたくなるGoogle Play Game Servicesのデータ管理機能
- アプリにGoogle+のソーシャルグラフを持ち込めるGoogle Play Game Servicesの基礎知識
- あなたのアプリはクラウドにデータをバックアップできますか?
- Eclipse ADTに代わるIDEとなるか? Android Studioの基礎知識
- ActionBarで、アプリのUIはこんなにスマートになる
- Android 4.x時代のアプリにないと残念なActionBarとは
- 動的クラスローディングでAndroidアプリ“裏”開発
- Android 4.xのAndroidビームをアプリに組み込むには
- AndroidアプリでNFCタグを読み書きするための基礎知識
- 新タブレット時代を見据えるAndroid 4.2の新機能9選
- Androidからイヤフォンやヘルス機器とBluetooth通信するには
- Bluetoothを使ってAndroidアプリ同士で通信するには
- Androidアプリをアプリ内購読に対応してもうける方法
- 開発者が知らないと残念過ぎるAndroid 4.1の新機能36選
- Androidのプロセス間通信を自由自在にするAIDL
- Android 4.0のサービス/プロセス間通信の基本
- Androidアプリでマルチメディアを扱うための基礎知識
- Androidのウィジェットにノーティフィケーションするには
- Android 4.0で注目の顔認識をアプリに組み込むには
- Android 4.0でアプリ開発を始めるための環境構築
- 開発者が知らないと損するAndroid 4.0の新機能44選
- Android Compatibility packageで2.x系でもマルチサイズ対応
- Androidの画面の大きさの違いを解決するFragments
- Android 3.0の新APIで簡単ドラッグ&ドロップ実装
- 開発者が知って得するAndroid 2.3の新機能18選
- アニメーションでAndroidに独創的な画面エフェクトを
- Androidアプリで“アニメーション”するための基礎知識
- XMLレイアウトでAndroidアプリに“設定画面”を追加
- 開発者が知っておきたいAndroid 2.2の新機能12連発
- もはやケータイに必須のカメラをAndroidで制御しよう
- 地図/位置情報/GPSを使うAndroidアプリを作るには
- Android NDKでJNIを使用してアプリを高速化するには
- Android 2.1の新機能「Live Wallpaper」で作る、美しく燃える“待ち受け”
- iPhoneより多彩なAndroidのセンサをアプリで操作
- SurfaceViewならAndroidで高速描画ゲームが作れる
- Android 1.6のジェスチャーとテキスト読み上げを使う
- Androidのホーム画面に常駐するアプリを作るには
- Netbookにも広まるAndroidで、かつてないWeb体験を
- アプリを国際化してAndroid Marketから世界へ発信
- 常駐アプリが作成できるAndroidの“サービス”とは
- AndroidでSQLiteのDB操作をするための基礎知識
- Androidアプリの使いやすさを左右する5つのレイアウト
- 簡単でワクワクするAndroidウィジェット10連発!
- ブラウザや地図、ストリートビューの基、Intentとは?
- Androidアプリ作成の基本“Activity”とは何か?
- Android Market配布を目指しEclipseでHelloWorld!
Copyright © ITmedia, Inc. All Rights Reserved.