Как увеличить показатель игрока в рейтингах на Android-сервисе Google Play?
Я прочитал всю документацию о leaderboards в сервисах Google Play, и кажется, что когда я вызываю функцию SubmitScore из GameClient, служба учитывает самый высокий балл только. Например:.
1-й вызов:
gamesclient.submitScore( 100 );
Теперь счет игрока составляет 100
Второй вызов:
gamesclient.submitScore( 150 );
Теперь счет игрока составляет 150
Третий вызов:
gamesclient.submitScore( 100 );
рейтинг игрока по-прежнему остается 150. Представленное значение не больше последнего, поэтому оно игнорируется.
Есть ли простой способ получить оценку последнего игрока, суммировать новый балл и представить общее количество для создания инкрементного рейтинга? Что-то вроде
int old_score = ...GET LAST PLAYER SCORE...
int new_score = old_score + current_game_score;
gamesclient.submitScore( new_score );
Ответы
Ответ 1
Не тестировал его до сих пор, но я думаю, что это путь:
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);
}
Ответ 2
Вот что я придумал...
@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);
}
}
Ответ 3
Кажется, не существует встроенного способа сделать это, к сожалению. Однако вы можете использовать Cloud Save, чтобы просто сохранить самую последнюю оценку игрока и просто использовать это.
В качестве альтернативы (это может показаться немного липким) каждый раз, когда вы отправляете баллы, сохраните этот счет в SharedPreferences
, а затем, когда вы отправляете другой балл, используйте это предпочтение, чтобы увеличить счет, а не установить совершенно новый.
Надеюсь, это поможет, если это не так, как вы хотели бы решить свою проблему, сообщите мне, и я попытаюсь найти другое решение...
Ответ 4
Пока вам даны примеры того, как увеличивать баллы, вы не можете использовать таблицы лидеров в качестве таблиц лиг, где количество баллов уменьшается.
Google в настоящее время только позволяет объекту скрывать десятки подозреваемых мошенников. Если бы какой-то способ снизить баллы или полностью стереть их, вы сможете делать то, что вы просите.
Я думаю, что аргументация в этом заключается в том, что если они позволят вам изменить уже опубликованные оценки, это уменьшит доверие пользователей как к платформе Google Play Game Services, так и к вашей игре - для искажения того, что игроки любят брать на себя (извините жаргоне.).
Это приводит к увеличению инфляции с течением времени, я думаю, что они используют 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);
Вы могли, но изменили позицию позиции фиксированного места с фиксированной точкой в позиции десятичной точки в качестве корректировки курса к этой инфляции. Я бы не стал.
Извините, если это не в тему, дайте надеяться, что Google учтет это в будущих обновлениях.