Google Play Game Servicesの機能を使ってゲームへの招待・招待の検知・参加・退出、メッセージの送受信を行う方法を紹介します。
今回も、連載第45回「アプリにGoogle+のソーシャルグラフを持ち込めるGoogle Play Game Servicesの基礎知識」、第46回「もはや無料BaaS。ゲーム以外でも使いたくなるGoogle Play Game Servicesのデータ管理機能」で既に幾つかの機能について解説した、Google Play Game Servicesの機能について解説します。
今回はGoogle Play Game Servicesの「マルチプレー」について解説します。なお、今回は「リアルタイムマルチプレー」についてのみの解説ですが、先日リリースされたGoogle Play Service 4.1で「ターンベースマルチプレー」もサポートされました。
第46回までは「TrivialQuest」というサンプルアプリをベースにGoogle Play Game Servicesの機能解説を行っていましたが、今回は「ButtonClicker」というサンプルアプリでマルチプレーについて解説します。第45回でGoogle Playにゲームを登録する手順を説明しており、今回のButtonClickerも同様の手順で登録することで、実際にスマホ上でマルチプレーの動作が確認できます。
ButtonClickerは以下からダウンロードできます。
サンプルの構成は第46回のころとは異なり、「eclipse_compat」というディレクトリが用意され、Eclipseに取り込みやすくなっています。その辺りを読み替えて取り込んでみてください。
また、以下のようにテスターに少なくとも2アカウントを追加することを忘れないようにしてください。
テスト用のサブアカウントを取得し、Google+で相互フォローしておくと、いろいろとはかどるかと思います。
ここからは、マルチプレーゲーム開発に関する解説を始めていきます。ButtonClickerはシングルプレーもマルチプレーも可能なように設計されています。
ButtonClickerのボタンの意味を説明しておきます。
「Single Player」は一人で遊ぶモードです。「Quick game」は、同様にQuick gameでのプレーを望んでいる誰かと一緒に遊ぶモードです。マッチングはクラウド上で行われます。「Invite friends」はGoogle+の友達を招待して一緒に遊ぶモードです。「See invitations」は招待されているかどうかを確認し、招待されている場合は一緒に遊ぶかどうかを決められます。
上図は友達を招待する画面です。この画面自体はGameClientを通して生成するIntentをブロードキャストすることで表示されるものであり、ソーシャルグラフを解析したり、プロフィール写真を取得したりなどの複雑な実装をする必要はありません。
では、この何とも便利な、友達をゲームに招待する機能の使い方を解説します。
まずは、以下の手順でGameClientを取得し、Intentを生成した後、Activityを起動します。
intent = getGamesClient().getSelectPlayersIntent(1, 3); startActivityForResult(intent, RC_SELECT_PLAYERS);
これだけで、Google+でフォローしているユーザーの選択画面を表示できます。「GameClient#getSelectPlayerIntent(int minPlayers, int maxPlayers)」メソッドの引数で、選択するプレーヤーの最大最小人数を指定します。サンプルでは、1と3を与えているので、自分を含め2〜4人でプレーするという意味になります。
画面から戻った際に、「onActivityResult(int, int, Intent)」メソッドが呼び出されるので、「startActivityForResult(Intent, int)」メソッドの第2引数で渡した値で処理を振り分けます。以下の「handleSelectPlayersResult(int, Intent)」メソッドが選択したプレーヤーの処理を行う実装です。
private void handleSelectPlayersResult(int response, Intent data) { // キャンセルの場合は何もしない if (response != Activity.RESULT_OK) { return; } // 選択したプレーヤーリストを取得 final ArrayList<String> invitees = data.getStringArrayListExtra(GamesClient.EXTRA_PLAYERS); // 自動選択のプレーヤーを選択した場合の処理 Bundle autoMatchCriteria = null; int minAutoMatchPlayers = data.getIntExtra(GamesClient.EXTRA_MIN_AUTOMATCH_PLAYERS, 0); int maxAutoMatchPlayers = data.getIntExtra(GamesClient.EXTRA_MAX_AUTOMATCH_PLAYERS, 0); if (minAutoMatchPlayers > 0 || maxAutoMatchPlayers > 0) { autoMatchCriteria = RoomConfig.createAutoMatchCriteria( minAutoMatchPlayers, maxAutoMatchPlayers, 0); } // 部屋を作成 RoomConfig.Builder rtmConfigBuilder = RoomConfig.builder(this); rtmConfigBuilder.addPlayersToInvite(invitees); rtmConfigBuilder.setMessageReceivedListener(this); rtmConfigBuilder.setRoomStatusUpdateListener(this); if (autoMatchCriteria != null) { rtmConfigBuilder.setAutoMatchCriteria(autoMatchCriteria); } getGamesClient().createRoom(rtmConfigBuilder.build()); }
Google Play Game Servicesのマルチプレーは、「ゲームのセッションごとにホストプレーヤーが部屋を生成しゲストプレーヤーを招く」という考え方です。このメソッドでは、「GameClient#createRoom(RoomConfig)」メソッドを呼び出すまでを行っています。部屋の生成の成否は「RoomUpdateListener#onRoomCreated(int, Room)」メソッドで判別します。
@Override public void onRoomCreated(int statusCode, Room room) { // 失敗したら何もしない if (statusCode != GamesClient.STATUS_OK) { return; } // プレーヤー参加待ち画面を表示 showWaitingRoom(room); } void showWaitingRoom(Room room) { // 最低二人揃わなければゲームを開始しないようにする final int MIN_PLAYERS = 2; Intent i = getGamesClient().getRealTimeWaitingRoomIntent(room, MIN_PLAYERS); // プレーヤー参加待ち画面を表示 startActivityForResult(i, RC_WAITING_ROOM); }
プレーヤー参加待ち画面もプレーヤー選択画面と同様、GameClientを通して生成するIntentをブロードキャストするだけで表示可能です。
これで、招待したプレーヤーが承諾した場合、若干の接続時間を置いてゲームが開始されます。もし応答がないプレーヤーがいた場合、右上のメニューからさっさとそろったプレーヤーだけでゲームを開始することも可能です。
Copyright © ITmedia, Inc. All Rights Reserved.