2014-02-05 6 views
6

Wie bekomme ich den Punktestand eines lokalen Spielers vom Leaderboard Game Center? Ich habe diesen Code ausprobiert, aber er gibt nichts zurück. Jeder weiß, wie man es löst, oder gibt es einen besseren Weg, um Punkte zu bekommen?Wie bekomme ich den lokalen Spielerstand vom Game Center?

- (NSString*) getScore: (NSString*) leaderboardID 
{ 
    __block NSString *score; 
    GKLeaderboard *leaderboardRequest = [[GKLeaderboard alloc] init]; 
    if (leaderboardRequest != nil) 
    { 
     leaderboardRequest.identifier = leaderboardID; 

     [leaderboardRequest loadScoresWithCompletionHandler: ^(NSArray *scores, NSError *error) { 
      if (error != nil) 
      { 
       NSLog(@"%@", [error localizedDescription]); 
      } 
      if (scores != nil) 
      { 
       int64_t scoreInt = leaderboardRequest.localPlayerScore.value; 
       score = [NSString stringWithFormat:@"%lld", scoreInt]; 
      } 
     }]; 
    } 
    return score; 
} 

Ich denke, dass Verfahren haben für den Abschluss der [leaderboardRequest loadScoresWithCompletionHandler warten: ...

Ist es möglich?

+0

Verwenden Sie ein Protokoll, um den lokalen Player-Score zu übermitteln. :-) –

Antwort

5

Ihr Code scheint keine Fehler zu haben, die ich sehen kann. Ich würde empfehlen, die Standard-Leaderboard-Oberfläche anzuzeigen, um zu sehen, ob Ihr Code, der die Scores berichtet, tatsächlich korrekt funktioniert. Wenn dies der Fall ist, sollten Sie die Punktzahlen in der Bestenliste sehen. Der unten stehende Code funktioniert in meinem Spiel und ich weiß, dass die Punktzahlberichterstattung ordnungsgemäß funktioniert, da sie in der Standardbenutzeroberfläche des Spielecenters angezeigt wird.

GKLeaderboard *leaderboardRequest = [[GKLeaderboard alloc] init]; 
leaderboardRequest.identifier = kLeaderboardCoinsEarnedID; 
[leaderboardRequest loadScoresWithCompletionHandler:^(NSArray *scores, NSError *error) { 
    if (error) { 
     NSLog(@"%@", error); 
    } else if (scores) { 
    GKScore *localPlayerScore = leaderboardRequest.localPlayerScore; 
    CCLOG(@"Local player's score: %lld", localPlayerScore.value); 
    } 
}]; 

Wenn Sie nicht sicher sind, wie der Code unten sollte die Standardrangliste (iOS7) zu zeigen, arbeiten:

GKGameCenterViewController *gameCenterVC = [[GKGameCenterViewController alloc] init]; 
gameCenterVC.viewState = GKGameCenterViewControllerStateLeaderboards; 
gameCenterVC.gameCenterDelegate = self; 
[self presentViewController:gameCenterVC animated:YES completion:^{ 
     // Code 
}]; 
3

Sie können keine Punktzahl außerhalb des Blocks zurück. In diesem Code wird zuerst "return score" vor der Methode "loadScoresWithCompletionHandler" ausgeführt. Außerdem haben Sie keinen Anfangswert für "score" gesetzt, diese Methode liefert einen völlig zufälligen Wert zurück. Ich schlage vor, Sie entsprechenden Code innerhalb des Blocks zu setzen, statt:

int64_t scoreInt = leaderboardRequest.localPlayerScore.value; 
score = [NSString stringWithFormat:@"%lld", scoreInt];
1

Die Rangliste Anfrage abgeschlossen ist nach der Rückkehr Ihrer Methode. Dies bedeutet, dass Sie eine leere Zeichenfolge zurückgeben.

Die Methode, in die Sie die Leaderboard-Anforderung einfügen, sollte ausschließlich zum Senden der Anforderung dienen. Die Methode wird beendet, bevor die Leaderboard-Anfrage abgeschlossen ist. "Score = [NSString stringWithFormat: @"% lld ", scoreInt];" Zeile wird nach der Rückkehr der "Punktzahl" ausgeführt, die Null ist, bis diese Zeile ausgeführt wird.

Die Lösung besteht darin, das Ergebnis des Beendigungshandlers nicht mit der Methode zurückzugeben, die die Anforderung sendet. Die Punktzahl wird definitiv korrekt abgerufen, also machen Sie einfach alles, was Sie benötigen, mit dem Ergebnis im Completion-Handler. Sie haben keine Möglichkeit zu wissen, wann der Beendigungshandler ausgeführt wird. Dies ist in der Tat der Grund, warum Apple Ihnen erlaubt, den Code in einem Block zu speichern! Es kann jedoch verwirrend sein zu verstehen, wie mit Blöcken gearbeitet wird, die definitiv später oder in Ihrer Situation ausgeführt werden, sobald die Methode zurückkehrt.

Der beste Weg, um Ihre Situation zu behandeln ist, nichts in dieser Methode zurückgeben und nur die "Score" -Variable verwenden, wie Sie beabsichtigen, nachdem der Block Score auf einen Wert ungleich null gesetzt hat!