2016-05-03 23 views
7

Tôi đang làm việc trên trò chơi có điểm số được gửi tới bảng xếp hạng trong một hoạt động và điểm cao mới được hiển thị với xếp hạng trong một đoạn. Tôi có một cái gì đó (phần nào) chức năng, nhưng tỷ lệ thành công là ~ 10%.Gửi điểm số cho bảng xếp hạng Google Play Trò chơi và hiển thị xếp hạng mới

Dòng chảy như sau:

Phương pháp handleLeaders

Phương pháp này được điểm số hiện tại cho mỗi bảng dẫn, và nếu số điểm mới là tốt hơn, nó được gửi và một đối tượng newHigh mới được tạo với điểm số và được thêm vào một ArrayList. Sau khi tất cả 3 bảng xếp hạng được xử lý, phương thức setHighs được gọi. (Lỗi được kiểm tra trong mỗi cuộc gọi bảng dẫn)

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

         } 
        }); 
     } 
} 

Phương pháp setHighs

Phương pháp này được các cấp bậc của mỗi newHigh tương ứng và lưu trữ các cấp bậc mới bên trong đối tượng. Sau khi tất cả các thứ hạng được thu thập, phương thức setSecondHighs được gọi. (Lỗi được kiểm tra trong mỗi của bảng xếp hạng gọi)

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; 

     } 
    } 
} 

Phương pháp setSecondHighs

Phương pháp này hoặc hiển thị một lỗi hoặc cấp bậc mới + điểm cho người dùng

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

Vấn đề này là có rất nhiều cuộc gọi API ở đây và các nội dung gửi được treo ở các điểm khác nhau trong các cuộc gọi. Tôi biết phải có cách tốt hơn để làm điều này. Mọi sự trợ giúp sẽ rất được trân trọng.

Chúc mừng!

+0

Có vẻ như bạn đang triển khai nhiều nội dung cấp thấp hơn tôi thường làm khi làm việc với bảng xếp hạng. submitScore() là lửa và quên theo tài liệu. Nếu bạn gặp sự cố khi sử dụng biểu mẫu API này, hãy xem submitScoreImmediate(). Tôi đã nhận thấy rằng dưới mui xe, bằng cách sử dụng submitScore(), GoogleApiClient đôi khi lưu trữ các đệ trình và gửi chúng dưới dạng Scores.submitMultiple(). – JimENewtron

+0

tỷ lệ thành công là ~ 10% <- bạn có nghĩa là bạn có thể đăng log.d của mình và nói thêm một chút về cách bạn mong đợi so sánh với kết quả bạn quan sát không? – kpie

+0

Sau khi gỡ lỗi nhiều hơn, nhiều cuộc gọi onResult trả về một đối tượng LoadPlayerScoreResult rỗng bất kể kết nối Internet của tôi là gì. Nó không phải là một thời gian. Đôi khi nó là null, đôi khi nó không phải. Vấn đề này thường xảy ra trong phương thức setHighs, nhưng đôi khi xảy ra phương thức handleLeaders – Brandacus

Trả lời

0

Tôi đang đối mặt với cùng một vấn đề khi cố gắng tăng điểm số bảng thành tích, Google đã đặt giới hạn về số lượng yêu cầu bạn có thể thực hiện trong khoảng thời gian chưa được xác nhận/chưa được xác nhận. Thông thường, 3 yêu cầu liên tiếp để truy xuất dữ liệu bảng thành tích sẽ đi qua và phần còn lại sẽ trả lại lỗi liên quan đến mạng. Bạn có thể xem thêm chi tiết về những người dùng khác gặp phải vấn đề tương tự tại đây: Android - Google play service : Leaderboard, limited number of requests

Các vấn đề liên quan