2016-05-03 14 views
7

Skorların bir etkinlikte skor tablolarına gönderildiği ve yeni yüksek puanların bir parçadaki sıralarıyla gösterildiği bir oyun üzerinde çalışıyorum. Bir şey (biraz) işlevsel var, ama başarı oranı ~% 10.Google Play Oyunlar sonuç tablolarına puan gönderme ve yeni rütler gösterme

yöntem handleLeaders

bu yöntem, her skor için geçerli puanları alır ve yeni puan daha iyi olup olmadığını, bu sunulan ve yeni newHigh nesne aşağıdaki şekilde yapılmaktadır:

akışı skorla oluşturulur ve bir ArrayList'e eklenir. Skor tablolarının 3'ü ele alındıktan sonra, setHighs yöntemi çağrılır.

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(); 

         } 
        }); 
     } 
} 

Yöntem setHighs

Bu yöntem, her biri karşılık gelen newHigh saflarına alır ve nesne içinde yeni rank saklar (hatalar afiş her bir davet için kontrol edilir). Tüm sıralar toplandıktan sonra setSecondHighs yöntemi çağrılır.

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; 

     } 
    } 
} 

Yöntem setSecondHighs

Bu yöntem, (Hatalar skor her aramaları olarak kontrol edilir), ya bir hata görüntüler ya da yeni sıralarında kullanmayan

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

sorun skor Burada çok sayıda API çağrısı var ve gönderimler çağrılarda farklı noktalarda asılı. Bunu yapmanın daha iyi bir yolu olmalı biliyorum. Herhangi bir yardım büyük takdir edilecektir.

Şerefe!

+0

Genelde, büyük afişlerle çalışırken yaptığımdan çok daha düşük düzeyde bir şeyler uyguladığınız görülüyor. submitScore() itfaiyecilere göre ateş ve unutur. API'nin bu formunu kullanmayla ilgili bir sorununuz varsa, submitScoreImmediate() 'ye bir göz atın. Ben kapağın altında, submitScore() kullanarak GoogleApiClient'in bazen gönderimleri önbelleğe aldığını ve bunları Scores.submitMultiple() olarak gönderdiğinin farkına vardım. – JimENewtron

+0

başarı oranı ~% 10 <- log.d'inizi kaydedebilir ve gözlemlediğiniz sonuçları karşılaştırmak için ne beklediğiniz hakkında biraz daha fazlasını söyleyebilir misiniz? – kpie

+0

Daha fazla hata ayıklama işleminden sonra, onResult çağrılarının çoğu, Internet bağlantımdan bağımsız olarak boş bir LoadPlayerScoreResult nesnesi döndürür. Her seferinde de değil. Bazen null, bazen değil. Bu sorun genellikle setHighs yönteminde oluşur, ancak bazen handleLeaders yöntemi olur – Brandacus

cevap

0

Lider tablosu puanlarını artırmaya çalışırken, aynı sorunla karşı karşıya kaldım. Google, belgesiz/onaylanmayan bir süre içinde yapabileceğiniz isteklerin sayısına bir sınır koydu. Genellikle, leaderboard verilerini almak için 3 ardışık istek geçecek ve geri kalanı ağla ilgili hataları döndürecektir. Aynı sorunla karşılaşan diğer kullanıcılar için daha fazla ayrıntı şu adresten görüntülenebilir: Android - Google play service : Leaderboard, limited number of requests

İlgili konular