連載
» 2014年01月30日 18時00分 UPDATE

Androidで動く携帯Javaアプリ作成入門(48):Androidでリアルタイムマルチプレーゲームを開発するには (1/3)

Google Play Game Servicesの機能を使ってゲームへの招待・招待の検知・参加・退出、メッセージの送受信を行う方法を紹介します。

[緒方聡,株式会社イーフロー]

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も同様の手順で登録することで、実際にスマホ上でマルチプレーの動作が確認できます。

android48movie.mp4サンプルアプリ「ButtonClicker」でマルチプレーをしている様子(画像をクリックすると、動画が再生します)

 ButtonClickerは以下からダウンロードできます。

 サンプルの構成は第46回のころとは異なり、「eclipse_compat」というディレクトリが用意され、Eclipseに取り込みやすくなっています。その辺りを読み替えて取り込んでみてください。

 また、以下のようにテスターに少なくとも2アカウントを追加することを忘れないようにしてください。

android48_1.jpg

 テスト用のサブアカウントを取得し、Google+で相互フォローしておくと、いろいろとはかどるかと思います。

友達をゲームに招待する

 ここからは、マルチプレーゲーム開発に関する解説を始めていきます。ButtonClickerはシングルプレーもマルチプレーも可能なように設計されています。

android48_2.jpg

 ButtonClickerのボタンの意味を説明しておきます。

 「Single Player」は一人で遊ぶモードです。「Quick game」は、同様にQuick gameでのプレーを望んでいる誰かと一緒に遊ぶモードです。マッチングはクラウド上で行われます。「Invite friends」はGoogle+の友達を招待して一緒に遊ぶモードです。「See invitations」は招待されているかどうかを確認し、招待されている場合は一緒に遊ぶかどうかを決められます。

android48_3.jpg

 上図は友達を招待する画面です。この画面自体は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をブロードキャストするだけで表示可能です。

android48_4.jpg

 これで、招待したプレーヤーが承諾した場合、若干の接続時間を置いてゲームが開始されます。もし応答がないプレーヤーがいた場合、右上のメニューからさっさとそろったプレーヤーだけでゲームを開始することも可能です。

       1|2|3 次のページへ

Copyright© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。