iOS SDK Realizări și clasamente pentru centrul de jocuri - Partea 2

Bine ați venit în cea de-a doua și ultima parte a seriei Game Center Tutorial Series. În acest tutorial, vom integra realizările și clasamentele create cu iTunesConnect în timpul părții 1 cu obiectivele C și Xcode.

Pasul 1: Construirea interfeței

Înainte de a începe cu Interface Builder, trebuie să setăm mai întâi nevoia de a stabili câteva piețe și acțiuni. Deschis Game_CenterViewController.h și modificați codul după cum urmează:

 #import  #import  #import "GameCenterManager.h" @class GameCenterManager; @interface Game_CenterViewController: UIViewController  GameCenterManager * gameCenterManager; int64_t currentScore; NSString * currentLeaderBoard; IBOutlet UILabel * currentScoreLabel;  @property (nonatomic, păstrați) GameCenterManager * gameCenterManager; @property (nonatomic, atribuiți) int64_t currentScore; @property (nonatomic, păstrează) NSString * currentLeaderBoard; @property (nonatomic, reține) UILabel * currentScoreLabel; - resetarea (IBAction); - (IBAction) aratăLiderboard; - (IBAction) showAchievements; - (IBAction) submitScore; - (IBAction) increaseScore; - (void) checkAchievements; @Sfârșit

În primul rând, importăm cadrul GameKit și GameCenterManager clasă. Apoi, noi declarăm GameCenterManager , astfel încât să putem declara o instanță a acelei clase în @interface. După aceea, declarăm următorii delegați:

    яя я
  • UIActionSheetDelegate (pentru a utiliza o foaie de acțiune)
  • GKLeaderboardViewControllerDelegate (pentru a afișa clasamentul în aplicația noastră)
  • GKAchievementViewControllerDelegate (pentru a arăta realizările din aplicația noastră)
  • GameCenterManagerDelegate (pentru a utiliza delegatul GameCenterManager)

În @interface noi declarăm câteva instanțe și după aceea noi creăm unele acțiuni. Apăsați CMD + S pentru a salva proiectul.

În Centrul de jocuri? folder în "Project Navigator"? Click pe Game_centerViewController.xib.

Selectează Vedere fereastră și alegeți fundalul pe care îl preferați. Am ales? Defilați Vizualizați Culoarea fundalului texturat ?. Trageți 5 butoane rotunde Rect? de la Bibliotecă la vedere. Denumiți și organizați-le după cum se arată mai jos. De asemenea, trageți 2 etichete? de la Bibliotecă la vedere. Nume primul? Scor actual :? și ștergeți textul celei de-a doua etichete.

яя я

Selectați? Proprietarul fișierului? și deschideți Conectarea inspectorului.

яя я

Conectați acțiunile la butoanele asociate, trăgându-le pe butoane și selectați? Touch Up Inside? din meniu.

яя я яя я

Trageți? CurrentScoreLabel? ieșire la etichetă fără text și acum am terminat cu interfața.

Pasul 2: Editați AppSpecificValues.h

Deschis AppSpecificValues.h și modificați codul după cum urmează:

 // ID-uri de categorii de clasă #define kLeaderboardID @ "1" // ID-uri de realizare #define kAchievementOneTap @ "1_Tap" #define kAchievement20Taps @ "20_Taps"

Aici creăm constantele pentru clasamentul nostru și realizările noastre. După cum puteți vedea, ID-urile sunt identice cu cele create în iTunes Connect.

Pasul 3: Editați Game_CenterViewController.m

În primul rând, vom sintetiza instanțele noastre și le vom elibera. De asemenea, importăm valorile "AppSpecificValues"? și? GameCenterManager? clase. Atât de deschis Game_CenterViewController.m și modificați codul din partea de sus a paginii după cum urmează:

 #import "Game_CenterViewController.h" #import "AppSpecificValues.h" #import "GameCenterManager.h" @implementare Game_CenterViewController @synthesize jocCenterManager; @synthesize currentScore; @synthesize currentLeaderBoard; @synthesize currentScoreLabel;

