iOS SDK Spelcenter Prestationer och styrkort - Del 2

Välkommen till den andra och sista delen av Game Center Tutorial Series. I denna handledning integrerar vi de prestationer och leaderboards som skapats med iTunesConnect under del 1 med Objective-C och Xcode.

Steg 1: Bygg gränssnittet

Innan vi börjar med gränssnittsbyggare ställer vi först in för att installera vissa uttag och åtgärder. Öppna Game_CenterViewController.h och ändra koden för att läsa enligt följande:

 #importera  #importera  #import "GameCenterManager.h" @class GameCenterManager; @interface Game_CenterViewController: UIViewController  GameCenterManager * gameCenterManager; int64_t currentScore; NSString * currentLeaderBoard; IBOutlet UILabel * currentScoreLabel;  @property (nonatomic, behåll) GameCenterManager * gameCenterManager; @property (nonatomic, assign) int64_t currentScore; @property (nonatomic, behåll) NSString * currentLeaderBoard; @property (nonatomic, behåll) UILabel * currentScoreLabel; - (IBAction) Återställ; - (IBAction) showLeaderboard; - (IBAction) showFöreställningar; - (IBAction) submitScore; - (IBAction) increaseScore; - (void) checkAvesteringar; @slutet

Först importerar vi GameKit-ramverket och GameCenterManager klass. Då deklarerar vi GameCenterManager klass, så vi kan förklara en förekomst av den klassen i @gränssnitt. Därefter förklarar vi följande delegater:

    яя я
  • UIActionSheetDelegate (för att använda ett handlingsblad)
  • GKLeaderboardViewControllerDelegate (för att visa leaderboard i vår app)
  • GKAchievementViewControllerDelegate (för att visa resultat i vår app)
  • GameCenterManagerDelegate (för att använda GameCenterManager-delegat)

I @gränssnitt Vi förklarar några fall och därefter skapar vi några åtgärder. Tryck på CMD + S för att spara projektet.

I? Game Center? mapp i "Project Navigator"? Klicka på Game_centerViewController.xib.

Välj Se fönstret och välj den bakgrund du föredrar. Jag valde? Bläddra Visa texturerad bakgrundsfärg ?. Dra 5? Runda Rect Knappar? från Bibliotek till se. Namn och ordna dem enligt nedan. Dra också 2? Etiketter? från Bibliotek till se. Namn den första? Nuvarande poäng :? och ta bort texten på den andra etiketten.

яя я

Välj? Filens ägare? och öppna Anslutningsinspektör.

яя я

Anslut åtgärderna till de tillhörande knapparna genom att dra dem till knapparna och välj? Rör uppåt inuti? från menyn.

яя я яя я

Dra? CurrentScoreLabel? utlopp till etiketten utan text och nu är vi färdiga med gränssnittet.

Steg 2: Redigera AppSpecificValues.h

Öppna AppSpecificValues.h och ändra koden för att läsa enligt följande:

 // Leaderboard Kategori ID #define kLeaderboardID @ "1" // Achievement IDs #define kAchievementOneTap @ "1_Tap" #define kAchievement20Taps @ "20_Taps"

Här skapar vi konstanterna för vår leaderboard och våra prestationer. Som du kan se är ID: erna samma som de vi skapade i iTunes Connect.

Steg 3: Redigera Game_CenterViewController.m

Först ska vi syntetisera våra instanser och släppa dem. Vi importerar också? AppSpecificValues? och? GameCenterManager? klasser. Så öppet Game_CenterViewController.m och ändra koden längst upp på sidan enligt följande:

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

Ändra nu viewDidUnload och dealloc metoder enligt följande:

 - (void) viewDidUnload [super viewDidUnload]; // Släpp alla behållna undervyer av huvudvyn. // t.ex. self.myOutlet = nil; self.gameCenterManager = nil; self.currentLeaderBoard = nil; self.currentScoreLabel = nil;  - (void) dealloc [gameCenterManager release]; [currentLeaderBoard release]; [currentScoreLabel release]; [super dealloc]; 

Steg 4: Logga in på Game Center

Bläddra ner till? ViewDidLoad? metod, rekommendera det och modifiera koden enligt följande:

 - (void) viewDidLoad [super viewDidLoad]; self.currentLeaderBoard = kLeaderboardID; self.currentScore = 0; om ([GameCenterManager isGameCenterAvailable]) self.gameCenterManager = [[[GameCenterManager alloc] init] autorelease]; [self.gameCenterManager setDelegate: self]; [self.gameCenterManager authenticateLocalUser];  else // Den aktuella enheten stöder inte Game Center. 

