如何在Android Google Play服务上的排行榜中增加玩家分数?

我阅读了有关Google Play服务中排行榜的所有文档,看起来当我调用GameClient的submitScore函数时,服务仅考虑到提交的最高分数。 例如:

第一个电话:

gamesclient.submitScore( 100 ); 

现在球员得分是100

第二次电话:

 gamesclient.submitScore( 150 ); 

现在球员得分是150

第三个电话:

 gamesclient.submitScore( 100 ); 

玩家分数依然保持150.提交值不大于最后,所以被忽略。

有一个简单的方法来检索最后的球员得分,总结新的得分,并提交创build一个增量得分排行榜总? 就像是

 int old_score = ...GET LAST PLAYER SCORE... int new_score = old_score + current_game_score; gamesclient.submitScore( new_score ); 

Solutions Collecting From Web of "如何在Android Google Play服务上的排行榜中增加玩家分数?"

到目前为止还没有testing,但我认为这是要走的路:

  PendingResult<Leaderboards.LoadPlayerScoreResult> result = Games.Leaderboards.loadCurrentPlayerLeaderboardScore(gameHelper.getApiClient(),"LEADERBOARD_ID",LeaderboardVariant.TIME_SPAN_ALL_TIME, LeaderboardVariant.COLLECTION_PUBLIC); result.setResultCallback(new ResultCallback<Leaderboards.LoadPlayerScoreResult>() { @Override public void onResult(Leaderboards.LoadPlayerScoreResult loadPlayerScoreResult) { Games.Leaderboards.submitScore(gameHelper.getApiClient(), "LEADERBOARD_ID",loadPlayerScoreResult.getScore().getRawScore()+ score); } 

这是我想出来的

 @Override public void postNewScore(final int finalScore, final ArrayList<String> theseBoards) { //posts score update to any theseBoards... most likely 2 boards for (final String anID : theseBoards) { aHelper.getGamesClient().loadPlayerCenteredScores(new OnLeaderboardScoresLoadedListener() { @Override public void onLeaderboardScoresLoaded(int statusCode, Leaderboard leaderboard, LeaderboardScoreBuffer scores) { if(statusCode == GamesClient.STATUS_OK){ if(scores.getCount() == 0){ aHelper.getGamesClient().submitScore(anID, finalScore); dLog("submitted a score because there were no scores period"); } else { for (LeaderboardScore s : scores) { if(s.getScoreHolder().getPlayerId().contains(aHelper.getGamesClient().getCurrentPlayer().getPlayerId()) || aHelper.getGamesClient().getCurrentPlayer().getPlayerId().contains(s.getScoreHolder().getPlayerId())){ aHelper.getGamesClient().submitScore(anID, finalScore + s.getRawScore()); dLog("just submitted " + (finalScore + s.getRawScore())); scores.close(); return; } } //if to here, then no score on the current page, which means the player does not have a score aHelper.getGamesClient().submitScore(anID, finalScore); dLog("because no entry, just submitted " + (finalScore)); } } scores.close(); } }, anID, LeaderboardVariant.TIME_SPAN_ALL_TIME, LeaderboardVariant.COLLECTION_SOCIAL, 1); } } 

不幸的是,似乎没有一个内置的方式做到这一点。 不过,您可以使用云端保存function来保存最新的玩家分数,然后使用它。

或者,每次提交分数时(这可能看起来有点俗气),在SharedPreferences保存该分数,然后在提交另一个分数时,使用该首选项来增加分数,而不是设置一个全新的分数。

希望这有帮助,如果这不是真的如何解决你的问题,让我知道,我会尝试find另一种解决scheme…

虽然你已经给出了如何增加分数的例子,你不能使用排行榜作为分数下降的排名表。

谷歌目前只允许该设施隐藏数十名可疑的作弊者。 如果有某种方法可以降低分数或完全消除分数,你就可以做你正在问的东西。

我认为这背后的原因是,如果他们允许您修改已经发布的分数,那么会降低用户对Google Play游戏服务平台以及游戏的信任度,从而扭曲玩家喜欢拥有的东西(原谅该术语)。 。

这导致随着时间的推移得分通货膨胀,我认为他们在内部使用64位整数:

  /** * Submit a score to the leaderboard for the currently signed-in player. * The score is ignored if it is worse (as defined by the leaderboard * configuration) than a previously submitted score for the same player. */ void SubmitScore(std::string const &leaderboard_id, uint64_t score); 

但是,您可以修改排行榜的固定位置的小数点位置,作为该通货膨胀的路线调整。 我不会。

对不起,如果这是脱离主题,让我们希望谷歌在未来的更新考虑到这一点。