5 лучших результатов в таблице лидеров Google

Мое требование - получить 5 лучших результатов из таблицы лидеров и отобразить их в моем приложении.

Существует метод loadTopScores, но я думаю, он показывает результаты в своем собственном пользовательском интерфейсе.

mGamesClint.loadTopScores(new OnLeaderboardScoresLoadedListener() {

            public void onLeaderboardScoresLoaded(int arg0, LeaderboardBuffer arg1,
                    LeaderboardScoreBuffer arg2) {
                // TODO Auto-generated method stub




            }
        }, LEADERBOARD_ID,LeaderboardVariant.TIME_SPAN_ALL_TIME  , LeaderboardVariant.COLLECTION_PUBLIC, 5, true);

Так есть ли способ получить индивидуальные данные, такие как имя и оценка?..?

Имя 1 : Имя лучшего бомбардира 1 оценка 1 : оценка лучшего бомбардира 1

Имя 2: Имя лучшего бомбардира 2. Оценка 2: Оценка лучшего бомбардира 2.

......и так далее

Мне просто нужна строка имени и целое число баллов, чтобы я мог использовать его в своей игре.

Пожалуйста, предложите мне несколько идей


person Sandeep R    schedule 05.06.2014    source источник
comment
не могли бы вы опубликовать свое решение здесь? Я ищу то же самое, но пока не могу найти решение.   -  person Jawad Amjad    schedule 02.06.2015
comment
@JawadAmjad проверь мой ответ.   -  person Sandeep R    schedule 08.06.2015


Ответы (4)


Вы находитесь на правильном пути в своем примере, вам просто нужно извлечь информацию после ее загрузки. Это довольно запутанно, чтобы заставить его работать, но я укажу вам на этот мой ответ, который показывает, как это сделать для достижения - выполнение этого для списков лидеров работает так же, за исключением того, что вы будете использовать интерфейсы списков лидеров вместо тех, которые используются для достижений.

По сути, вы получите доступ к arg2 для получения данных, и это должно выглядеть примерно так:

mGamesClint.loadTopScores(new OnLeaderboardScoresLoadedListener() {

   public void onLeaderboardScoresLoaded(int arg0, LeaderboardBuffer arg1, LeaderboardScoreBuffer arg2) {

      // iterate through the list of returned scores for the leaderboard
      int size = arg2.getCount();
      for ( int i = 0; i < size; i++ )  {
         LeaderboardScore lbs = arg2.get( i );

         // access the leaderboard data
         int rank = i + 1;         // Rank/Position (#1..#2...#n)
         String name = lbs.getScoreHolderDisplayName();
         String scoreStr = lbs.getDisplayScore();
         long score = lbs.getRawScore();

         // now display or cache these values, or do whatever with them :)
      }

      arg2.close();
      arg1.close();
   }
}, LEADERBOARD_ID,LeaderboardVariant.TIME_SPAN_ALL_TIME, LeaderboardVariant.COLLECTION_PUBLIC, 5, true);

На самом деле я не тестировал эту реализацию, но она должна работать (или, по крайней мере, показать вам достаточно, чтобы вы могли исправить любые ошибки, которые я мог сделать).

Просто помните, что это будет сделано асинхронно, поэтому содержимое метода не будет выполнено немедленно, а сразу после загрузки партитуры.

person free3dom    schedule 05.06.2014
comment
с помощью этого я могу получить баллы и имена из таблицы лидеров и создать свой собственный интерфейс для таблицы лидеров. - person Sandeep R; 06.06.2014
comment
Я рад, я рад помочь. А так как не было примеров, которые я мог бы найти где-нибудь, было бы неплохо записать их где-нибудь для дальнейшего использования. - person free3dom; 06.06.2014
comment
есть ли шанс, что вы могли бы опубликовать рабочий код? это, кажется, не работает, как есть - person behelit; 13.11.2014
comment
@behelit Я не могу написать ваш код за вас, я могу только указать вам правильное направление - это никогда не должно было быть рабочим кодом, просто пример. Обратитесь к документации, если вам нужны дополнительные пояснения. - person free3dom; 13.11.2014
comment
Я нигде не могу найти прослушиватель OnLeaderboardScoresLoadedListener, я искал документы и все, что мог, не могли бы вы помочь? - person Jawad Amjad; 02.06.2015