Först satte vi vårt nuvarandeLaderboard till vår ledareBord vi skapade i iTunes Connect. Därefter sätter vi våra strömmar till 0. Din högsta poäng i Game Center kommer inte att ställas in till noll, eftersom den bara skickar poäng högre än den föregående. Sedan ser vi om Game Center är tillgängligt på enheten som programmet körs. Om Game Center är tillgängligt godkänner vi den lokala användaren. Om Game Center inte är tillgängligt, händer ingenting. Du kan berätta för användaren att Game Center inte är tillgängligt med en alertview, men jag lämnar den med en kommentar.

Nu kan du testa ditt projekt. Tryck på CMD + R för att bygga och köra den. Du kommer att få några varningar, men appen kommer att springa. Om du redan är inloggad i Game Center får du följande meddelande: Välkommen Tillbaka,? Game Center Name ?. Om du inte är inloggad i Game Center får du en varningsvy med alternativen för att skapa ett nytt konto, logga in på ett befintligt konto eller avbryt. Om du avbryter ledningslistan och prestationer inte fungerar, eftersom du inte är inloggad på Game Center. Knapparna fungerar inte, eftersom vi inte har gjort åtgärderna i Xcode.

яя я

Steg 5: Visar leaderboards och prestationer

Om du använde simulatorn, stäng den och gå tillbaka till Xcode. Lägg till följande kod under viewDidLoad metod:

 - (IBAction) showLeaderboard GKLeaderboardViewController * leaderboardController = [[GKLeaderboardViewController alloc] init]; om (leaderboardController! = NULL) leaderboardController.category = self.currentLeaderBoard; leaderboardController.timeScope = GKLeaderboardTimeScopeWeek; leaderboardController.leaderboardDelegate = self; [self presentModalViewController: leaderboardController animated: YES];  - (void) leaderboardViewControllerDidFinish: (GKLeaderboardViewController *) viewController [self dismissModalViewControllerAnimated: YES]; [viewController release];  - (IBAction) showAvements GKAchievementViewController * prestationer = [[GKAchievementViewController alloc] init]; om (prestationer! = NULL) achievements.achievementDelegate = self; [self presentModalViewController: prestationer animerade: JA];  - (void) achievementViewControllerDidFinish: (GKAchievementViewController *) viewController; [self dismissModalViewControllerAnimated: YES]; [viewController release]; 

Här skapar vi åtgärderna för att visa topplistan och prestationerna. Vi skapar också 2 metoder för att gå tillbaka. De första åtgärderna är att visa topplistan. Som du kan se ställer vi in ​​TimeScope till GKLeaderboardTimeScopeWeek. Det betyder att leaderboardsektionen är inställd på? Denna vecka ?. Det finns 3 tidsomfång och de är raka framåt:

    яя я
  • GKLeaderboardTimeScopeToday
  • GKLeaderboardTimeScopeWeek
  • GKLeaderboardTimeScopeAllTime

Om du bygger och kör igen, visas? Leaderboard? och? Visa prestationer? knappar kommer att fungera. Nu kan du se de prestationer vi har skapat och de associerande beskrivningarna och poängvärdena. Som du kan se är leaderbord-sektionen? Denna vecka ?. Genom att ändra Time Scope i Xcode kan du ställa in standardavsnittet till? All Time? eller? Idag ?. Ledningsgruppen säger? Inga poäng?, För att vi aldrig skickat in en poäng för den här ledarbåten. Klick Gjort att avvisa Game Center-vyn.

яя я

Steg 6: Hantera poängen och prestationerna

Lägg till följande kod enligt koden som vi just skapat:

 - (IBAction) increaseScore self.currentScore = self.currentScore + 1; currentScoreLabel.text = [NSString stringWithFormat: @ "% ld", self.currentScore]; [self checkAchievements]; 

Här skapar vi en åtgärd för att öka din nuvarandeScore. Vi uppdaterar också vår etikett till nuvarandeScore och ringer till checkAchievements funktion för att se om vi uppnådde en prestation.

 - (void) checkAvements NSString * identifier = NULL; dubbel procentComplete = 0; switch (self.currentScore) fall 1: identifier = kAchievementOneTap; percentComplete = 100.0; ha sönder;  fall 5: identifier = kAchievement20Taps; percentComplete = 25.0; ha sönder;  fall 10: identifier = kAchievement20Taps; percentComplete = 50.0; ha sönder;  fall 15: identifier = kAchievement20Taps; percentComplete = 75,0; ha sönder;  fall 20: identifier = kAchievement20Taps; percentComplete = 100.0; ha sönder;  om (identifierare! = NULL) [self.gameCenterManager submitAchievement: identifierings procentComplete: percentComplete]; 

