首页 > 解决方案 > 从排行榜值同步我的游戏本地分数时出现问题

问题描述

尝试在所有排行榜上获取玩家的分数以便在本地存储时,我遇到了错误。

我的 Android 游戏设计为离线玩,因此我在本地存储每种游戏模式的高分和终生得分。

现在我正在为我的游戏添加排行榜。在玩游戏期间,我会定期将这些分数发布到排行榜上。到目前为止,一切都很好。

当然,我需要涵盖用户卸载我的游戏或转移到新设备等的场景。在这种情况下,当他们再次登录 Google 时,我需要将排行榜上的分数更新回我的本地版本。

26504 - NETWORK_ERROR_NO_DATA这是我打第四次电话时似乎得到的地方。

我试图等到第 3 次通话完成,然后触发第 4 次通话,但我仍然遇到同样的错误。所以我什至无法为我仍然需要检索的 5-6 个附加分数添加代码。

getScoresFromLeaderboards(GAME_MODE_FIXED_QUESTIONS, SCORE_HIGH);
getScoresFromLeaderboards(GAME_MODE_FIXED_QUESTIONS, SCORE_LIFETIME);
getScoresFromLeaderboards(GAME_MODE_RAPID_FIRE, SCORE_HIGH);
getScoresFromLeaderboards(GAME_MODE_RAPID_FIRE, SCORE_LIFETIME);

然后...

public long getScoresFromLeaderboards(final String gameMode, final String scoreType) {
final int scoreHigh = 0, scoreLifetime = 0;

String leaderboardID = getLeaderboardForGameMode(gameMode, scoreType);

mLeaderboardsClient.loadCurrentPlayerLeaderboardScore(leaderboardID, LeaderboardVariant.TIME_SPAN_ALL_TIME, LeaderboardVariant.COLLECTION_PUBLIC )
.addOnCompleteListener(new OnCompleteListener<AnnotatedData<LeaderboardScore>>() {
       @Override
       public void onComplete(@NonNull Task<AnnotatedData<LeaderboardScore>> task) {
                if (task.isSuccessful()) {
                    AnnotatedData<LeaderboardScore> lbs = task.getResult();
                    long i = lbs.get().getRawScore();
                    // Do something to store the score locally
                }
                else{
                     Log.Error("Error", "Retrieval failed");
                }
      }

标签: android

解决方案


我建议使用另一种方法来使用具有 3 个查询限制的“ loadCurrentPlayerLeaderboardScore ”

改用 loadPlayerCenteredScores 。将分数限制为 1。结果缓冲区将仅返回玩家分数。您现在处于 500 个请求的用户配额中,而不是 3 个。

long limitResultsTo = 1;
String PlayerID = "-1"; // set this from playersClient.getCurrentPlayer() ->task-> getPlayerId()
String leaderboardID = getString(R.string.leaderboard_name); // or string of ID
Games.getLeaderboardsClient(this, GoogleSignIn.getLastSignedInAccount(this))
    .loadPlayerCenteredScores(leaderboardName, LeaderboardVariant.TIME_SPAN_ALL_TIME, LeaderboardVariant.COLLECTION_PUBLIC, limitResultsTo)
    .addOnSuccessListener(new OnSuccessListener<AnnotatedData<LeaderboardsClient.LeaderboardScores>>() {
        @Override
        public void onSuccess(AnnotatedData<LeaderboardsClient.LeaderboardScores> leaderboardScoreAnnotatedData) { // big ups Danoli3.com for the fix for loadCurrentPlayerLeaderboardScore
            LeaderboardsClient.LeaderboardScores scoresResult =  leaderboardScoreAnnotatedData.get();
            LeaderboardScore scoreResult = (scoresResult != null ? scoresResult.getScores().get(0) : null);
            long score = 0;
            if(scoreResult != null && scoreResult.getScoreHolder() != null &&
                PlayerID.equals(scoreResult.getScoreHolder().getPlayerId())) // else if the player has 0 score it will retrieve top player
            score = scoreResult.getRawScore();
      
            // use the score in your own code here
            // Log.i(TAG, "loadPlayerCenteredScores:" + leaderboardID + " score:" + score);

            leaderboardScoreAnnotatedData = null; 
        }
    }).addOnFailureListener(new OnFailureListener() {
    @Override
    public void onFailure(@NonNull Exception e) {
        Log.e(TAG, "Failure:loadPlayerCenteredScores  GPG:Leader:" + leaderboardID + " Ex:" + e.getMessage());
    }

推荐阅读