Acum modificați viewDidUnload și dealloc după cum urmează:

 - (vid) viewDidUnload [super viewDidUnload]; // Eliberează subview-urile reținute din vizualizarea principală. // de exemplu. self.myOutlet = zero; self.gameCenterManager = zero; self.currentLeaderBoard = zero; auto.currentScoreLabel = zero;  - (void) dealloc [eliberarea gameCenterManager]; [current release LeaderBoard]; [releaseScoreLabel release]; [super dealloc]; 

Pasul 4: conectați-vă la Centrul de jocuri

Derulați în jos la "viewDidLoad"? metoda, să o recomandăm și să modificăm codul după cum urmează:

 - (vid) viewDidLoad [super viewDidLoad]; self.currentLeaderBoard = kLeaderboardID; self.currentScore = 0; dacă ([GameCenterManager isGameCenterAvailable]) self.gameCenterManager = [[[GameCenterManager aloca] init] autorelease]; [self.gameCenterManager setDelegare: auto]; [self.gameCenterManager authenticateLocalUser];  altceva // Dispozitivul curent nu acceptă Centrul de jocuri. 

Mai întâi am setat actualul nostru Leaderboard la leaderboard-ul nostru pe care l-am creat în iTunes Connect. După aceea am setat curenții noștri la 0. Scorul dvs. ridicat în Centrul de jocuri nu va fi setat la zero, deoarece trimite doar scoruri mai mari decât cele anterioare. Apoi ne uităm dacă Centrul de jocuri este disponibil pe dispozitivul pe care rulează aplicația. Dacă Centrul de jocuri este disponibil, autentificăm utilizatorul local. Dacă Centrul de jocuri nu este disponibil, nu se întâmplă nimic. Poți să-i spui utilizatorilor că Centrul de jocuri nu este disponibil cu o vizualizare de alertă, dar îl las cu un comentariu.

Acum vă puteți testa proiectul. Apăsați CMD + R pentru ao construi și a rula. Veți primi niște avertismente, dar aplicația va rula. Dacă sunteți deja conectat (ă) la Centrul de jocuri, primiți următorul mesaj: Bun venit înapoi,? Nume centru de joc ?. Dacă nu v-ați conectat la Centrul de jocuri, primiți o vizualizare de alertă cu opțiunile de a crea un cont nou, conectați-vă la un cont existent sau anulați. Dacă anulați leaderboard-ul și realizările nu vor funcționa, deoarece nu sunteți conectat (ă) la Centrul de jocuri. Butoanele nu vor funcționa, deoarece nu am făcut acțiunile în Xcode.

яя я

Pasul 5: Afișarea clasamentelor și a rezultatelor

Dacă ați folosit simulatorul, închideți-l și reveniți la Xcode. Adăugați următorul cod sub viewDidLoad metodă:

 - (IBAction) aratăLaderboard GKLeaderboardViewController * leaderboardController = [[GKLeaderboardViewController alloc] init]; dacă (leaderboardController! = NULL) leaderboardController.category = self.currentLeaderBoard; leaderboardController.timeScope = GKLeaderboardTimeScopeWeek; leaderboardController.leaderboardDelegate = auto; [auto prezentModalViewController: leaderboardController animat: DA];  - (void) leaderboardViewControllerDidFinish: (GKLeaderboardViewController *) viewController [self dismissModalViewControllerAnimated: YES]; [viewController release];  - (IBAction) aratăAceste GKAchievementViewController * achievements = [[GKAchievementViewController alloc] init]; dacă (realizări! = NULL) achievements.achievementDelegate = auto; [auto prezentModalViewController: realizări animate: DA];  - (void) achievementViewControllerDidFinish: (GKAchievementViewController *) viewController; [auto respingeModalViewControllerAnimated: YES]; [viewController release]; 

