iOS SDK prestatie en leaderboards van het Game Center - deel 2

Welkom bij het tweede en laatste deel van de Game Center-oefenreeks. In deze tutorial integreren we de achievements en leaderboards die met iTunesConnect zijn gemaakt tijdens deel 1 met Objective-C en Xcode.

Stap 1: De interface bouwen

Voordat we met Interface Builder beginnen, moeten we eerst enkele outlets en acties instellen. Open Game_CenterViewController.h en pas de code als volgt aan:

 #importeren  #importeren  #import "GameCenterManager.h" @class GameCenterManager; @interface Game_CenterViewController: UIViewController  GameCenterManager * gameCenterManager; int64_t huidige score; NSString * currentLeaderBoard; IBOutlet UILabel * currentScoreLabel;  @property (nonatomic, retain) GameCenterManager * gameCenterManager; @property (nonatomic, assign) int64_t currentScore; @property (nonatomic, retain) NSString * currentLeaderBoard; @property (nonatomic, retain) UILabel * currentScoreLabel; - (IBAction) reset; - (IBAction) showLeaderboard; - (IBAction) showAchievements; - (IBAction) submitScore; - (IBAction) verhogenScore; - (ongeldig) cheques; @einde

Eerst importeren we het GameKit-framework en de GameCenterManager klasse. Vervolgens verklaren we de GameCenterManager klasse, dus we kunnen een instantie van die klasse in de @interface. Daarna verklaren we de volgende afgevaardigden:

    яя я
  • UIActionSheetDelegate (om een ​​actielijst te gebruiken)
  • GKLeaderboardViewControllerDelegate (om het leaderboard in onze app te tonen)
  • GKAchievementViewControllerDelegate (om de prestaties in onze app te laten zien)
  • GameCenterManagerDelegate (om de GameCenterManager-deelnemer te gebruiken)

In de @interface we verklaren enkele instanties en daarna maken we enkele acties. Druk op CMD + S om het project op te slaan.

In het? Game Center? map in de? Project Navigator? Klik op Game_centerViewController.xib.

Selecteer de Uitzicht venster en kies de gewenste achtergrond. Ik heb gekozen? Scroll View Textured Background Color ?. Drag 5? Round Rect-knoppen? van de Bibliotheek naar de uitzicht. Benoem en rangschik ze zoals hieronder getoond. Sleep ook 2? Labels? van de Bibliotheek naar de uitzicht. Noem de eerste? Huidige score :? en verwijder de tekst van het tweede label.

яя я

Selecteer? De eigenaar van het bestand? en open de Verbindingen Inspecteur.

яя я

Verbind de acties met de bijbehorende knoppen door ze naar de knoppen te slepen en selecteer? Touch Up Inside? van het menu.

яя я яя я

Sleep het? CurrentScoreLabel? stopcontact naar het label zonder tekst en nu zijn we klaar met de interface.

Stap 2: bewerk AppSpecificValues.h

Open AppSpecificValues.h en pas de code als volgt aan:

 // Leaderboard Category ID's #define kLeaderboardID @ "1" // Prestatie-ID's #define kAchievementOneTap @ "1_Tap" #define kAchievement20Taps @ "20_Taps"

Hier creëren we de constanten voor ons leaderboard en onze prestaties. Zoals je ziet zijn de ID's dezelfde als die we in iTunes Connect hebben gemaakt.

Stap 3: bewerk Game_CenterViewController.m

Ten eerste gaan we onze instanties synthetiseren en vrijgeven. We importeren ook de? AppSpecificValues? en? GameCenterManager? klassen. Zo open Game_CenterViewController.m en pas de code aan de bovenkant van de pagina als volgt aan:

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

Pas nu het viewDidUnload en dealloc methoden als volgt:

 - (void) viewDidUnload [super viewDidUnload]; // Laat eventueel behouden subvisies van de hoofdweergave vrij. // b.v. self.myOutlet = nihil; self.gameCenterManager = nihil; self.currentLeaderBoard = nihil; self.currentScoreLabel = nihil;  - (void) dealloc [release gameCenterManager]; [currentLeaderBoard-release]; [currentScoreLabel release]; [super dealloc]; 

Stap 4: Aanmelden bij Game Center

Scroll naar beneden naar de? ViewDidLoad? methode, het niet te bevelen en de code als volgt aan te passen:

 - (void) viewDidLoad [super viewDidLoad]; self.currentLeaderBoard = kLeaderboardID; self.currentScore = 0; if ([GameCenterManager is GameCenterAvailable]) self.gameCenterManager = [[[GameCenterManager alloc] init] autorelease]; [self.gameCenterManager setDelegate: self]; [self.gameCenterManager authenticateLocalUser];  else // Het huidige apparaat biedt geen ondersteuning voor Game Center. 

