मैं ऐसे गेम पर काम कर रहा हूं जहां एक गतिविधि में लीडरबोर्ड पर स्कोर सबमिट किए जाते हैं और नए उच्च स्कोर एक टुकड़े में रैंक के साथ प्रदर्शित होते हैं। मेरे पास कुछ (कुछ हद तक) कार्यात्मक है, लेकिन सफलता दर ~ 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
}
उपयोगकर्ता मुद्दे पर नई रैंकों + स्कोर यह है कि यहां बहुत सारे एपीआई कॉल हैं, और कॉल में विभिन्न बिंदुओं पर सबमिशन लटक रहे हैं। मुझे पता है कि ऐसा करने के लिए एक बेहतर तरीका होना चाहिए। किसी भी तरह की सहायता का स्वागत किया जाएगा।
चीयर्स!
ऐसा लगता है कि आप लीडरबोर्ड के साथ काम करते समय आमतौर पर बहुत अधिक निम्न स्तर की सामग्री को कार्यान्वित कर रहे हैं। submitScore() आग है और दस्तावेज़ों के अनुसार भूल जाओ। अगर आपको एपीआई के इस फॉर्म का उपयोग करने में कोई समस्या है, तो submitScoreImmediate() पर एक नज़र डालें। मैंने देखा है कि हुड के तहत, submitScore() का उपयोग करके, GoogleApiClient कभी-कभी सबमिशन को कैश करता है और उन्हें Scores.submitMultiple() के रूप में सबमिट करता है। – JimENewtron
सफलता दर ~ 10% है <- क्या आपका मतलब है कि आप अपना log.d पोस्ट कर सकते हैं और आप किस चीज की अपेक्षा कर रहे हैं इसके बारे में थोड़ा और कह सकते हैं कि आप किस नतीजे देखते हैं? – kpie
अधिक डिबगिंग के बाद, ऑनरसेट कॉल में से कई ने मेरे इंटरनेट कनेक्शन से कोई फर्क नहीं पड़ता लोड लोडर सॉकर रेसल्ट ऑब्जेक्ट लौटा दिया। यह हर बार नहीं है। कभी-कभी यह शून्य है, कभी-कभी यह नहीं होता है। यह समस्या आमतौर पर setHighs विधि में होती है, लेकिन कभी-कभी हैंडल लेडर विधि होती है – Brandacus