Google Play Game Services のサンプルを動かしてみる(リアルタイム-マルチプレイヤーAPI編)


[前回](http://qiita.com/items/b447f6ed913fabd83b61 "Google Play game services のサンプルを動かしてみる #Android - Qiita [キータ]") は、基本的なサンプルコードを動かしました。
通信対戦の機能に興味があったので、今回はもう一つサンプルを動かしてみることにしました。

サンプルコードがダウンロードできるページの説明を読むと__ButtonClicker2000__というサンプルがリアルタイム-マルチプレイヤーAPIを使用しているようです。
[Sample games / Google Play Game Services — Google Developers](https://developers.google.com/games/services/downloads/#samples "Google Play Game Services — Google Developers")
自分は前回ダウンロードしてあるので、そのまま進めます。

## プロジェクトのインポート

__ButtonClicker__というプロジェクトをインポートします。
`.project`ファイルがないため(だと思いますが)、Eclipseにインポートするとプロジェクト名がMainActivityになりました。これは嫌なので適当にリネームしました。
プロジェクトにはエラーが発生しているかと思います。前回インポートしておいたBaseGameUtilsをライブラリとして参照します。Package Explorerからプロジェクトを右クリックして、__Properties > Android__と選択し、下段のLibrary欄で`BaseGameUtils`を追加しましょう。`google-play-services_lib`は追加しなくてもエラーにはならないようです。
また、インポート時に選択されたAndroid SDKのバージョンがAndroid 2.x系だとstyles.xmlがエラーになります。自分はAndroid 4.2.2に変更しました。SDKバージョンも__Properties > Android__から変更できます。

## プロジェクトを眺めてみる

まずはresフォルダから見てみましょう。
layoutファイルは1つだけですが、コメントでいくつも__〜 SCREEN__と書かれているので、どうやらViewを切り替えて動作するようです。いくつか画面が用意されているみたいですね。
続いてvaluesの中を見てみます。
ids.xmlを見てみると、`app_id`という名前のタグが__ReplaceMe__と書かれています。前回と同じようにここに自分のアプリケーションIDを書かなければいけなさそうです。ということは、パッケージ名も変更する必要がありそうですね。
strings.xmlは特に書き換える必要がなさそうです。同様にstyles.xmlも変更する必要はなさそうです。

javaのソースファイルは約850行ほどのMainActivity.javaが1つだけですね。
念のため`ReplaceMe`で検索をかけてみると、829行目に1つヒットしました。
周辺のコードを読むと、ids.xmlの`app_id`が修正されていない場合(__ReplaceMe__のままだった場合)に処理を失敗させるためのコードのようです。
少し上には、パッケージ名が__com.google.example__で始まるパッケージ名でも同様の処理が入っています。パッケージ名の変更はやはり必須のようです。
その他の部分は特に見ていないのですが、MainActivity.javaも特に修正する必要はない気がします。

ということで、修正する必要があるのは、

* パッケージ名
* ids.xmlの`app_id`

の2箇所だと思います。たぶん。

## パッケージ名の変更

`AndroidManifest.xml`を開きます。19行目のパッケージ名を書き換えましょう。
MainActivity.javaでRクラスの参照が解決できなくなってエラーになるので、MainActivity.javaを開いて`Cmd+Shift+O`を押して、修正したパッケージ名のRクラスを参照するように変更します。

## Developer Consoleへの登録

[前回の記事](http://qiita.com/items/b447f6ed913fabd83b61 "Google Play game services のサンプルを動かしてみる #Android - Qiita [キータ]") を参考にして、[Developer Console](https://play.google.com/apps/publish/ "Developer Console")にゲームを登録します。
Developer Consoleを開いたら、左側のゲームコントローラのようなアイコンをクリックします。
__新しいゲームを追加__をクリックして、__ButtonClicker2000__を登録します。セットアップ用ウィンドウの__ゲームでGoogle APIをまだ使用していません__タブを選択し、ゲーム名(ButtonClicker2000)を入力して、ゲームの種類を適当に選びます。__次へ__のボタンを押して、次に進みます。
__1.ゲームの詳細__画面は特に入力しなくても次に進めるので飛ばします。__2.リンク済みアプリ__をクリックしましょう。
__アンドロイド アプリのリンク__ボタンをクリックして、空欄になっているパッケージ名の欄に、変更したパッケージ名を入力します。その下の__リアルタイム マルチプレイヤー__というON/OFFの項目はONにしておくのが良さそうな気がするのでONにします。__保存して次へ__をクリックします。
__今すぐアプリを承認__のボタンを押します。__Branding Information__というウィンドウが表示されますが、特に追加で入力しなくても__continue__ボタンが押せたので、そのまま進めます。
次の__Client ID Settings__というウィンドウでは、__Signing certificate fingerprint (SHA1):__の項目が__必須__になっているようなので、前回と同様以下のコマンドでfingerprintを取得し、コピペします。コピペしたら__Create client__のボタンを押しましょう。

```Bash:コマンド
keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore -list -v
```

今回はマルチプレイヤー(複数人)での動作確認が必要になります。
自分以外のGoogle+アカウントをテスターとして登録しましょう。__5.テスト__をクリックして、__テスターを追加__ボタンから、テスターとして登録したいgmailアドレスを登録します。
これで必要な情報は揃ったはずなので、次はソースの修正を行います。

## ソースコードの修正

ソースコードの修正と言っても__res/values/ids.xml__を修正するだけです。
Developer Consoleのアプリ名の右側に表示されているアプリケーションIDをコピーして、ids.xmlのReplaceMeとなっている箇所に上書きしましょう。

## 実行

アプリを起動してみます。
サインインしてみると、__Single Player__、__Quick game__、__Invite friends__、__See invitations__というボタンが並んでいます(サインインに失敗する場合は、Developer Consoleにテスターとしてきちんと登録できているか確認すると良いと思います)。
![2013-05-26 01.48.11.png](https://qiita-image-store.s3.amazonaws.com/0/7933/efa9dd88-aae9-8d71-9427-3abaa4017b63.png)
__Single Player__は一人で遊ぶモードですね。試してみたら__ボタン__と__数字__、徐々に減っていく__時間__が表示されました。時間内のクリック数を競うゲームのようです。
__Quick game__はマルチプレイヤーで遊びますが、対戦相手は誰でも構わないときのモードのようです。実際に2つのアカウントで__Quick game__を選んだところ、対戦が開始されました。プレイヤー名は__Player_XXXX__(XXXXの部分は数字)となって、Google+のアカウント名は表示されないようです。
__Invite friends__と__See invitations__は、Google+の友人をゲームに誘ったり、誘われたゲームを見るためのモードですね。誘われた方は__プレイ__、__拒否__から好きな方を選べます。このモードではプレイ中はGoogle+のアカウント名が表示されました。
プレイ中にボタンを押すと相手の画面でもすぐに数字が増えていきます。こういったインターネット越しの対戦はほとんど経験がないのですが、十分なリアルタイム性能があるように思います。
850行程度のコードでここまでできてしまうなんてすごいですね。サンプルのソースコードさえ読めば、ひと通り実装できてしまいそうです。

サンプルを2つ動かしてみて、Google Play game services SDKはサンプルがしっかりしている印象を受けました。
他の機能もサンプルを動かしてみるのが近道なように思いました。
前回、今回の記事が誰かの参考になれば幸いです。