Swarmを使ったワールドランキングの実装③です。
本記事ではAchievements(実績)をアプリに実装させていきます。

Swarmへのユーザー登録~アプリの登録、SDKのダウンロードまでは
Swarmを使ったワールドランキングの実装①を参照してください。

アプリへSwarmを実装するまでは
Swarmを使ったワールドランキングの実装②を参照してください。

また、今回はSwarmを使ったワールドランキングの実装②で作った。
プロジェクトを元に進めていきますのでご注意ください。


はい始めましょうといいたいですが
その前にAchievementsを簡単に説明すると、
いわゆる称号みたいなものです。

例えば最大1000スコアであった場合、
ユーザーが900スコア以上たたき出したとします。
そしたら、あなたはすごいという事で称号をつけてあげます。

目に見えた目標を置くことでゲームにやりがいを
つけてあげるという感じです。

よくオンラインゲームだと敵をたくさん倒したりする人はデストロイヤー等
スピード系ならスピードスター等といった称号がついてたりしますね。

簡単な説明が済んだところで始めましょう。


①AchievementをSwarmに登録する。
まずSwarmにログインしAchievements画面へ行き
Achievementを新規登録しましょう。

#Swarm
http://swarmconnect.com/

1.ログインが完了したらメニューの中にある
「Achievements」をクリックします。

2.「Achievements」画面にいったら
「Create new Achievement」をクリックし登録画面にいきましょう。

3.各項目を入力しSubmitを押しましょう。
各項目の説明は下記になります。

・Achievement Title = Achievementのタイトルです。

・Achievement Description = Achievementの説明です。「Achievement Title」の下に表示されます。

・Hidden = Achievementをユーザーに表示させるかどうかです。
表示させない場合の使い方としては、隠したAchievement1をもっていないとAchievement2がとれないといった分けかた等ができますね。

・Order Id = Achievementの表示順です。
少ないほどAchievementリストの上部に表示されます。

・Points = ユーザーがAchievementを取ったときに付与されるSwarmポイントです。
Swarmポイントがどこに使えるかはわかりませんが、複数Achievementを作った場合、
合計で1000以上のポイントは付与できません。

例えばAchievement1を500Pointsで作った場合、
次から作れるAchievementには最大で500Pointsしか使えないという事です。

また合計が1000Pointsに達するとAchievementが作れなくなるので注意しましょう。
※作成済のAchievementのPointsを変えればまた作れるようになります。

このPointsは0でも作れるので、非表示のAchievement等は0にしたりなど工夫してください。

・Show to App Versions = SwarmAppバージョンです。今は使われてないので気にせずデフォルトでいいでしょう。

$うつ病miwawaの日記帳

今回のサンプルでは下記のようにしました。
・Achievement Title = Super man
・Achievement Description = すごいって事
・Hidden = NO
・Order Id = 1
・Points = 500
・Show to App Versions = デフォルト


4.作成したら、Achievementsに登録されたのを確認し「ID」をメモしましょう。
アプリ側でAchievementを操作するときはこのIDを使います。
考え方はLeaderboardsと同じですね。
$うつ病miwawaの日記帳

ここまできたらSwarmへの登録は終わりです。

②プロジェクトに実装しましょう。
冒頭でも触れましたが、今回はSwarmを使ったワールドランキングの実装②で作った。
プロジェクトを元に進めていきますのでご注意ください。

すでにプロジェクトにはSwarmが実装されているので
AndroidManifestだったりはいじりません。

今回はmain.xmlとjava部分だけをいじります。

1.main.xml
赤字部分を追記してください。
Achievements動作確認用にボタンを押したらAchievementを開放(登録)するボタンと
Achievementsのリストを表示するボタンを配置してみます。

------------------------------------------------------
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/view1"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<Button
android:id="@+id/send_ranking1"
android:text="ranking1へ100スコア登録"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:id="@+id/send_ranking2"
android:text="ranking2へ1.1スコア登録"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:id="@+id/show_ranking1"
android:text="ranking1を参照"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:id="@+id/show_ranking2"
android:text="ranking2を参照"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:id="@+id/show_Leaderboards"
android:text="Leaderboardsを表示"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />

<!-- Achievements動作確認用のボタンを配置 -->
<Button
android:id="@+id/send_Achievements"
android:text="Achievementを開放"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:id="@+id/show_Achievements"
android:text="Achievementsを表示"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />


<LinearLayout>
------------------------------------------------------



2.Java側
赤字部分を追記してください。
説明は毎度のようにコメント部分をみてくださいませ。

------------------------------------------------------
import java.util.HashMap;
import java.util.Map;
import com.swarmconnect.Swarm;
import com.swarmconnect.SwarmAchievement;
import com.swarmconnect.SwarmAchievement.GotAchievementsMapCB;
import com.swarmconnect.SwarmActiveUser;
import com.swarmconnect.SwarmActivity;
import com.swarmconnect.SwarmLeaderboard;
import com.swarmconnect.SwarmLeaderboard.GotLeaderboardCB;
import com.swarmconnect.delegates.SwarmLoginListener;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

//extends AvtivityをSwarmActivityに変えます。
//public class MainActivity extends Activity {
public class MainActivity extends SwarmActivity {

//リーダーボードに登録したり参照するためにSwarmLeaderboardを用意します。
public static SwarmLeaderboard swarm_leaderboard;

//Achievementsを開放したり参照するためにMapを用意します。
//今回はログイン時にコールバック(Achievecallback)をしてAchievementsを取得しています。
public static Map<Integer, SwarmAchievement> swarm_achievements = new HashMap<Integer, SwarmAchievement>();

//開放するAchievementのIDを変数:ACHIEVEMENT_IDに配置します。ご自分の登録したIDに直してください。
//もちろん変数などを使わないで直接でもいいです。
int ACHIEVEMENT_ID = 7427;


Button btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

//initの第2引数にAppIDを第3引数を登録したAppKeyを
Swarm.init(this, 2689, "ced642681bd5690e933c5d137ebc16a4", mySwarmLoginListener);



btn = (Button)findViewById(R.id.send_ranking1);
btn.setOnClickListener(btnListener);
btn = (Button)findViewById(R.id.send_ranking2);
btn.setOnClickListener(btnListener);
btn = (Button)findViewById(R.id.show_ranking1);
btn.setOnClickListener(btnListener);
btn = (Button)findViewById(R.id.show_ranking2);
btn.setOnClickListener(btnListener);
btn = (Button)findViewById(R.id.show_Leaderboards);
btn.setOnClickListener(btnListener);

//Achievements動作確認用に追加したボタンをセットします。
btn = (Button)findViewById(R.id.send_Achievements);
btn.setOnClickListener(btnListener);
btn = (Button)findViewById(R.id.show_Achievements);
btn.setOnClickListener(btnListener);


}


//Swarmへのログイン処理********************************************************************
private SwarmLoginListener mySwarmLoginListener = new SwarmLoginListener() {

// This method is called when the login process has started
// (when a login dialog is displayed to the user).
public void loginStarted() {
Log.w("Exception","Exception");
}

// This method is called if the user cancels the login process.
public void loginCanceled() {
}

// This method is called when the user has successfully logged in.
public void userLoggedIn(SwarmActiveUser user) {
// Load our Leaderboard

//ログイン時にSwarmに登録されたAchievementsをコールバックでswarm_achievementsに渡します。
SwarmAchievement.getAchievementsMap(Achievecallback);

}

// This method is called when the user logs out.
public void userLoggedOut() {
}

};

//********************************************************************


//ボタン処理********************************************************************

