Aceasta este cea de-a șaptea și ultima tranșă a seriei noastre de tutorial Cocos2D privind clonarea Centipede pentru iOS. Asigurați-vă că ați finalizat piesele anterioare înainte de a începe.
În ultimul tutorial, am discutat cum să facem o simplă detectare a coliziunii între toate obiectele din jocul nostru.
În tutorialul de astăzi, vom încheia lucrurile prin discutarea punctajului, a condițiilor câștigătoare, a jocului audio și a jocului pe ecran.
De acum, când distrugi omida, nu se întâmplă nimic. Modul de a avansa înainte este să crească nivelul și să reporniți cu niște germeni noi și o nouă omidă. Acest lucru este ușor de realizat deoarece am construit jocul pentru a susține acest lucru de la început. Deschideți GameLayer.m și adăugați următoarea metodă:
- (void) checkNextLevel dacă ([auto.caterpillars count] == 0) // 1 self.level ++; // 2 // 3 CGPoint startPosition = ccp (kGameAreaStartX, kGameAreaHeight + kGameAreaStartY - kGridCellSize / 2); Caterpillar * caterpillar = [[[Caterpillar alin] initWithGameLayer: nivel de sine: pozitie self.level: startPosition] autorelease]; [auto.caterpillars addObject: caterpillar]; // 4 int minSprotCount = kStartingSproutsCount + self.level * 2; dacă [[auto.sprouts count] < minSproutCount) int numberOfSproutsToPlace = minSproutCount - [self.sprouts count]; for(int x = 0; x < numberOfSproutsToPlace; x++) [self placeRandomSprout];
Acum, că avem metoda implementată, trebuie să o numim de fiecare dată când omida este lovită. În interiorul splitCaterpillar: atSegment:
, adăugați următoarea linie înainte de instrucțiunea returnare din interiorul primei instrucțiuni if:
dacă ([caterpillar.segments count] == 1) // ... // Adăugați această linie [self checkNextLevel]; întoarcere;
Aceasta este condiția când omida este doar un singur segment. În plus, adăugați-o aici, adăugați-o chiar în partea de jos a acestei metode. Aceasta ar trebui să acopere toate cazurile.
Dacă executați jocul în acest moment, ar trebui să puteți juca infinit cu viteza ombilicului care crește pe fiecare nivel.
În joc, există mai multe locuri în care jucătorul poate să-și mărească scorul. Sunt:
Vom sari destul de putin pentru a adauga un punctaj pentru fiecare dintre aceste actiuni, atat de rau cu mine.
Înainte de a începe să actualizăm scorul, trebuie să definim trei constante care vor fi punctele de bază pentru scor. Deschideți GameConfig.h și adăugați următoarele 3 linii:
#define kSproutHitPoints 25 #define kCaterpillarHitPoints 200 #define kNextLevelPoints 1000
Veți vedea cum acestea sunt folosite, deoarece vom ajunge puțin mai departe în acest tutorial.
Să începem cu adăugarea la scorul jucătorului atunci când apare o spărtură în joc. Deschideți Missile.m, importați Player.h și adăugați următorul cod în interiorul bucla care verifică o coliziune cu un sprout:
auto.gameLayer.player.score + = kSproutHitPoints + (arc4random ()% auto.gameLayer.level) * (arc4random ()% auto.gameLayer.level); [[NSNotificationCenter defaultCenter] postNotificationName: Obiect kNotificationPlayerScore: nil];
Aceasta crește scorul jucătorului bazat pe punctele de bază și o anumită cantitate de întâmplare bazată pe nivelul actual. În acest fel, pe măsură ce jucătorul urcă la nivel, câștigă mai multe puncte pentru a scoate germenii.
Așa cum am făcut și când am stabilit scorul inițial, trebuie să afișăm o notificare care va actualiza eticheta scorului jucătorului. Aceasta se face la fiecare actualizare a scorului. Dacă executați jocul în acest moment, ar trebui să vedeți actualizarea etichetei scorului jucătorului de fiecare dată când atingeți un sprout.
Următorul loc pe care îl vom adăuga este atunci când omida este lovită. În partea de jos a paginii Actualizați:
în metoda Missile.m, adăugați următorul cod înainte de a diviza unitatea:
dacă (hitCaterpillar && hitSegment) // Adăugați aceste linii self.gameLayer.player.score + = kCaterpillarHitPoints + (arc4random ()% self.gameLayer.level) * (arc4random ()% self.gameLayer.level); [[NSNotificationCenter defaultCenter] postNotificationName: Obiect kNotificationPlayerScore: nil]; // ... code to split the caterpillar ...
Acest cod nu este mult diferit de ceea ce ați văzut mai sus. Locul final de adăugat este atunci când jucătorul avansează la nivel. Acest cod va fi plasat în interiorul checkNextLevel
metoda pe care ați scris-o mai sus. Deschideți GameLayer.m, navigați la checkNextLevel
și adăugați următorul cod imediat după instrucțiunea if:
auto.player.score + = kNextLevelPoints * self.level; [[NSNotificationCenter defaultCenter] postNotificationName: Obiect kNotificationPlayerScore: nil];
Nu sunt surprize aici. Dacă doriți să adăugați unele variații la punctajul din jocul dvs., nu ezitați să modificați valorile scorului.
Încă de acum, jucătorul dvs. are jocul Genie și are vieți infinite. Trebuie să schimbăm asta. Mai întâi, creați un nou fișier numit GameOverLayer.m care extinde CCLayer.
Adăugați următorul cod Pentru a GameOverLayer.h:
#import "cocos2d.h" #import "GameConfig.h" @interface GameOverLayer: CCLayer @property (nonatomic, atribuie) Scorul NSInteger; @property (nonatomic, reține) CCLabelTTF * scoreLabel; @property (nonatomic, reține) CCLabelTTF * highScoreLabel; + (CCScene *) scena Scorul Scorului: (NSInteger); @Sfârșit
Voi explica ce fac aceste proprietăți și metode în timpul implementării. Acum adăugați următorul cod la GameOverLayer.m
#import "GameOverLayer.h" #import "GameLayer.h" #import "SimpleAudioEngine.h" @implementare GameOverLayer @synthesize scor = _score; @synthesize scoreLabel = _scoreLabel; @synthesize highScoreLabel = _highScoreLabel; // 1 + (CCScene *) scena Scenă Scorul: (NSInteger) // 'scena' este un obiect autorelease. CCScene * scena = [nod CCScene]; // 'layer' este un obiect autorelease. GameOverLayer * layer = [nodul GameOverLayer]; layer.score = scor; // adăugați stratul ca un copil în scenă [scena addChild: layer]; // returnează scena de întoarcere a scenei; // 2 - (void) dealloc [_scoreLabel release]; [release highScoreLabel]; [super dealloc]; - (id) init if ((auto = [super init])) // 3 [CCTexture2D setDefaultAlphaPixelFormat: kCCTexture2DPixelFormat_RGB565]; CCSprite * fundal = [CCSprite spriteWithFile: @ "game-over.png"]; background.anchorPoint = ccp (0,0); [self addChild: fundal]; // 4 _scoreLabel = [[CCLabelTTF labelWithString: @ "0" dimensiuni: CGSizeMake (320, 30) aliniere: UITextAlignmentCenter fontName: @ "Helvetica" fontSize: 30] retine]; _scoreLabel.anchorPoint = ccp (0,0); _scoreLabel.position = ccp (0,155); [auto addChild: _scoreLabel]; _highScoreLabel = [[CCLabelTTF labelWithString: [NSString stringWithFormat: @ "High:% d", 0] Dimensiuni: CGSizeMake (320, 35) aliniere: UITextAlignmentCenter fontName: @ Helvetica fontSize: 30] retain; _highScoreLabel.anchorPoint = ccp (0,0); _highScoreLabel.color = (ccColor3B) 255,0,0; _highScoreLabel.position = ccp (0,195); [auto addChild: _highScoreLabel]; // 5 [[CCTouchDispatcher sharedDispatcher] addTargetedDelegate: prioritate în sine: 0 înghițiteTuce: YES]; [[SimpleAudioEngine sharedEngine] playEffect: @ "game-over.caf"]; întoarce-te; - (void) setScore: (NSInteger) scor _score = scor; self.scoreLabel.string = [NSString stringWithFormat: @ "Scor:% d", _ scor]; // 6 NSUserDefaults * implicit = [NSUserDefaults standardUserDefaults]; NSInteger highScore = [implicit integerForKey: @ "CentipedeHighScore"]; // 7 dacă (scor> highScore) highScore = scor; [implicit setInteger: scor pentruKey: @ "CentipedeHighScore"]; [implicit sincronizați]; self.highScoreLabel.string = [NSString șirWithFormat: @ "High:% d", highScore]; // 8 - (BOOL) ccTouchBegan: (UITouch *) atingeți cu EventEvent: (UIEvent *) eveniment [[CCDirector sharedDirector] replaceScene: [TransitionFade transitionWithDuration: .5 scena: [Scena GameLayer] cuColor: ccWHITE]; reveniți DA; @Sfârșit
Aici este o captură de ecran a ceea ce acest ecran ar trebui să arată ca:
Ultimul pas este să deschideți GameLayer.m și să adăugați următoarele linii la sfârșitul secțiunii updateLives
metodă:
dacă (lifeCount == 0) [[CCDirector sharedDirector] înlocuieșteScene: [tranziția CCTransitionFade transitionWithDuration: .5 scena: [GameOverLayer sceneWithScore: self.player.score] cuColor: ccWHITE]];
Aceasta verifică dacă viețile sunt setate la 0. Dacă da, înlocuim scena curentă cu scena Game Over.
Ultimul pas în lustruirea jocului nostru este de a adăuga sunet. Mai întâi, descărcați sunetele de mai jos și adăugați-le la proiectul dvs.:
GameSounds.zip
În mod tradițional, manipularea sunetului a fost o mare durere într-un joc OpenGL. Va trebui să utilizați ceva de genul OpenAL sau altă bibliotecă complicată C ++. Cocos2D a simplificat foarte mult lucrurile cu ei SimpleAudioEngine
bibliotecă. Vă oferă posibilitatea de a reda cu ușurință muzică de fundal, precum și sunete rapide.
Din nou, vom sări puțin în jur. Deci, dacă plasarea unui anumit cod este neclară pentru dvs., vă rog să mă întrebați în comentarii sau să consultați codul sursă al acestui tutorial.
Deschideți AppDelegate.m și importați SimpleAudioEngine.h și adăugați următoarea linie în partea de jos a applicationDidFinishLaunching
metodă.
[[SimpleAudioEngine sharedEngine] playBackgroundMusic: @ "background.caf"];
Asta e! Numai o singură linie este necesară pentru a reda muzica de fundal pe durata timpului de joc. Acum, trebuie doar să jucăm efecte sonore ca răspuns la diferite acțiuni.
În Caterpillar.m, atunci când Caterpillar se ciocnește cu playerul (spre sfârșitul lui Actualizați:
metodă):
[[SimpleAudioEngine sharedEngine] playEffect: @ "player-hit.caf"];
În Missile.m, atunci când racheta lovește Sprout:
[[SimpleAudioEngine sharedEngine] playEffect: @ "sprout-hit.caf"];
Tot în Missile.m, când racheta lovește Caterpillar:
[[SimpleAudioEngine sharedEngine] playEffect: @ "caterpillar-hit.caf"];
În metoda Init în GameOverLayer.m:
[[SimpleAudioEngine sharedEngine] playEffect: @ "game-over.caf"];
Aceasta ar trebui să acopere toate sunetele pe care le-am folosit în joc. De asemenea, asigurați-vă că importați SimpleAudioEngine.h în fiecare dintre clasele de mai sus.
Aceasta incheie seria 7 de tutoriale despre crearea unui joc Caterpillar folosind Cocos2D pentru iPhone. Până acum, ar trebui să aveți o înțelegere solidă cu privire la modul de proiectare și construire a unui joc simplu folosind motorul de joc Cocos2D. Dacă aveți întrebări sau comentarii, nu ezitați să le lăsați în secțiunea de comentarii aici sau să le scrieți pe Twitter.
Codificare fericită!