I den här funktionen ser vi om vi uppnådde en prestation med ett omkopplingsutlåtande.
Först skapar vi en NSString och en dubbel för att lagra våra värden. I omkopplingsdeklarationen kontrollerar vi om strömkursen är 1, 5, 10, 15 eller 20. Efter omkopplingsdeklarationen ser vi om det finns något lagrat i NSString som vi skapade. Om det fanns något lagrat till den NSString skickar vi prestationen. Vi skickar även in en prestation om du delvis genomfört det. Till exempel, om du knackade på knappen 10 gånger åt du på 50% av 20 kranarna? prestation.

Vi vill också skicka in eller höga poäng, så lägg till följande åtgärder enligt koden som vi just skapat:

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

Här kontrollerar vi om poängen är högre än 0, eftersom vi inte vill ha en poäng på 0 som ska lämnas in. Vi skickade in vår nuvarandeScore för vår nuvarandeLaderboard.

Bygg och kör programmet igen och nu kan du öka din poäng och skicka in den. Om du klickar på knappen 15 gånger och går till Visa prestationer? du kan se att du uppnått? 1 Tryck? och är på 75% av de 20 kranarna? prestation. Beskrivningen av? 1-knappen? Prestationen har också förändrats i texten vi gav den när den i iTunes Connect för när den var förtjänad. Stäng prestationsvyn och klicka på? Skicka in poäng ?, Efter det klicka? Visa Leaderbaord ?. Nu ser du din poäng (om din nuvarandeScore var högre än 0).

яя я

Steg 7: Återställ poäng och prestationer

dd följande kod enligt koden vi just skapat:

 - (IBAction) reset UIActionSheet * actionSheet = [[UIActionSheet alloc] initWithTitle: @ "Är du säker på att du vill återställa dina poäng och prestationer?" delegera: self cancelButtonTitle: @ "Cancel" destructiveButtonTitle: @ "Återställ" otherButtonTitles: nil]; [actionSheet showInView: [self view]]; [actionSheet release]; 

Här skapade vi ett handlingsblad i återställningsåtgärden. Vi ställer delegaten till? Själv? för att vi vill göra något om du klickade på? reset? knapp.

Under "Reset" åtgärd lägg till följande kod:

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

I denna kod ser vi häxknappen du klickade på. Du kan inte redigera? Avbryt? knappen så vi börjar med en knappIndex av 0. Om du klickade på? Reset? knappen i handlingsbladet, spelCenterManager återställer dina prestationer, nuvarandeScore är satt till 0 och vi uppdaterar nuvarandeScoreLabel-texten.

Steg 8: Meddela användaren av uppnådd prestation

Lägg till följande kod enligt koden som vi just skapat:

 - (void) achievementSubmitted: (GKAchievement *) ach error: (NSError *) fel; if ((error == NULL) && (ach! = NULL)) if (ach.percentComplete == 100.0) UIAlertView * alert = [[UIAlertView-tilldelning] initWithTitle: @ "Prestation uppnådd!" meddelande: (@ "% @", ach.identifier) ​​delegera: noll cancelButtonTitle: @ "OK" otherButtonTitles: nil]; [alert show]; [alert release];  else // Prestationsinsändning misslyckades. 

Först kontrollerar vi om det inte fanns ett fel och om det finns något lagrat i? Ach ?. Om detta är både sant, så kontrollerar vi om ach.presentComplete är 100,0, för att vi bara vill ge användaren ett meddelande om han tjänat en prestation och inte om han är på 50% av en prestation.
Om det är sant visar vi användaren att han tjänat en prestation med en varningsvy. Vi ställer in delegat till noll i den här varningsvisningen, eftersom vi inte behöver det, använder vi bara Avbryt-knappen.

Om det uppstod ett fel eller det inte fanns något lagrat i ach kan du ge användaren ett meddelande om att inlämningen inte lyckats, men jag lämnar den med en kommentar.

Bygg och kör för att slutföra handledningen. För att kontrollera om återställningsknappen och varningsvisningen fungerar, klicka på? Återställ prestationer och poäng? knapp. Öka sedan poängen och en varningsvy ska visa.

яя я

Om du har tjänat båda prestationerna och stänger appen och raderar om från multitaskfältet, är nuvarandeScore inställt på 0 igen, eftersom vi inte lagrade det värdet. Om du ökar poängen eller tror apps att du har tjänat? 1 Tryck? prestation igen, men du har redan tjänat det. Om du vill uppstå här kan du spara aktuellt värde.

Tack för att du läste denna handledning om Game Center. Om du har frågor eller kommentarer om denna handledning, lämna dem i kommentarfältet nedan eller maila mig på [email protected]