private OnClickListener btnListener = new OnClickListener() {
public void onClick(View v) {

switch(v.getId()){

//Ranking1にスコア100を登録
case R.id.send_ranking1:
//Ranking1のリーダーボードに登録する
//Ranking1のLeaderboard IDをコールバックで取得する
SwarmLeaderboard.getLeaderboardById(4623, new GotLeaderboardCB() {
public void gotLeaderboard(SwarmLeaderboard lb) {
//返ってきたLeaderboard IDをセットしたらsubmitScore()で登録
swarm_leaderboard = lb;
swarm_leaderboard.submitScore(100, null, null);
}
});
break;

//Ranking2にスコア1.1を登録
case R.id.send_ranking2:
//Ranking2のリーダーボードに登録する
//Ranking2のLeaderboard IDをコールバックで取得する
SwarmLeaderboard.getLeaderboardById(4625, new GotLeaderboardCB() {
public void gotLeaderboard(SwarmLeaderboard lb) {
//返ってきたLeaderboard IDをセットしたらsubmitScore()で登録
swarm_leaderboard = lb;
swarm_leaderboard.submitScore((float) 1.1, null, null);
}
});
break;

//Ranking1のスコアを参照
case R.id.show_ranking1:
//Ranking1のリーダーボードを参照する
//Ranking1のLeaderboard IDをコールバックで取得する
SwarmLeaderboard.getLeaderboardById(4623, new GotLeaderboardCB() {
public void gotLeaderboard(SwarmLeaderboard lb) {
//返ってきたLeaderboard IDをセットしたらshowLeaderboard()で参照
swarm_leaderboard = lb;
swarm_leaderboard.showLeaderboard();
}
});
break;

//Ranking2のスコアを参照
case R.id.show_ranking2:
//Ranking2のリーダーボードを参照する
//Ranking2のLeaderboard IDをコールバックで取得する
SwarmLeaderboard.getLeaderboardById(4625, new GotLeaderboardCB() {
public void gotLeaderboard(SwarmLeaderboard lb) {
//返ってきたLeaderboard IDをセットしたらshowLeaderboard()で参照
swarm_leaderboard = lb;
swarm_leaderboard.showLeaderboard();
}
});
break;

//全リーダーボードを参照
case R.id.show_Leaderboards:
//全リーダーボードを参照する場合はshowLeaderboards()でOK
//ダッシュボードならshowDashboard()
Swarm.showLeaderboards();
break;


//Achievementを開放
case R.id.send_Achievements:

//取得したswarm_achievementsがnullではないか &
//Map<Integer, SwarmAchievement>.get(ACHIEVEMENT_ID).unlockedで対象Achievementが開放されていないか確認。
//まだ開放されていなければACHIEVEMENT_IDに入っているIDのAchievementの開放処理へ。
//※本来はさらにこの前にスコアが1000を超えてたらなどの分岐処理もいれる感じです。
if (swarm_achievements != null &&swarm_achievements.get(ACHIEVEMENT_ID).unlocked == false){

//Map<Integer, SwarmAchievement>.get(ACHIEVEMENT_ID).unlock()で開放処理をします。
swarm_achievements.get(ACHIEVEMENT_ID).unlock();
}

break;

//Achievementsを参照
case R.id.show_Achievements:
//showAchievementsでAchievementsを参照できます。
Swarm.showAchievements();
break;


default:
break;
}

}
};

//swarm_leaderboardに送られてきたLeaderboard IDをセットするコールバック****************************
GotLeaderboardCB callback = new GotLeaderboardCB() {
public void gotLeaderboard(SwarmLeaderboard leaderboard) {

if (leaderboard != null) {

// Save the leaderboard for later use
swarm_leaderboard = leaderboard;
}
}
};
//************************************************************************************


//Achievementsを取得するコールバック**********************************************************
GotAchievementsMapCB Achievecallback = new GotAchievementsMapCB() {

public void gotMap(Map achievements) {

// Store the map of achievements somewhere to be used later.
swarm_achievements = achievements;
}
};
//************************************************************************************

}

------------------------------------------------------

コメントが分かりづらかったらごめんなさい。。

んで動作を確認してみましょう。
まずAchievementsを参照してみましょう。
$うつ病miwawaの日記帳
Swarmに登録したSuper manが表示されています。
まだ開放されていないのでトロフィーがグレー表示です。

開放してみましょう。
$うつ病miwawaの日記帳
成功するとカスタムトーストで「Achievement Unlocked!」とでます。

またAchievementsを参照してみましょう。
$うつ病miwawaの日記帳
今度はトロフィーに色がつきました。


以上でAchievementsも簡単に実装できます。
お疲れ様でした。
説明がおかしくて逆に難しくなってたらごめんなさい。。

最後にプロジェクトも置いておきます。
>ここ