Вот как я этого добился.

PendingResult<Leaderboards.LoadScoresResult> topScores = 
            Games.Leaderboards.loadTopScores(getApiClient(),LEADERBOARD_ID,LeaderboardVariant.TIME_SPAN_ALL_TIME, LeaderboardVariant.COLLECTION_PUBLIC, 1, true);
            topScores.setResultCallback(new ResultCallback<Leaderboards.LoadScoresResult>() {

                @Override
                public void onResult(LoadScoresResult scoreResults) {

                    if(scoreResults != null) {
                        if (scoreResults.getStatus().getStatusCode() == GamesStatusCodes.STATUS_OK) {
                            scoreStringBuilder = new StringBuilder();
                            LeaderboardScoreBuffer scoreBuffer = scoreResults.getScores();
                            Iterator<LeaderboardScore> it = scoreBuffer.iterator();
                            while(it.hasNext()){
                                 LeaderboardScore temp = it.next();
                                 Log.d("PlayGames", "player"+temp.getScoreHolderDisplayName()+" id:"+temp.getRawScore() + " Rank: "+temp.getRank());
                                 scoreStringBuilder.append("|"+temp.getScoreHolderDisplayName()+"*"+temp.getRawScore());
                            }
                            UnityPlayer.UnitySendMessage(handlerName, "onGetScoreSucceededEventListener", "");
                             Log.d("PlayGames", "Call Sent for getHighScorewithPlayerNameSuccess ::: "+handlerName);


                        }
                    }

                }});

Вы можете использовать его по своему усмотрению. Я создал строку и вернул ее в Unity, а затем проанализировал. Но этот код работает с последними сервисами Google Play.

Спасибо

person Jawad Amjad    schedule 08.06.2015

Мое решение, которое сработало, заключается в следующем: оно предназначено для новейших игровых сервисов.

  Games.Leaderboards.loadTopScores(mGamesClint,LEADERBOARD_ID, LeaderboardVariant.TIME_SPAN_ALL_TIME, LeaderboardVariant.COLLECTION_PUBLIC, 5).setResultCallback(new ResultCallback<Leaderboards.LoadScoresResult>() {

        public void onResult(LoadScoresResult arg0) {
            // TODO Auto-generated method stub

            int size = arg0.getScores().getCount();



            for ( int i = 0; i < 3; i++ )  {

                LeaderboardScore lbs = arg0.getScores().get(i);

                String name = lbs.getScoreHolderDisplayName();

                String score = lbs.getDisplayScore();

                Uri urlimage = lbs.getScoreHolderHiResImageUri();

                 }

 }

вы можете получить все данные от пользователей списка лидеров здесь, включая изображение с высоким разрешением, т.е. изображение профиля. Надеюсь, вы уловили здесь идею.

person Sandeep R    schedule 08.06.2015
comment
выглядит нормально, но вы должны закрыть буфер результатов после того, как закончите (согласно ссылке): arg0.getScores().close(); - person sjkm; 26.11.2015

Этот код дает вам 5 лучших результатов в таблице лидеров.

private LeaderboardsClient mLeaderboardsClient; 

    mLeaderboardsClient.loadTopScores("HgkF9bOSF_UPAAILKE", LeaderboardVariant.TIME_SPAN_ALL_TIME, LeaderboardVariant.COLLECTION_PUBLIC,5,true).addOnSuccessListener(new OnSuccessListener<AnnotatedData<LeaderboardsClient.LeaderboardScores>>() {
                        @Override
                        public void onSuccess(AnnotatedData<LeaderboardsClient.LeaderboardScores> leaderboardScoresAnnotatedData) {

                            LeaderboardScoreBuffer scoreBuffer = leaderboardScoresAnnotatedData.get().getScores();
                            Iterator<LeaderboardScore> it = scoreBuffer.iterator();
                            while(it.hasNext()){
                                LeaderboardScore temp = it.next();
                                Log.d("PlayGames", "player"+temp.getScoreHolderDisplayName()+" id:"+temp.getRawScore() + " Rank: "+temp.getRank());
                            }

                        }
                    });
person LopezDevelop    schedule 21.08.2018