2016-05-03 39 views
7

Pracuję nad grą, w której wyniki są przekazywane do tabel wyników w działaniu, a nowe wysokie wyniki są wyświetlane w szeregu w jednym fragmencie. Mam coś (nieco) funkcjonalnego, ale wskaźnik sukcesu wynosi ~ 10%.Przesyłanie wyników do tabel wyników gier Google Play i wyświetlanie nowego rankingu

Przepływ jest następujący:

Method handleLeaders

Metoda ta pobiera aktualne wyniki dla każdej tablicy, a jeżeli nowy wynik jest lepszy, jest złożony i nowy newHigh przedmiot jest tworzony z wynikiem i dodawany do tablicy ArrayList. Po obsłużeniu wszystkich 3 tabel wyników wywoływana jest metoda setHighs. (Błędy są sprawdzone w każdym z połączeń tabeli liderów)

public void handleLeaders(boolean win, int size, double t, final int toupees) { 
    if(win) { 
     final long time = (long) t; 
     // Toupees 
     Games.Leaderboards.loadCurrentPlayerLeaderboardScore(mGoogleApiClient, 
       getString(R.string.leaderboard_trumps_toupeed), 
       LeaderboardVariant.TIME_SPAN_ALL_TIME, 
       LeaderboardVariant.COLLECTION_PUBLIC).setResultCallback(
       new ResultCallback<Leaderboards.LoadPlayerScoreResult>() { 

        @Override 
        public void onResult(Leaderboards.LoadPlayerScoreResult arg0) { 
         LeaderboardScore c = arg0.getScore(); 
         int old; 
         if (c != null) 
          old = (int) c.getRawScore(); 
         else 
          old = 0; 
         Games.Leaderboards.submitScore(mGoogleApiClient, getResources().getString(R.string.leaderboard_trumps_toupeed), old + toupees); 

         GameEndOverlay.newHighs.add(new newHigh("Trumps Toupee'd", old + toupees)); 

         Status status = arg0.getStatus(); 
         int statusCode = status.getStatusCode(); 

         if (statusCode == GamesStatusCodes.STATUS_NETWORK_ERROR_NO_DATA) 
          GameEndOverlay.highsError = true; 


         if(++GameEndOverlay.leaderboardsCompleted == 3) 
          ((GameEndOverlay) gameEndOverlayFrag).setHighs(); 

        } 
       }); 

     if (size == getResources().getInteger(R.integer.size_apprentice)) { 

      // Wins 
      Games.Leaderboards.loadCurrentPlayerLeaderboardScore(mGoogleApiClient, 
        getString(R.string.leaderboard_apprentice_wins), 
        LeaderboardVariant.TIME_SPAN_ALL_TIME, 
        LeaderboardVariant.COLLECTION_PUBLIC).setResultCallback(
        new ResultCallback<Leaderboards.LoadPlayerScoreResult>() { 

         @Override 
         public void onResult(Leaderboards.LoadPlayerScoreResult arg0) { 
          LeaderboardScore c = arg0.getScore(); 
          int wins; 
          if (c != null) 
           wins = (int) c.getRawScore(); 
          else 
           wins = 0; 
          Games.Leaderboards.submitScore(mGoogleApiClient, getResources().getString(R.string.leaderboard_apprentice_wins), wins + 1); 

          GameEndOverlay.newHighs.add(new newHigh("Apprentice Wins", wins + 1)); 

          Status status = arg0.getStatus(); 
          int statusCode = status.getStatusCode(); 

          if (statusCode == GamesStatusCodes.STATUS_NETWORK_ERROR_NO_DATA) 
           GameEndOverlay.highsError = true; 


          if(++GameEndOverlay.leaderboardsCompleted == 3) 
           ((GameEndOverlay) gameEndOverlayFrag).setHighs(); 
         } 
        }); 

      // Speed 
      Games.Leaderboards.loadCurrentPlayerLeaderboardScore(mGoogleApiClient, 
        getString(R.string.leaderboard_fastest_apprentice), 
        LeaderboardVariant.TIME_SPAN_ALL_TIME, 
        LeaderboardVariant.COLLECTION_PUBLIC).setResultCallback(
        new ResultCallback<Leaderboards.LoadPlayerScoreResult>() { 

         @Override 
         public void onResult(Leaderboards.LoadPlayerScoreResult arg0) { 
          LeaderboardScore c = arg0.getScore(); 
          long old_time; 
          if(c != null) { 
           old_time = c.getRawScore(); 
           Log.d("time", old_time + ""); 
           if(time < old_time) { 
            Games.Leaderboards.submitScore(mGoogleApiClient, getResources().getString(R.string.leaderboard_fastest_apprentice), time); 
            GameEndOverlay.newHighs.add(new newHigh("Fastest Apprentice", time)); 
           } 
          } 
          else { 
           Games.Leaderboards.submitScore(mGoogleApiClient, getResources().getString(R.string.leaderboard_fastest_apprentice), time); 
           GameEndOverlay.newHighs.add(new newHigh("Fastest Apprentice", time)); 
          } 

          Status status = arg0.getStatus(); 
          int statusCode = status.getStatusCode(); 

          if (statusCode == GamesStatusCodes.STATUS_NETWORK_ERROR_NO_DATA) 
           GameEndOverlay.highsError = true; 


          if(++GameEndOverlay.leaderboardsCompleted == 3) 
           ((GameEndOverlay) gameEndOverlayFrag).setHighs(); 

         } 
        }); 
     } 
} 

metoda setHighs

Ta metoda staje w szeregi każdego odpowiedniego newHigh i zapisuje nową rangę wewnątrz obiektu. Po zebraniu wszystkich rang, wywoływana jest metoda setSecondHighs. (Błędy są sprawdzone w każdym z liderów nazywa)

public void setHighs() { 
    if(getActivity() == null) 
     return; 

    ranksComputed = 0; 

    for(newHigh highRaw : newHighs) { 
     final newHigh high = highRaw; 
     switch(high.getName()) { 
      case "Trumps Toupee'd": 
       Games.Leaderboards.loadCurrentPlayerLeaderboardScore(mGoogleApiClient, 
         getString(R.string.leaderboard_trumps_toupeed), 
         LeaderboardVariant.TIME_SPAN_ALL_TIME, 
         LeaderboardVariant.COLLECTION_PUBLIC).setResultCallback(
         new ResultCallback<Leaderboards.LoadPlayerScoreResult>() { 

          @Override 
          public void onResult(Leaderboards.LoadPlayerScoreResult arg0) { 
           if(arg0.getScore() == null) { 
            highsError = true; 
            ranksComputed++; 
            if(ranksComputed >= newHighs.size()) 
             setSecondHighs(); 
            return; 
           } 
           high.setRank(arg0.getScore().getRank()); 

           Status status = arg0.getStatus(); 
           int statusCode = status.getStatusCode(); 

           if (statusCode == GamesStatusCodes.STATUS_NETWORK_ERROR_NO_DATA) 
            GameEndOverlay.highsError = true; 

           ranksComputed++; 
           if(ranksComputed >= newHighs.size()) 
            setSecondHighs(); 
          } 
         }); 
       break; 
      case "Apprentice Wins": 
       Games.Leaderboards.loadCurrentPlayerLeaderboardScore(mGoogleApiClient, 
         getString(R.string.leaderboard_apprentice_wins), 
         LeaderboardVariant.TIME_SPAN_ALL_TIME, 
         LeaderboardVariant.COLLECTION_PUBLIC).setResultCallback(
         new ResultCallback<Leaderboards.LoadPlayerScoreResult>() { 

          @Override 
          public void onResult(Leaderboards.LoadPlayerScoreResult arg0) { 
           if(arg0.getScore() == null) { 
            highsError = true; 
            ranksComputed++; 
            if(ranksComputed >= newHighs.size()) 
             setSecondHighs(); 
            return; 
           } 
           high.setRank(arg0.getScore().getRank()); 

           Status status = arg0.getStatus(); 
           int statusCode = status.getStatusCode(); 

           if (statusCode == GamesStatusCodes.STATUS_NETWORK_ERROR_NO_DATA) 
            GameEndOverlay.highsError = true; 

           ranksComputed++; 
           if(ranksComputed >= newHighs.size()) 
            setSecondHighs(); 
          } 
         }); 
       break; 
      case "Fastest Apprentice": 
       Games.Leaderboards.loadCurrentPlayerLeaderboardScore(mGoogleApiClient, 
         getString(R.string.leaderboard_fastest_apprentice), 
         LeaderboardVariant.TIME_SPAN_ALL_TIME, 
         LeaderboardVariant.COLLECTION_PUBLIC).setResultCallback(
         new ResultCallback<Leaderboards.LoadPlayerScoreResult>() { 

          @Override 
          public void onResult(Leaderboards.LoadPlayerScoreResult arg0) { 
           if(arg0.getScore() == null) { 
            highsError = true; 
            ranksComputed++; 
            if(ranksComputed >= newHighs.size()) 
             setSecondHighs(); 
            return; 
           } 
           high.setRank(arg0.getScore().getRank()); 

           Status status = arg0.getStatus(); 
           int statusCode = status.getStatusCode(); 

           if (statusCode == GamesStatusCodes.STATUS_NETWORK_ERROR_NO_DATA) 
            GameEndOverlay.highsError = true; 

           ranksComputed++; 
           if(ranksComputed >= newHighs.size()) 
            setSecondHighs(); 
          } 
         }); 
       break; 

     } 
    } 
} 

metoda setSecondHighs

ten sposób albo wyświetla błąd lub nowe szeregi + słabo użytkownikowi

public void setSecondHighs() { 
    if(highsError) 
    // display an error to the user 
    else 
    // display ranks+score to user 
} 

Emisja jest to, że istnieje wiele połączeń API tutaj, a zgłoszenia są zawieszane w różnych punktach połączeń. Wiem, że musi być lepszy sposób na zrobienie tego. Każda pomoc będzie wielce ceniona.

Pozdrawiam!

+0

Wygląda na to, że wdrażasz znacznie więcej rzeczy o niskim poziomie, niż zwykle robię przy pracy z tabelami wyników. submitScore() jest ogniem i zapomnij zgodnie z dokumentami. Jeśli masz problem z używaniem tej formy interfejsu API, spójrz na submitScoreImmediate(). Zauważyłem, że pod maską, używając submitScore(), GoogleApiClient czasami przechowuje zapisy i przesyła je jako Scores.submitMultiple(). – JimENewtron

+0

wskaźnik sukcesu wynosi ~ 10% <- masz na myśli to, że możesz opublikować swój log.d i powiedzieć trochę więcej o tym, jak to, czego oczekujesz, porównuje z wynikami, które obserwujesz? – kpie

+0

Po zakończeniu debugowania wiele wywołań onResult zwraca zerowy obiekt LoadPlayerScoreResult, bez względu na moje połączenie internetowe. To nie jest za każdym razem. Czasem jest nieważny, czasami nie. Ten problem występuje zwykle w metodzie setHighs, ale czasami zdarza się, że jest to metoda handleLeaders – Brandacus

Odpowiedz

0

Miałem do czynienia z tym samym problemem podczas próby zwiększenia wyników w tabelach wyników, Google ograniczył liczbę żądań, które można wprowadzić w nieudokumentowanym okresie niepotwierdzonym. Zwykle przechodzą 3 kolejne żądania odzyskania danych w tabelach wyników, a reszta zwróci błędy związane z siecią. Więcej szczegółów dla innych użytkowników stojących przed tym samym problemem można obejrzeć tutaj: Android - Google play service : Leaderboard, limited number of requests