もはや無料BaaS。ゲーム以外でも使いたくなるGoogle Play Game Servicesのデータ管理機能Androidで動く携帯Javaアプリ作成入門(46)(3/3 ページ)

» 2013年10月11日 18時00分 公開
[緒方聡,イーフロー]
前のページへ 1|2|3       

実績(Achievement)の取得

 このサンプルでは、「Click me!」というボタンをクリックすると、Google Playに登録した「Newbie」という実績を達成するようにコーディングされています。ここではゲーム内で過去に取得した実績をクラウドから取得する方法を解説します。

コラム:“実績”(Achievement)の概要

 日本語では「実績」という名前で呼ばれている、Google Play Game ServicesのAPI上では「Achievement」について、他のシステムでは「トロフィー」「勲章」と呼ばれるものだと前回説明しました。ここではAPIやその他説明から読み取れる実績の考え方について説明します。

 実績は、ユーザーがゲームに飽きてしまわないようにするための重要な要素であり、少なくとも5つの実績が登録されていなければゲームを公開できないようになっています。

 実績はGoogle Play上で名前や画像を管理できるようになっていますが、それをAPIを通して取得できます。その他にも実績を取得した日時やプレイヤーの情報も取得できます。

 実績には、2つのタイプが存在します。「特定の条件で取得可能なもの」「値を積み上げて取得するもの」です。値を積み上げるタイプの実績はユニークだと感じました。

 また、実績には3つの状態が存在します。「まだ取得していないもの」「取得済みのもの」「特定の条件を満たすまで隠されているもの」です。

 1度取得した実績が取り消されることはなく、そうした操作を行うAPIは提供されていません。実績の管理はやり直しが利かないとも言い換えられます。


Achievement関連のリスナー実装

 実績をクラウドから取得するにはOnAchievementsLoadedListenerを実装します。

@Override
public void onAchievementsLoaded(int statusCode, AchievementBuffer buffer) {
    if (statusCode == GamesClient.STATUS_OK) {
        int achievementsCount = buffer.getCount();
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < achievementsCount; i++) {
            Achievement achievement = buffer.get(i);
            sb.append("Name: " + achievement.getName() + "\n");
            sb.append("Player: " + achievement.getPlayer().getDisplayName() + "\n");
            sb.append("Date: " + new Date(achievement.getLastUpdatedTimestamp()));
            Log.d(TAG, achievement.toString());
        }
        displayMessage(new String(sb));
    } else {
        // handle error
        displayMessage("Achievement load error: " + statusCode);
    }
}

 実績はAchievementBufferというリストのようなコンテナに入って取得されます。サンプルでは取得に成功した場合はTextViewに主要な情報を表示するようにしています。

 サンプルではエラーハンドリングを省略していますが、本来はきちんと行うべきです。Javadocで詳細を確認して、発生する可能性のあるケースごとに対応処理を入れてください。

Achievementの取得と読み込み

 Google Playに登録されている実績を取得(アンロック)するには、以下のように行います。

getGamesClient().unlockAchievement(
        getString(R.string.trivial_victory_achievement_id));

 GamesClient#unlockAchievement(String)に、Google Playに登録した実績IDを渡すことで取得できます。

 登録されている実績は以下のようにして、リスナーを通して非同期で取得します。

getGamesClient().loadAchievements(this, true);

 第2引数のbooleanフラグがないGamesClient#loadAchievements()もAPIとして提供されていますが、そちらは非推奨で将来的に削除される予定です。

 上記は強制的に実績を取得するように第2引数にtrueを渡していますが、一般的にはfalseを指定し、ローカルキャッシュを有効に活用します。

ゲーム以外でも使いたくなるほど簡単

 今回はGoogle Play Game Servicesの機能の一部を取り上げましたが、いかがでしたでしょうか。Google Play Game Servicesは、Google Playの設定が大変ですが、それさえできてしまうと、驚くほど簡単にクラウドとのデータ同期が行えます。ゲーム以外でも使いたくなるぐらいです。

 次回も引き続きGoogle Play Game Servicesの機能を、今回のサンプルアプリに機能を追加する形で紹介する予定です。

「Androidで動く携帯Javaアプリ作成入門」バックナンバー
前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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