Saturday, December 27, 2014

[Android] Chức năng Leader Board sử dụng Google Play API

* Thêm BaseGameUtils vào project
1. Tải BaseGameUtils về từ link. Hoặc từ link này (khi đó bỏ qua bước 2 và 3)
2. (Eclipse) nhảy đến thư mục android-basic-samples-master trong cmd
3. (Ubuntu) chạy lệnh: bash Scripts/make_eclipse_compat
4. (Eclipse) File > Import... > Existing Android Code Into Workspace > chọn đường dẫn đến eclipse_compat/libraries/BaseGameUtils
5. BaseGameUtils > Properties > Android > Library > tick chọn is Library và thêm reference đến google-play-services_lib

6. Project cần sử dụng BaseGameUtils > Properties > Android > Library > thêm reference đến BaseGameUtils
7. Nếu báo lỗi có 2 android-support-v4 trong project của bạn. Giải quyết như sau:
BaseGameUtils > Properties > Java Build Path > Order and Export > Bỏ chọn Android Private Libraries

* Sử dụng GameHelper của BaseGameUtils
Code bên dưới minh họa ứng xử như sau:
- Tự động đăng nhập 1 lần, nếu người dùng bấm Cancel, các lần sau không tự động đăng nhập nữa (vì GameHelper đã tự động lưu trong Preference)
- Người dùng nhấp Button để xem Leader Board -> displayLeaderBoard -> nếu chưa đăng nhập, yêu cầu người dùng đăng nhập -> đăng nhập thành công tự động hiển thị Leader Board (trong code minh họa còn submit điểm của người dùng, nhằm tránh việc điểm cao không được submit lúc người dùng chưa đăng nhập)

Activity
public GameHelper gameHelper;

@Override
protected void onCreate(Bundle savedInstanceState) {
//...
gameHelper = new GameHelper(this, GameHelper.CLIENT_GAMES);
gameHelper.setMaxAutoSignInAttempts(1);
gLeaderBoard = new GoogleAPILeaderBoard(this, GoogleAPILeaderBoard.FLAG_NOTHING);

gameHelper.setup(gLeaderBoard);
//...
}

@Override

protected void onStart() {
//...
gameHelper.onStart(this);
//...
}

@Override

protected void onStop() {
//...
gameHelper.onStop();
//...
}

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case REQUEST_LEADERBOARD:
// ...
break;
default:
gameHelper.onActivityResult(requestCode, resultCode, data);
break;
}
}

private static final int REQUEST_LEADERBOARD = 555;
public void displayLeaderBoard(View v) {
// gamestate.isGoogleAPIConnected() is equal to gameHelper.isSignedIn()
if(gamestate.isGoogleAPIConnected()) {
        // do something before starting default Leader Board
if(!state.FEATURE_RATE_SHARE_LEADERBOARD_ENABLE) return;
feature_menu_rate_share_leaderboard_click();
startActivityForResult(Games.Leaderboards.getLeaderboardIntent(gameHelper.getApiClient(),
this.getString(R.string.leaderboard_top_players)), REQUEST_LEADERBOARD);
} else {
gLeaderBoard.setFlag(GoogleAPILeaderBoard.FLAG_LEADER_BOARD);
gameHelper.beginUserInitiatedSignIn();
}

}

// optional
// use Google API to submit score to Leader Board (developer did set up Leader Board)
public void submitBestScore2LeaderBoard() {
int bestScore = AppLib.getConfiguration(this, ConstantStorage.PREF_GAME_STATE, ConstantStorage.PREF_BEST_SCORE_KEY);
if(gamestate.isGoogleAPIConnected() && bestScore>ConstantStorage.GAME_MINIMUM_SCORE_SUBMIT_LEADER_BOARD) {
Games.Leaderboards.submitScore(gameHelper.getApiClient(), this.getString(R.string.leaderboard_top_players), bestScore);
}

}

GoogleAPILeaderBoard
public class GoogleAPILeaderBoard implements GameHelperListener {
//private Context context;
private SkymonsterMain sm;
private int flag;
public static final int FLAG_NOTHING = 0;
public static final int FLAG_LEADER_BOARD = 1;
public GoogleAPILeaderBoard(Context context, int flag) {
//this.context = context;
this.sm = (SkymonsterMain) context;
this.setFlag(flag);
}
@Override
public void onSignInFailed() {
this.sm.gamestate.setGoogleAPIConnected(false);
}

@Override
public void onSignInSucceeded() {
this.sm.gamestate.setGoogleAPIConnected(true);
this.sm.submitBestScore2LeaderBoard();
switch (this.getFlag()) {
case FLAG_LEADER_BOARD:
this.sm.displayLeaderBoard(null);
break;
default:
break;
}
}

public int getFlag() {
return flag;
}

public void setFlag(int flag) {
this.flag = flag;
}

}

No comments:

Post a Comment