android - 从排行榜值同步我的游戏本地分数时出现问题
问题描述
尝试在所有排行榜上获取玩家的分数以便在本地存储时,我遇到了错误。
我的 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");
}
}
解决方案
我建议使用另一种方法来使用具有 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());
}
推荐阅读
- xamarin - 如何在屏幕上保留 Xamarin 标签,并将数据绑定到 Carosell 项
- javascript - 如何在带有 javascript 的过滤器中使用 toLowerCase()?
- javascript - 从数据快照中检索第一个元素
- python - 探索将条件应用于除 pandas 之外的每一行数据帧的替代方案
- webpack - CreateReactApp:导入 javascript 文件
- javascript - React useState 不会在窗口事件中更新
- mysql - 我想过滤一个特定列的MYSQL查询
- android - FCM 推送通知仅适用于 Android,但仅向 Android 和 IOS 发送消息
- python - 无法使用 Python 套接字模块连接到本地网络外部我的 PC 上的服务器程序
- python-3.x - 从 Callable Type 签名中删除 Self 以匹配 Instance 方法