iOS SDK Game Center-Erfolge und Ranglisten - Teil 2

Willkommen zum zweiten und letzten Teil der Game Center Tutorial-Serie. In diesem Lernprogramm werden die in iTunes Teil 1 mit iTunesConnect erstellten Erfolge und Bestenlisten mit Objective-C und Xcode integriert.

Schritt 1: Erstellen der Schnittstelle

Bevor wir mit dem Interface Builder beginnen, müssen wir zunächst einige Outlets und Aktionen einrichten. Öffnen Game_CenterViewController.h und ändern Sie den Code wie folgt:

 #einführen  #einführen  #import "GameCenterManager.h" @class GameCenterManager; @Interface Game_CenterViewController: UIViewController  GameCenterManager * gameCenterManager; int64_t currentScore; NSString * currentLeaderBoard; IBOutlet UILabel * currentScoreLabel;  @ property (nonatomic, keep) GameCenterManager * gameCenterManager; @ property (nichtatomisch, zuweisen) int64_t currentScore; @ property (nonatomic, keep) NSString * currentLeaderBoard; @ property (nonatomic, keep) UILabel * currentScoreLabel; - (IBAction) zurücksetzen; - (IBAction) showLeaderboard; - (IBAction) showAchievements; - (IBAction) submitScore; - (IBAction) gainScore; - (nichtig) checkAchievements; @Ende

Zunächst importieren wir das GameKit-Framework und das GameCenterManager Klasse. Dann erklären wir das GameCenterManager Klasse, so dass wir eine Instanz dieser Klasse in der deklarieren können @Schnittstelle. Danach erklären wir die folgenden Delegierten:

    яя я
  • UIActionSheetDelegate (um ein Aktionsblatt zu verwenden)
  • GKLeaderboardViewControllerDelegate (um die Bestenliste in unserer App anzuzeigen)
  • GKAchievementViewControllerDelegate (um die Erfolge in unserer App anzuzeigen)
  • GameCenterManagerDelegate (um den GameCenterManager-Delegierten zu verwenden)

In dem @Schnittstelle Wir erklären einige Instanzen und erstellen dann einige Aktionen. Drücken Sie CMD + S, um das Projekt zu speichern.

Im? Game Center? Ordner im? Project Navigator? klicke auf Game_centerViewController.xib.

Wähle aus Aussicht Fenster und wählen Sie den Hintergrund, den Sie bevorzugen. Ich entschied mich für "Scroll View Textured Background Color". Ziehen Sie 5 runde Rechteckknöpfe von dem Bibliothek zum Aussicht. Benennen und ordnen Sie sie wie unten gezeigt. Ziehen Sie auch 2? Labels? von dem Bibliothek zum Aussicht. Nennen Sie den ersten? Current Score :? und löschen Sie den Text des zweiten Labels.

яя я

Wählen Sie den Besitzer der Datei aus. und öffnen Sie die Verbindungsinspektor.

яя я

Verbinden Sie die Aktionen mit den zugehörigen Schaltflächen, indem Sie sie auf die Schaltflächen ziehen, und wählen Sie "Touch Up Inside". aus dem menü.

яя я яя я

Ziehen Sie das? CurrentScoreLabel? Ausgang zum Etikett ohne Text und jetzt sind wir mit der Schnittstelle fertig.

Schritt 2: Bearbeiten Sie AppSpecificValues.h

Öffnen AppSpecificValues.h und ändern Sie den Code wie folgt:

 // Leaderboard Kategorie IDs #define kLeaderboardID @ "1" // Erfolgskennungen #define kAchievementOneTap @ "1_Tap" #define kAchievement20Taps @ "20_Taps"

Hier erstellen wir die Konstanten für unsere Bestenliste und unsere Leistungen. Wie Sie sehen, entsprechen die IDs denen, die wir in iTunes Connect erstellt haben.

Schritt 3: Bearbeiten Sie Game_CenterViewController.m

Zuerst werden wir unsere Instanzen synthetisieren und veröffentlichen. Wir importieren auch die? AppSpecificValues? und? GameCenterManager? Klassen. So offen Game_CenterViewController.m und ändern Sie den Code oben auf der Seite wie folgt:

 #import "Game_CenterViewController.h" #import "AppSpecificValues.h" #import "GameCenterManager.h" @implementation Game_CenterViewController @synthesize gameCenterManager; @synthesize currentScore; @synthesize currentLeaderBoard; @synthesize currentScoreLabel;