Eerst stellen we ons huidigeLeaderboard in op ons leaderboard dat we in iTunes Connect hebben gemaakt. Daarna stellen we onze currentcore in op 0. Uw hoogste score in Game Center wordt niet op nul gezet, omdat deze alleen scores hoger dan de vorige scoorde. Vervolgens kijken we of Game Center beschikbaar is op het apparaat waarop de toepassing wordt uitgevoerd. Als Game Center beschikbaar is, verifiëren we de lokale gebruiker. Als Game Center niet beschikbaar is, gebeurt er niets. U kunt de gebruiker vertellen dat Game Center niet beschikbaar is met een alertweergave, maar ik laat het achter met een opmerking.

Nu kunt u uw project testen. Druk op CMD + R om het te bouwen en uit te voeren. Je krijgt een aantal waarschuwingen, maar de app zal worden uitgevoerd. Als u al bent aangemeld bij Game Center, krijgt u het volgende bericht: Welcome Back,? Game Center Name ?. Als u niet bent aangemeld bij Game Center, krijgt u een waarschuwingsweergave met de opties om een ​​nieuw account aan te maken, u aan te melden bij een bestaand account of te annuleren. Als je het scorebord annuleert, werken de prestaties niet, omdat je niet bent aangemeld bij Game Center. De knoppen werken niet, omdat we de acties niet in Xcode hebben uitgevoerd.

яя я

Stap 5: De klassementen en prestaties tonen

Als u de simulator hebt gebruikt, sluit u deze en gaat u terug naar Xcode. Voeg de volgende code toe onder de viewDidLoad methode:

 - (IBAction) showLeaderboard GKLeaderboardViewController * leaderboardController = [[GKLeaderboardViewController alloc] init]; if (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) showAchievements GKAchievementViewController * achievements = [[GKAchievementViewController alloc] init]; if (achievements! = NULL) achievements.achievementDelegate = self; [self presentModalViewController: achievements geanimeerde: YES];  - (void) achievementViewControllerDidFinish: (GKAchievementViewController *) viewController; [self dismissModalViewControllerAnimated: YES]; [viewController release]; 

Hier beschrijven we de acties om het klassement en de prestaties te tonen. We creëren ook 2 methoden om terug te gaan. De eerste acties zijn om het leaderboard te tonen. Zoals je ziet hebben we de timeScope op GKLeaderboardTimeScopeWeek gezet. Dit betekent dat het scorebordgedeelte is ingesteld op? Deze week ?. Er zijn 3 tijdscopes en ze zijn rechttoe rechtaan:

    яя я
  • GKLeaderboardTimeScopeToday
  • GKLeaderboardTimeScopeWeek
  • GKLeaderboardTimeScopeAllTime

Als u opnieuw bouwt en uitvoert, toont het? Show Leaderboard? en? Toon prestaties? knoppen werken. Nu kunt u de prestaties zien die we hebben gemaakt en de bijbehorende beschrijvingen en puntwaarden. Zoals je kunt zien is de leaderbord-sectie? Deze week ?. Door het tijdbereik in Xcode te wijzigen, kunt u de standaardsectie instellen op? Altijd? of? Vandaag ?. Het scorebord zegt: 'Geen scores', omdat we nooit een score hebben ingediend voor dit leaderboad. Klik Gedaan om de weergave Game Center te sluiten.

яя я

Stap 6: Omgaan met de score en prestaties

Voeg de volgende code toe onder de code die we zojuist hebben gemaakt:

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

Hier maken we een actie om je huidige score te vergroten. We werken ook ons ​​label bij naar de huidige score en bellen het checkAchievements functie om te zien of we een prestatie hebben bereikt.

 - (void) checkAchievements NSString * identifier = NULL; double percentComplete = 0; switch (self.currentScore) case 1: identifier = kAchievementOneTap; percentComplete = 100.0; breken;  geval 5: identifier = kAchievement20Taps; percentComplete = 25.0; breken;  geval 10: identifier = kAchievement20Taps; percentComplete = 50.0; breken;  geval 15: identifier = kAchievement20Taps; percentComplete = 75.0; breken;  geval 20: identifier = kAchievement20Taps; percentComplete = 100.0; breken;  if (identifier! = NULL) [self.gameCenterManager submitAchievement: identifier percentComplete: percentComplete]; 

In deze functie kijken we of we een prestatie hebben bereikt met een switch-statement.
Eerst maken we een NSString en een double om onze waarden op te slaan. In de switch-instructie controleren we of de stroomkring 1, 5, 10, 15 of 20 is. Na de switch-instructie kijken we of er iets is opgeslagen in de NSString die we hebben gemaakt. Als er iets is opgeslagen in die NSString, leggen we de prestatie voor. We leveren ook een prestatie als u deze gedeeltelijk hebt voltooid. Bijvoorbeeld, als je tien keer op de knop tikte, at je op 50% van de? 20 Taps? prestatie.