Aici, creăm acțiunile pentru a afișa clasamentul și realizările. De asemenea, creăm două metode pentru a ne întoarce. Primele acțiuni sunt de a afișa clasamentul. După cum puteți vedea, am setat timeScope la GKLeaderboardTimeScopeWeek. Aceasta înseamnă că secțiunea din clasament este setată la "Săptămâna asta". Există 3 domenii de timp și sunt directe:

    яя я
  • GKLeaderboardTimeScopeToday
  • GKLeaderboardTimeScopeWeek
  • GKLeaderboardTimeScopeAllTime

Dacă construiți și rulați din nou, tabela de afișare? și? Arătați realizări? butoanele vor funcționa. Acum puteți vedea Realizările pe care le-am creat și descrierile asociate și valorile punctuale. După cum puteți vedea secțiunea leaderboard este? Săptămâna asta ?. Prin schimbarea intervalului de timp în Xcode puteți seta secțiunea implicită la? All Time? sau? Astăzi ?. Clasamentul spune "Nu scoruri", pentru că nu am prezentat niciodată un scor pentru acest clasament. Clic Terminat pentru a renunța la vizualizarea Centrului jocurilor.

яя я

Pasul 6: Manipulați scorul și realizările

Adăugați următorul cod sub codul pe care tocmai l-am creat:

 - (IBAction) cresteScore self.currentScore = self.currentScore + 1; currentScoreLabel.text = [NSString șirWithFormat: @ "% ld", self.currentScore]; [auto checkAchievements]; 

Aici vom crea o acțiune pentru a vă mări scorul actual. Actualizăm, de asemenea, eticheta noastră la adresa curentă și sunăm checkAchievements pentru a vedea dacă am realizat o realizare.

 - (vid) checkAchievements NSString * identifier = NULL; procent dubluComplet = 0; comutator (self.currentScore) caz 1: identifier = kAchievementOneTap; percentComplete = 100,0; pauză;  caz 5: identifier = kAchievement20Taps; percentComplete = 25,0; pauză;  caz 10: identifier = kAchievement20Taps; percentComplete = 50,0; pauză;  caz 15: identifier = kAchievement20Taps; percentComplete = 75,0; pauză;  caz 20: identifier = kAchievement20Taps; percentComplete = 100,0; pauză;  dacă (identificator! = NULL) [auto.gameCenterManager submitAchievement: procentul de identificareComplete: procentComplete]; 

În această funcție ne uităm dacă am realizat o realizare cu o declarație de comutare.
Mai întâi vom crea un NSString și un dublu pentru a stoca valorile noastre. În declarația de comutare verificăm dacă curenții sunt 1, 5, 10, 15 sau 20. După instrucțiunea de comutare, ne uităm dacă există ceva stocat în NSString pe care l-am creat. Dacă a fost ceva stocat în acel NSString, prezentăm realizarea. De asemenea, prezentăm o realizare dacă ați finalizat-o parțial. De exemplu, dacă ați apăsat butonul de 10 ori pe care ați mâncat-o la 50% din cele 20 de puncte? realizare.

De asemenea, dorim să trimiteți un punctaj mare, adică să adăugăm următoarele acțiuni sub codul pe care tocmai l-am creat:

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

Aici verificăm dacă scorul este mai mare decât 0, deoarece nu vrem să fie transmise un scor de 0. Am trimis actualul nostru scor pentru actualul nostru Leaderboard.

Construiți și rulați aplicația din nou și acum puteți să vă măriți scorul și să o depuneți. Dacă dai clic pe buton de 15 ori și mergi la? Arată rezultate? puteți vedea că ați obținut? 1 Atingeți? și sunt pe 75% din cele 20 de puncte? realizare. Descrierea butonului? 1 atingeți? realizarea sa schimbat, de asemenea, în textul pe care l-am dat când a fost conectat la iTunes Connect când a fost câștigat. Închideți vizualizarea realizărilor și faceți clic pe "Trimiteți scorul", după care faceți clic pe "Afișați Leaderbaord?". Acum vedeți scorul dvs. (dacă actualul dvs. Scor a fost mai mare decât 0).