Ändern Sie nun die viewDidUnload und Dealloc Methoden wie folgt:

 - (void) viewDidUnload [super viewDidUnload]; // Alle freigegebenen Unteransichten der Hauptansicht freigeben. // z.B. self.myOutlet = null; self.gameCenterManager = nil; self.currentLeaderBoard = null; self.currentScoreLabel = nil;  - (void) dealloc [gameCenterManager-Version]; [aktuelleLeaderBoard-Version]; [currentScoreLabel-Version]; [Super Dealloc]; 

Schritt 4: Melden Sie sich bei Game Center an

Scrollen Sie nach unten zu "viewDidLoad". empfehle es und modifiziere den Code wie folgt:

 - (void) viewDidLoad [super viewDidLoad]; self.currentLeaderBoard = kLeaderboardID; self.currentScore = 0; if ([GameCenterManager istGameCenterAvailable]) self.gameCenterManager = [[[[GameCenterManager zuordnen] init] autorelease]; [self.gameCenterManager setDelegate: self]; [self.gameCenterManager authenticateLocalUser];  else // Das aktuelle Gerät unterstützt Game Center nicht. 

Zuerst setzen wir unser aktuelles Leaderboard auf unser Leaderboard, das wir in iTunes Connect erstellt haben. Danach setzen wir unser Currentscore auf 0. Ihr Highscore in Game Center wird nicht auf Null gesetzt, da er nur Scores übertrifft, die höher als der vorherige sind. Dann prüfen wir, ob Game Center auf dem Gerät verfügbar ist, auf dem die Anwendung ausgeführt wird. Wenn Game Center verfügbar ist, authentifizieren wir den lokalen Benutzer. Wenn Game Center nicht verfügbar ist, passiert nichts. Sie können dem Benutzer mit einem Alertview mitteilen, dass Game Center nicht verfügbar ist, aber ich lasse es mit einem Kommentar.

Jetzt können Sie Ihr Projekt testen. Drücken Sie CMD + R, um es zu erstellen und auszuführen. Sie erhalten einige Warnungen, aber die App wird ausgeführt. Wenn Sie bereits im Game Center angemeldet sind, erhalten Sie folgende Meldung: Willkommen zurück, Name des Game Centers. Wenn Sie nicht im Game Center angemeldet sind, erhalten Sie eine Warnmeldung mit den Optionen zum Erstellen eines neuen Kontos. Melden Sie sich bei einem vorhandenen Konto an oder stornieren Sie das Konto. Wenn Sie die Bestenliste abbrechen, funktionieren die Erfolge nicht, da Sie nicht im Game Center angemeldet sind. Die Schaltflächen funktionieren nicht, da wir die Aktionen in Xcode nicht ausgeführt haben.

яя я

Schritt 5: Anzeigen der Bestenlisten und Erfolge

Wenn Sie den Simulator verwendet haben, schließen Sie ihn und kehren Sie zu Xcode zurück. Fügen Sie den folgenden Code unter dem hinzu viewDidLoad Methode:

 - (IBAction) showLeaderboard GKLeaderboardViewController * leaderboardController = [[GKLeaderboardViewController-Zuordnung] init]; if (leaderboardController! = NULL) leaderboardController.category = self.currentLeaderBoard; leaderboardController.timeScope = GKLeaderboardTimeScopeWeek; leaderboardController.leaderboardDelegate = self; [self presentModalViewController: leaderboardController animiert: JA];  - (void) leaderboardViewControllerDidFinish: (GKLeaderboardViewController *) viewController [self disModalViewControllerAnimated: YES]; [viewController release];  - (IBAction) showAchievements GKAchievementViewController * Erfolge = [[GKAchievementViewController Alloc] init]; if (Erfolge! = NULL) Errungenschaften.achievementDelegate = Selbst; [self presentModalViewController: animierte Erfolge: JA];  - (void) achievementViewControllerDidFinish: (GKAchievementViewController *) viewController; [self dismissModalViewControllerAnimated: YES]; [viewController release]; 

Hier legen wir die Aktionen fest, um die Bestenliste und die Erfolge zu zeigen. Wir erstellen auch zwei Methoden, um zurückzugehen. Die erste Aktion besteht darin, die Bestenliste anzuzeigen. Wie Sie sehen, setzen wir den timeScope auf GKLeaderboardTimeScopeWeek. Dies bedeutet, dass der Leaderboard-Bereich auf "Diese Woche" eingestellt ist. Es gibt 3 Zeitbereiche und sie sind einfach:

    яя я
  • GKLeaderboardTimeScopeToday
  • GKLeaderboardTimeScopeWeek
  • GKLeaderboardTimeScopeAllTime

Wenn Sie erneut bauen und ausführen, wird die Liste anzeigen angezeigt. und? Erfolge zeigen? Tasten funktionieren. Jetzt können Sie die von uns erstellten Erfolge sowie die zugehörigen Beschreibungen und Punktwerte sehen. Wie Sie sehen können, ist der Leaderbord-Abschnitt "Diese Woche". Durch Ändern des Zeitbereichs in Xcode können Sie den Standardbereich auf "Alle Zeit" setzen. oder? Heute ?. Das Leaderboard sagt "No Scores", weil wir für diese Leaderboad keine Punktzahl eingereicht haben. Klicken Erledigt die Game Center-Ansicht zu schließen.

яя я

Schritt 6: Behandeln Sie das Ergebnis und die Erfolge

Fügen Sie den folgenden Code unter dem soeben erstellten Code hinzu:

 - (IBAction) riseScore self.currentScore = self.currentScore + 1; currentScoreLabel.text = [NSString stringWithFormat: @ "% ld", self.currentScore]; [Selbstprüfungserfolge]; 

Hier erstellen wir eine Aktion, um Ihren currentScore zu erhöhen. Wir aktualisieren auch unser Label auf den currentScore und nennen das checkAchievements Funktion, um zu sehen, ob wir eine Leistung erreicht haben.

 - (void) checkAchievements NSString * Bezeichner = NULL; double percentComplete = 0; switch (self.currentScore) Fall 1: Bezeichner = kAchievementOneTap; percentComplete = 100.0; brechen;  Fall 5: bezeichner = kAchievement20Taps; percentComplete = 25,0; brechen;  Fall 10: Bezeichner = kAchievement20Taps; percentComplete = 50,0; brechen;  Fall 15: Bezeichner = kAchievement20Taps; percentComplete = 75,0; brechen;  Fall 20: bezeichner = kAchievement20Taps; percentComplete = 100.0; brechen;  if (Bezeichner! = NULL) [self.gameCenterManager submitAchievement: bezeichner percentComplete: percentComplete]; 

In dieser Funktion suchen wir, ob wir mit einer switch-Anweisung eine Leistung erzielt haben.
Zuerst erstellen wir einen NSString und einen Double, um unsere Werte zu speichern. In der switch-Anweisung überprüfen wir, ob der Stromwert 1, 5, 10, 15 oder 20 ist. Nach der switch-Anweisung prüfen wir, ob in dem von uns erstellten NSString etwas gespeichert ist. Wenn in diesem NSString etwas gespeichert war, übermitteln wir die Errungenschaft. Wir reichen auch eine Leistung ein, wenn Sie sie teilweise abgeschlossen haben. Wenn Sie beispielsweise 10 Mal auf die Schaltfläche tippen, haben Sie 50% der? 20 Taps? Leistung.

Wir möchten auch einreichen oder hohe Punktzahl erzielen. Fügen Sie daher unter dem soeben erstellten Code die folgenden Aktionen hinzu:

 - (IBAction) submitScore if (self.currentScore> 0) [self.gameCenterManager reportScore: self.currentScore fürCategory: self.currentLeaderBoard]; 

Hier überprüfen wir, ob die Punktzahl höher als 0 ist, da keine Punktzahl von 0 übermittelt werden soll. Wir haben unseren aktuellen Wert für unser aktuelles Leaderboard eingereicht.

Erstellen Sie die Anwendung erneut, und führen Sie sie erneut aus. Jetzt können Sie Ihre Punktzahl erhöhen und abschicken. Wenn Sie 15 Mal auf die Schaltfläche klicken und "Erfolge anzeigen" wählen? Sie können sehen, dass Sie das erreicht haben? 1 Tap? und sind auf 75% der? 20 Taps? Leistung. Die Beschreibung des? 1 Tap? Die Leistung hat sich auch in dem Text geändert, den wir ihm gegeben haben, als er in iTunes Connect erworben wurde. Schließen Sie die Ansicht der Erfolge und klicken Sie auf "Submit Score", nach dem Klick auf "Leaderbaord anzeigen". Jetzt sehen Sie Ihre Punktzahl (wenn Ihr currentScore höher als 0 war).

яя я

Schritt 7: Setzen Sie den Score und die Erfolge zurück

dd folgenden Code unter dem soeben erstellten Code:

 - (IBAction) reset UIActionSheet * actionSheet = [[UIActionSheet-Zuordnung] initWithTitle: @ "Sind Sie sicher, dass Sie Ihre Punktzahl und Ihre Erfolge zurücksetzen möchten?" Delegate: self cancelButtonTitle: @ "Cancel" destructiveButtonTitle: @ "Reset" otherButtonTitles: nil]; [actionSheet showInView: [Selbstansicht]]; [actionSheet release]; 

Hier haben wir ein Aktionsblatt in der Reset-Aktion erstellt. Wir setzen den Delegierten auf? Selbst? weil wir etwas tun wollen, wenn Sie auf "Reset" geklickt haben? Taste.

Unter dem? Reset? Aktion fügen Sie den folgenden Code hinzu:

 - (void) actionSheet: (UIActionSheet *) actionSheet clickedButtonAtIndex: (NSInteger) buttonIndex if (buttonIndex == 0) [gameCenterManager resetAchievements]; self.currentScore = 0; currentScoreLabel.text = [NSString stringWithFormat: @ "% ld", self.currentScore]; 

In diesem Code sehen wir, auf welche Schaltfläche Sie geklickt haben. Sie können das nicht bearbeiten? Abbrechen? so beginnen wir bei einem buttonIndex von 0. Wenn Sie auf die Schaltfläche? Reset? Durch Klicken auf die Schaltfläche im Aktionsblatt setzt der gameCenterManager Ihre Erfolge zurück, der currentScore wird auf 0 gesetzt und wir aktualisieren den currentScoreLabel-Text.

Schritt 8: Benachrichtigen Sie den Benutzer über den erzielten Erfolg

Fügen Sie den folgenden Code unter dem soeben erstellten Code hinzu:

 - (void) achievementSubmitted: (GKAchievement *) ach error: (NSError *) error; if ((error == NULL) && (ach! = NULL)) if (ach.percentComplete == 100.0) UIAlertView * alert = [[UIAlertView zuweisen] initWithTitle: @ "Erfolg erreicht!" message: (@ "% @", ach.identifier) ​​Delegat: nil cancelButtonTitle: @ "OK" otherButtonTitles: nil]; [Alertshow]; [Alarme freigeben];  else // Erreichung der Erreichung fehlgeschlagen. 

Zuerst prüfen wir, ob kein Fehler aufgetreten ist und ob etwas in "ach" gespeichert ist. Wenn beide zutreffen, prüfen wir, ob ach.presentComplete 100.0 ist, weil wir dem Benutzer nur eine Nachricht senden möchten, wenn er eine Leistung verdient hat und nicht, wenn er 50% einer Leistung erreicht hat.
Wenn dies wahr ist, zeigen wir dem Benutzer, dass er eine Leistung mit einer Warnmeldungsansicht erzielt hat. Wir setzen Delegate auf null dieser Warnmeldungsansicht, da wir ihn nicht benötigen, sondern nur die Schaltfläche "Abbrechen" verwenden.

Wenn ein Fehler aufgetreten ist oder nichts in ach gespeichert ist, können Sie dem Benutzer eine Nachricht senden, dass die Leistungsübergabe fehlgeschlagen ist, aber ich lasse es mit einem Kommentar.

Erstellen und ausführen, um das Lernprogramm zu beenden. Um zu überprüfen, ob die Schaltfläche "Zurücksetzen" und die Warnmeldungsansicht funktionieren, klicken Sie auf "Erfolge und Ergebnisse zurücksetzen". Taste. Erhöhen Sie dann die Punktzahl und eine Warnmeldung sollte angezeigt werden.

яя я

Wenn Sie beide Erfolge erzielt haben und die App und das Löschen der Multitask-Leiste schließen, wird der currentScore wieder auf 0 gesetzt, da dieser Wert nicht gespeichert wurde. Wenn Sie die Punktzahl erhöhen, glauben Apps, dass Sie das? 1 Tippen? Leistung wieder, aber Sie haben es bereits verdient. Wenn Sie dies ausführen möchten, können Sie den aktuellen Wert speichern.

Vielen Dank, dass Sie dieses Tutorial über Game Center gelesen haben. Wenn Sie Fragen oder Kommentare zu diesem Tutorial haben, lassen Sie sie in den Kommentaren weiter unten oder senden Sie mir eine E-Mail an [email protected]