Как увеличить показатель игрока в рейтингах на 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 учтет это в будущих обновлениях.