яя я

Pasul 7: Resetați scorul și rezultatele

dd codul următor sub codul pe care tocmai l-am creat:

 - (IBAction) resetare UIActionSheet * actionSheet = [[UIActionSheet alloc] initWithTitle: @ "Sunteți sigur că doriți să vă reinițializați scorul și realizările?" delegat: self cancelButtonTitle: @ "Anulează" destructiveButtonTitle: @ "Resetați" otherButtonTitles: nil]; [actionSheet showInView: [vizualizare de sine]]; [releaseSheet release]; 

Aici am creat o foaie de acțiune în acțiunea de resetare. Am stabilit delegatul la sine? pentru că vrem să facem ceva dacă ați dat clic pe "resetare"? buton.

Sub "resetare"? acțiune adaugă următorul cod:

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

În acest cod căutăm butonul vrăjitor pe care l-ați făcut clic. Nu puteți edita funcția? Cancel? pentru a începe cu un butonIndex de 0. Dacă ați făcut clic pe "Resetați"? în fila de acțiune, gameCenterManager resetează realizările dvs., currentScore este setat la 0 și actualizăm textul curentScoreLabel.

Pasul 8: Notificați utilizatorul câștigului obținut

Adăugați următorul cod sub codul pe care tocmai l-am creat:

 - (void) achievementSubmit: (GKAchievement *) error er: (NSError *) eroare; if ((error == NULL) && (ach! = NULL)) dacă (ach.percentComplete == 100.0) UIAlertView * alert = [UIAlertView alloc] initWithTitle: @ "Achievement Earned! mesaj: (@ "% @", ach.identifier) ​​delegat: nil cancelButtonTitle: @ "OK" otherButtonTitles: nil]; [alertă spectacol]; [release release];  altfel // Achitarea nu a reușit. 

Mai întâi verificăm dacă nu a existat o eroare și dacă există ceva stocat în? Ach ?. Dacă acest lucru este adevărat, atunci verificăm dacă ach.presentComplete este de 100,0, deoarece dorim doar să îi dăm utilizatorului un mesaj dacă a câștigat o realizare și nu dacă se află la 50% dintr-o realizare.
Dacă este adevărat, vom arăta utilizatorului că a câștigat o realizare cu o vizualizare de alertă. Am setat delegat la zero din această vedere de alertă, pentru că nu avem nevoie de ea, vom folosi doar butonul de anulare.

Dacă a apărut o eroare sau nu a fost stocat nimic în ah, atunci puteți da utilizatorului un mesaj care să arate că nu a reușit să se înregistreze, dar îl las cu un comentariu.

Build și Run pentru a termina tutorialul. Pentru a verifica dacă butonul de resetare și vizualizarea de alertă funcționează, faceți clic pe "Resetare rezultate și scor"? buton. Apoi, măriți scorul și ar trebui afișată o vizualizare de alertă.

яя я

Dacă ați câștigat ambele realizări și ați închis aplicația și ștergeți-o dacă din bara multitask, curentScore este setat din nou la 0, deoarece nu am păstrat acea valoare. Dacă creșteți scorul sau aplicațiile credeți că ați câștigat? 1 Atingeți? realizarea din nou, dar deja ați câștigat-o. Dacă doriți să apară acest lucru, puteți salva valoarea curentă.

Vă mulțumim că ați citit acest tutorial despre Centrul de jocuri. Dacă aveți întrebări sau comentarii cu privire la acest tutorial, lăsați-le în secțiunea de comentarii de mai jos sau poștă-mă la [email protected]

Cod