2016-05-03 9 views
7

मैं ऐसे गेम पर काम कर रहा हूं जहां एक गतिविधि में लीडरबोर्ड पर स्कोर सबमिट किए जाते हैं और नए उच्च स्कोर एक टुकड़े में रैंक के साथ प्रदर्शित होते हैं। मेरे पास कुछ (कुछ हद तक) कार्यात्मक है, लेकिन सफलता दर ~ 10% है।Google Play गेम्स लीडरबोर्ड पर स्कोर सबमिट करना और नए रैंक प्रदर्शित करना

विधि handleLeaders

इस विधि प्रत्येक लीडरबोर्ड के लिए वर्तमान स्कोर हो जाता है, और अगर नई स्कोर बेहतर है, यह प्रस्तुत की है और एक नया newHigh वस्तु है:

प्रवाह इस प्रकार है स्कोर के साथ बनाया गया है और एक ArrayList में जोड़ा गया है। लीडरबोर्ड के सभी 3ों को संभालने के बाद, विधि सेट हाइज कहा जाता है। (त्रुटियां लीडरबोर्ड कॉल में से प्रत्येक में जांच की जाती है)

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

         } 
        }); 
     } 
} 

विधि setHighs

इस विधि प्रत्येक इसी newHigh की श्रेणी में हो जाता है और वस्तु के अंदर नए पद संग्रहीत करता है। सभी रैंक इकट्ठा होने के बाद, विधि सेट सेकेंड हाइग्स कहा जाता है। (त्रुटियां में लीडरबोर्ड के प्रत्येक कॉल के लिए जाँच कर रहे हैं)

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; 

     } 
    } 
} 

विधि setSecondHighs

इस विधि या तो एक त्रुटि प्रदर्शित करता है या

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

उपयोगकर्ता मुद्दे पर नई रैंकों + स्कोर यह है कि यहां बहुत सारे एपीआई कॉल हैं, और कॉल में विभिन्न बिंदुओं पर सबमिशन लटक रहे हैं। मुझे पता है कि ऐसा करने के लिए एक बेहतर तरीका होना चाहिए। किसी भी तरह की सहायता का स्वागत किया जाएगा।

चीयर्स!

+0

ऐसा लगता है कि आप लीडरबोर्ड के साथ काम करते समय आमतौर पर बहुत अधिक निम्न स्तर की सामग्री को कार्यान्वित कर रहे हैं। submitScore() आग है और दस्तावेज़ों के अनुसार भूल जाओ। अगर आपको एपीआई के इस फॉर्म का उपयोग करने में कोई समस्या है, तो submitScoreImmediate() पर एक नज़र डालें। मैंने देखा है कि हुड के तहत, submitScore() का उपयोग करके, GoogleApiClient कभी-कभी सबमिशन को कैश करता है और उन्हें Scores.submitMultiple() के रूप में सबमिट करता है। – JimENewtron

+0

सफलता दर ~ 10% है <- क्या आपका मतलब है कि आप अपना log.d पोस्ट कर सकते हैं और आप किस चीज की अपेक्षा कर रहे हैं इसके बारे में थोड़ा और कह सकते हैं कि आप किस नतीजे देखते हैं? – kpie

+0

अधिक डिबगिंग के बाद, ऑनरसेट कॉल में से कई ने मेरे इंटरनेट कनेक्शन से कोई फर्क नहीं पड़ता लोड लोडर सॉकर रेसल्ट ऑब्जेक्ट लौटा दिया। यह हर बार नहीं है। कभी-कभी यह शून्य है, कभी-कभी यह नहीं होता है। यह समस्या आमतौर पर setHighs विधि में होती है, लेकिन कभी-कभी हैंडल लेडर विधि होती है – Brandacus

उत्तर

0

लीडरबोर्ड स्कोर बढ़ाने की कोशिश करते समय मुझे एक ही समस्या का सामना करना पड़ रहा था, Google ने अनियंत्रित/पुष्टि की गई अवधि अवधि में आपके द्वारा किए जा सकने वाले अनुरोधों की संख्या पर सीमा डाली है। लीडरबोर्ड डेटा को पुनः प्राप्त करने के लिए आमतौर पर 3 लगातार अनुरोध किए जाएंगे और शेष नेटवर्क से संबंधित त्रुटियों को वापस कर देंगे। एक ही मुद्दे का सामना करने वाले अन्य उपयोगकर्ताओं के लिए अधिक जानकारी यहां देखी जा सकती है: Android - Google play service : Leaderboard, limited number of requests

संबंधित मुद्दे