We willen ook een hoge score insturen, dus voeg de volgende acties toe onder de code die we zojuist hebben gemaakt:

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

Hier controleren we of de score hoger is dan 0, omdat we niet willen dat een score van 0 wordt ingeleverd. We hebben onze huidige score voor ons huidiglaarboard ingediend.

Bouw en voer de applicatie opnieuw uit en nu kunt u uw score verhogen en verzenden. Als u 15 keer op de knop klikt en gaat naar? Prestaties weergeven? kunt u zien dat u het? 1 hebt bereikt? Tik? en zijn op 75% van de? 20 Taps? prestatie. De beschrijving van de? 1 Tik op? prestatie is ook veranderd in de tekst die we het gaven toen het in iTunes Connect was voor wanneer het werd verdiend. Sluit de achievements-weergave en klik op? Submit Score ?, na die klik? Show Leaderbaord ?. Nu zie je je score (als je huidige score hoger was dan 0).

яя я

Stap 7: reset de score en prestaties

dd de volgende code onder de code die we zojuist hebben gemaakt:

 - (IBAction) reset UIActionSheet * actionSheet = [[UIActionSheet alloc] initWithTitle: @ "Weet u zeker dat u uw score en prestaties wilt resetten?" delegate: self cancelButtonTitle: @ "Cancel" destructiveButtonTitle: @ "Reset" otherButtonTitles: nil]; [actionSheet showInView: [zelfweergave]]; [actionSheet-release]; 

Hier hebben we een actielijst gemaakt in de reset-actie. We hebben de afgevaardigde ingesteld op? Zelf? omdat we iets willen doen als u op? reset? knop.

Onder de? Reset? actie voeg de volgende code toe:

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

In deze code kijken we naar de knop waarop u hebt geklikt. U kunt de? Annuleren? Niet bewerken? knop zodat we beginnen bij een knopIndex van 0. Als u op de knop? Reset? knop in het actieblad, de gameCenterManager reset je prestaties, de huidige score is ingesteld op 0 en we werken de currentScoreLabel-tekst bij.

Stap 8: Breng de gebruiker op de hoogte van Earned Achievement

Voeg de volgende code toe onder de code die we zojuist hebben gemaakt:

 - (ongeldig) achievementSubmitted: (GKAchievement *) ach error: (NSError *) error; if ((error == NULL) && (ach! = NULL)) if (ach.percentComplete == 100.0) UIAlertView * alert = [[UIAlertView alloc] initWithTitle: @ "Achievement Earned!" message: (@ "% @", ach.identifier) ​​delegate: nil cancelButtonTitle: @ "OK" otherButtonTitles: nil]; [alarm show]; [melding vrijgeven];  else // Aanmelding ingediend mislukt. 

Eerst controleren we of er geen fout was en of er iets is opgeslagen? Ach ?. Als dit allebei waar is, controleren we of ach.presentComplete 100.0 is, omdat we de gebruiker alleen een bericht willen geven als hij een prestatie heeft verdiend en niet als hij 50% van een prestatie heeft bereikt.
Als dat waar is, laten we de gebruiker zien dat hij een prestatie heeft verdiend met een waarschuwingsweergave. We stellen afgevaardigden op nul van deze waarschuwingsweergave, omdat we deze niet nodig hebben, gebruiken we alleen de knop Annuleren.

Als er een fout is opgetreden of als er niets is opgeslagen in ach, kunt u de gebruiker een bericht geven dat de voltooiingsaanvraag is mislukt, maar ik laat deze achter met een opmerking.

Build and Run om de tutorial te voltooien. Als u wilt controleren of de resetknop en de waarschuwingsweergave werken, klikt u op? Prestaties en score opnieuw instellen? knop. Verhoog vervolgens de score en een waarschuwingsweergave zou moeten verschijnen.

яя я

Als je beide prestaties hebt verdiend en de app hebt gesloten en de delete if in de multitask-balk, wordt de huidige score weer op 0 gezet, omdat we die waarde niet hebben opgeslagen. Als u de score verhoogt of als apps denken dat u de score hebt verdiend? 1 Tik op? prestatie opnieuw, maar je hebt het al verdiend. Als u dit wilt doen, kunt u de huidigeScore-waarde opslaan.

Bedankt voor het lezen van deze tutorial over Game Center. Als je vragen of opmerkingen hebt over deze tutorial, laat ze dan in de comments hieronder staan ​​of mail me op [email protected]