Velkommen til den andre og siste delen av Game Center Tutorial Series. I denne opplæringen integrerer vi prestasjonene og leaderboards opprettet med iTunesConnect under del 1 med Objective-C og Xcode.
Før vi starter med Interface Builder, må vi først sette opp noen uttak og handlinger. Åpen Game_CenterViewController.h og endre koden for å lese som følger:
#importere#importere #import "GameCenterManager.h" @class GameCenterManager; @interface Game_CenterViewController: UIViewController GameCenterManager * gameCenterManager; int64_t currentScore; NSString * currentLeaderBoard; IBOutlet UILabel * currentScoreLabel; @property (nonatomic, behold) GameCenterManager * gameCenterManager; @property (ikkeatomisk, tilordne) int64_t currentScore; @property (nonatomic, behold) NSString * currentLeaderBoard; @property (nonatomic, behold) UILabel * currentScoreLabel; - (IBAction) reset; - (IBAction) showLeaderboard; - (IBAction) showPrestasjoner; - (IBAction) submitScore; - (IBAction) increaseScore; - (ugyldig) sjekk @slutt
Først importerer vi GameKit rammeverket og GameCenterManager klasse. Deretter erklærer vi GameCenterManager klasse, så vi kan erklære en forekomst av den klassen i @interface. Deretter erklærer vi følgende delegater:
I @interface Vi erklærer noen tilfeller, og etter det lager vi noen handlinger. Trykk på CMD + S for å lagre prosjektet.
I? Game Center? mappe i "Project Navigator"? klikk på Game_centerViewController.xib.
Velg Utsikt vindu og velg bakgrunnen du foretrekker. Jeg valgte? Rul Vis Strukturert Bakgrunnsfarge ?. Dra 5? Runde Rect Knapper? fra Bibliotek til utsikt. Navn og ordne dem som vist nedenfor. Dra også 2? Etiketter? fra Bibliotek til utsikt. Navn den første? Nåværende poeng :? og slett teksten til den andre etiketten.
яя яVelg? Filens eier? og åpne Tilkoblingsinspektør.
яя яKoble handlingene til de tilknyttede knappene, ved å dra dem til knappene og velg? Berør opp på innsiden? fra menyen.
яя я яя яDra? CurrentScoreLabel? utløp til etiketten uten tekst og nå er vi ferdige med grensesnittet.
Åpen AppSpecificValues.h og endre koden for å lese som følger:
// Leaderboard Kategori IDs #define kLeaderboardID @ "1" // Achievement IDs #define kAchievementOneTap @ "1_Tap" #define kAchievement20Taps @ "20_Taps"
Her skaper vi konstanter for vårt toppliste og våre prestasjoner. Som du ser, er ID-ene det samme som de vi opprettet i iTunes Connect.
Først skal vi syntetisere våre forekomster og slippe dem ut. Vi importerer også? AppSpecificValues? og? GameCenterManager? klasser. Så åpen Game_CenterViewController.m og endre koden øverst på siden som følger:
#import "Game_CenterViewController.h" #import "AppSpecificValues.h" #import "GameCenterManager.h" @implementation Game_CenterViewController @synthesize gameCenterManager; @synthesize currentScore; @synthesize currentLeaderBoard; @synthesize currentScoreLabel;
Endre nå viewDidUnload og dealloc metoder som følger:
- (void) viewDidUnload [super viewDidUnload]; // Slett eventuelle beholdte undervisninger av hovedvisningen. // f.eks. self.myOutlet = nil; self.gameCenterManager = nil; self.currentLeaderBoard = null; self.currentScoreLabel = nil; - (void) dealloc [gameCenterManager release]; [currentLeaderBoard release]; [currentScoreLabel release]; [super dealloc];
Rull ned til? ViewDidLoad? metode, unngår det og modifiser koden som følger:
- (void) viewDidLoad [super viewDidLoad]; self.currentLeaderBoard = kLeaderboardID; self.currentScore = 0; hvis ([GameCenterManager isGameCenterAvailable]) self.gameCenterManager = [[[GameCenterManager alloc] init] autorelease]; [self.gameCenterManager setDelegate: self]; [self.gameCenterManager authenticateLocalUser]; else // Den gjeldende enheten støtter ikke spillesenter.
Først satte vi vårt nåværendeLederboard til vår leaderBoard vi opprettet i iTunes Connect. Deretter setter vi vår currentscore til 0. Din høyeste poengsum i Game Center vil ikke bli satt til null, fordi den bare sender score høyere enn den forrige. Så ser vi om Game Center er tilgjengelig på enheten som programmet kjører. Hvis Game Center er tilgjengelig, autentiserer vi den lokale brukeren. Hvis Game Center ikke er tilgjengelig, skjer ingenting. Du kan fortelle brukeren at Game Center ikke er tilgjengelig med en varslingsvisning, men jeg legger det med en kommentar.
Nå kan du teste prosjektet ditt. Trykk CMD + R for å bygge og kjøre den. Du får noen advarsler, men appen vil kjøre. Hvis du allerede er logget på Game Center, får du følgende melding: Velkommen Tilbake,? Spillerens navn ?. Hvis du ikke er logget inn på Game Center, får du en varselvisning med alternativene for å opprette en ny konto, logg inn på en eksisterende konto eller avbryt. Hvis du avbryter ledergruppen, og prestasjoner ikke virker, fordi du ikke er logget på Game Center. Knappene virker ikke, fordi vi ikke har gjort handlingene i Xcode.
яя яHvis du brukte simulatoren, lukk den og gå tilbake til Xcode. Legg til følgende kode under viewDidLoad metode:
- (IBAction) showLeaderboard GKLeaderboardViewController * leaderboardController = [[GKLeaderboardViewController alloc] init]; hvis (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 * prestasjoner = [[GKAchievementViewController alloc] init]; hvis (prestasjoner! = NULL) achievements.achievementDelegate = self; [self presentModalViewController: prestasjoner animert: YES]; - (void) achievementViewControllerDidFinish: (GKAchievementViewController *) viewController; [self dismissModalViewControllerAnimated: YES]; [viewController release];
Her skaper vi handlingene for å vise topplisten og prestasjonene. Vi lager også 2 metoder for å gå tilbake. De første handlingene er å vise topplaten. Som du kan se, setter vi TimeScope til GKLeaderboardTimeScopeWeek. Dette betyr at leaderboard-delen er satt til? Denne uken ?. Det er 3 tidspunkter og de er rett frem:
Hvis du bygger og kjører igjen, vises "Leaderboard? og? Vis prestasjoner? knappene vil fungere. Nå kan du se prestasjonene vi har opprettet og de tilhørende beskrivelsene og poengverdiene. Som du kan se lederbordsseksjonen er? Denne uken ?. Ved å endre Time Scope i Xcode kan du angi standard delen til? All Time? eller? I dag ?. Topplisten sier? Ingen poeng?, Fordi vi aldri har lagt inn poengsum for denne leaderboad. Klikk Ferdig å avvise Game Center-visningen.
яя яLegg til følgende kode under koden vi nettopp opprettet:
- (IBAction) increaseScore self.currentScore = self.currentScore + 1; currentScoreLabel.text = [NSString stringWithFormat: @ "% ld", self.currentScore]; [self checkAchievements];
Her oppretter vi en handling for å øke din nåværende score. Vi oppdaterer også vår etikett til gjeldendeScore og ringer til checkAchievements funksjon for å se om vi oppnådde en prestasjon.
- (ugyldig) sjekkeforestillinger NSString * identifier = NULL; double percentComplete = 0; bytt (self.currentScore) tilfelle 1: identifier = kAchievementOneTap; percentComplete = 100,0; gå i stykker; tilfelle 5: identifier = kAchievement20Taps; percentComplete = 25,0; gå i stykker; tilfelle 10: identifier = kAchievement20Taps; percentComplete = 50,0; gå i stykker; tilfelle 15: identifier = kAchievement20Taps; percentComplete = 75,0; gå i stykker; tilfelle 20: identifier = kAchievement20Taps; percentComplete = 100,0; gå i stykker; hvis (identifiser! = NULL) [self.gameCenterManager submitAchievement: identifiseringsprosentKomplett: percentComplete];
I denne funksjonen ser vi om vi oppnådde en prestasjon med en bryteretning.
Først oppretter vi en NSString og en dobbel for å lagre verdiene våre. I bryteretningen kontrollerer vi om strømmengden er 1, 5, 10, 15 eller 20. Etter bryteretningen ser vi om det er noe lagret i NSStringen vi opprettet. Hvis det var noe lagret til den NSString, sender vi prestasjonen. Vi sender også en prestasjon hvis du har fullført den delvis. For eksempel, hvis du tastet på knappen 10 ganger spiste du på 50% av 20 kranene? oppnåelse.
Vi ønsker også å sende inn eller høy poengsum, så legg til følgende handlinger under koden vi nettopp har opprettet:
- (IBAction) submitScore if (self.currentScore> 0) [self.gameCenterManager reportScore: self.currentScore forCategory: self.currentLeaderBoard];
Her kontrollerer vi om poengsummen er høyere enn 0, fordi vi ikke vil ha en score på 0 som skal sendes inn. Vi sendte inn vår nåværendeScore for vårt nåværendeLeserboard.
Bygg og kjør programmet igjen, og nå kan du øke poengsummen din og sende den inn. Hvis du klikker på knappen 15 ganger og går til? Vis prestasjoner? kan du se at du oppnådde? 1 Trykk? og er på 75% av 20 kranene? oppnåelse. Beskrivelsen av? 1 Trykk? prestasjonen endret også i teksten vi ga den når den i iTunes Connect for når den ble opptjent. Lukk prestasjonsvisningen og klikk på? Send inn poeng ?, etter at klikk? Vis Leaderbaord ?. Nå ser du poengsummen din (hvis din nåværende score var høyere enn 0).
яя яdd følgende kode under koden vi nettopp opprettet:
- (IBAction) reset UIActionSheet * actionSheet = [[UIActionSheet alloc] initWithTitle: @ "Er du sikker på at du vil nullstille poeng og prestasjoner?" delegere: self cancellButtonTitle: @ "Cancel" destructiveButtonTitle: @ "Tilbakestill" otherButtonTitles: null]; [actionSheet showInView: [selvvisning]]; [actionSheet release];
Her opprettet vi et handlingsark i tilbakestillingsaksjonen. Vi setter delegaten til? Selv? fordi vi vil gjøre noe hvis du klikket på? reset? knapp.
Under tilbakestillingen? handling legge til følgende kode:
- (void) actionSheet: (UIActionSheet *) actionSheet klikketButtonAtIndex: (NSInteger) buttonIndex if (buttonIndex == 0) [gameCenterManager resetAchievements]; self.currentScore = 0; currentScoreLabel.text = [NSString stringWithFormat: @ "% ld", self.currentScore];
I denne koden ser vi hekseknappen du klikket på. Du kan ikke redigere? Avbryt? knappen slik at vi starter med en knappIndex på 0. Hvis du klikket på? Tilbakestill? knappen i handlingsarket, nulstiller gameCenterManager dine prestasjoner, nåværendeScore er satt til 0 og vi oppdaterer den nåværendeScoreLabel-teksten.
Legg til følgende kode under koden vi nettopp opprettet:
- (void) achievementSubmitted: (GKAchievement *) ach feil: (NSError *) feil; if ((error == NULL) && (ach! = NULL)) hvis (ach.percentComplete == 100.0) UIAlertView * alert = [[UIAlertView allokering] initWithTitle: @ "Prestasjon opptjent!" melding: (@ "% @", ach.identifier) delegere: null annullerButtonTitle: @ "OK" otherButtonTitles: null]; [varslingsutstilling]; [våken utgivelse]; else // Prøveinnlevering mislyktes.
Først sjekker vi om det ikke var en feil, og om det er noe lagret i? Ach ?. Hvis dette er både sant, så kontrollerer vi om ach.presentComplete er 100.0, fordi vi bare vil gi brukeren en melding om han har oppnådd en prestasjon, og ikke om han er på 50% av en prestasjon.
Hvis det er sant, viser vi brukeren at han har oppnådd en prestasjon med en varselvisning. Vi setter delegat til null i denne varselvisningen, fordi vi ikke trenger det, bruker vi bare Avbryt-knappen.
Hvis det oppstod en feil eller det ikke var noe lagret i ach, kan du gi brukeren beskjed om at oppnåelsen var mislyktes, men jeg legger det med en kommentar.
Bygg og kjør for å fullføre opplæringen. For å sjekke om tilbakestillingsknappen og varselvisningen fungerer, klikker du på? Tilbakestill prestasjoner og poeng? knapp. Deretter øker poengsummen og en varselvisning bør vise.
яя яHvis du har opptjent begge prestasjoner og lukker appen og slettet hvis fra multitaskenlinjen, er nåværendeScore satt til 0 igjen fordi vi ikke lagret den verdien. Hvis du øker poengsummen, eller apps tror du har tjent? 1 Trykk? prestasjon igjen, men du har allerede tjent det. Hvis du vil oppstå dette, kan du lagre gjeldendeScore-verdien.
Takk for at du har lest denne opplæringen om Game Center. Hvis du har spørsmål eller kommentarer til denne opplæringen, legg dem i kommentarfeltet nedenfor eller send meg en mail på [email protected]