Costruisci un gioco Caterpillar con Cocos2D passaggi finali

Questa è la settima ed ultima puntata della nostra serie di tutorial Cocos2D sulla clonazione di Centipede per iOS. Assicurati di aver completato le parti precedenti prima di iniziare.

Ultima volta…

Nell'ultimo tutorial, abbiamo discusso su come eseguire un semplice rilevamento delle collisioni tra tutti gli oggetti nel nostro gioco.

Nel tutorial di oggi, avvolgeremo le cose discutendo il punteggio, le condizioni vincenti, l'audio del gioco e il gioco sullo schermo.


Step 1: Avanzare il gioco

A partire da ora, quando distruggi il bruco, non succede niente. Il modo per progredire è quello di aumentare il livello e ricominciare con alcuni nuovi germogli e un nuovo bruco. Questo è facile da realizzare visto che stiamo costruendo il gioco per supportarlo fin dall'inizio. Apri GameLayer.m e aggiungi il seguente metodo:

 - (void) checkNextLevel if ([self.caterpillars count] == ​​0) // 1 self.level ++; // 2 // 3 CGPoint startingPosition = ccp (kGameAreaStartX, kGameAreaHeight + kGameAreaStartY - kGridCellSize / 2); Caterpillar * caterpillar = [[[allocazione Caterpillar] initWithGameLayer: self level: self.level position: startingPosition] autorelease]; [self.caterpillars addObject: caterpillar]; // 4 int minSproutCount = kStartingSproutsCount + self.level * 2; se ([self.sprouts conta] < minSproutCount)  int numberOfSproutsToPlace = minSproutCount - [self.sprouts count]; for(int x = 0; x < numberOfSproutsToPlace; x++)  [self placeRandomSprout];    
  1. Controlla se sono rimasti bruchi
  2. Aumenta il livello
  3. Crea un nuovo bruco e aggiungilo al gioco (basato sul nuovo livello)
  4. Aggiungi i germogli per abbinare il minSproutCount

Ora che abbiamo implementato il metodo, dobbiamo chiamarlo ogni volta che il bruco viene colpito. All'interno del splitCaterpillar: atSegment: metodo, aggiungi la seguente riga prima dell'istruzione return all'interno della prima istruzione if:

 if ([caterpillar.segments count] == ​​1) // ... // Aggiungi questa riga [self checkNextLevel]; ritorno; 

Questa è la condizione in cui il bruco è solo un singolo segmento. Oltre ad aggiungerlo qui, aggiungilo alla fine di questo metodo. Questo dovrebbe riguardare tutti i casi.

Se esegui il gioco a questo punto, dovresti essere in grado di giocare all'infinito con la velocità del bruco che aumenta ad ogni livello.


Passaggio 2: punteggio

All'interno del gioco, ci sono molti posti in cui il giocatore può aumentare il proprio punteggio. Loro sono:

  • Colpire un germoglio
  • Colpire il bruco
  • Avanzando al livello successivo

Salteremo un po 'per aggiungere punteggi a ciascuna di queste azioni, così nuda con me.

Prima di iniziare ad aggiornare il punteggio, dobbiamo definire altre tre costanti che costituiranno i punti base per il punteggio. Apri GameConfig.h e aggiungi le seguenti 3 righe:

 #define kSproutHitPoints 25 #define kCaterpillarHitPoints 200 #define kNextLevelPoints 1000

Vedrai come questi vengono usati man mano che ci avviciniamo un po 'più a questo tutorial.

Iniziamo aggiungendo al punteggio del giocatore quando colpisce un germoglio nel gioco. Apri Missile.m, importa Player.h e aggiungi il seguente codice all'interno del ciclo che controlla la collisione con un germoglio:

 self.gameLayer.player.score + = kSproutHitPoints + (arc4random ()% self.gameLayer.level) * (arc4random ()% self.gameLayer.level); [[NSNotificationCenter defaultCenter] postNotificationName: oggetto kNotificationPlayerScore: nil];

Questo aumenta il punteggio del giocatore in base ai punti base e una certa quantità di casualità in base al livello corrente. In questo modo, quando il giocatore sale di livello, guadagna più punti per estrarre i germogli.

Come abbiamo fatto quando abbiamo impostato il punteggio iniziale, dobbiamo pubblicare una notifica che aggiornerà l'etichetta del punteggio del giocatore. Questo viene fatto su ogni aggiornamento del punteggio. Se esegui il gioco a questo punto, dovresti vedere l'etichetta del punteggio del giocatore che si aggiorna ogni volta che colpisci un germoglio.

Il prossimo posto che aggiungeremo il punteggio è quando viene colpito il bruco. Alla fine del aggiornare: metodo in Missile.m, aggiungi il seguente codice prima di dividere il bruco:

 if (hitCaterpillar && hitSegment) // Aggiungi queste righe self.gameLayer.player.score + = kCaterpillarHitPoints + (arc4random ()% self.gameLayer.level) * (arc4random ()% self.gameLayer.level); [[NSNotificationCenter defaultCenter] postNotificationName: oggetto kNotificationPlayerScore: nil]; // ... codice per dividere il bruco ...

Questo codice non è molto diverso da quello che hai visto sopra. Il punto finale per aggiungere il punteggio è quando il giocatore avanza di livello. Questo codice verrà inserito all'interno del checkNextLevel metodo che hai scritto sopra. Apri GameLayer.m, vai a checkNextLevel metodo e aggiungere il seguente codice subito dopo l'istruzione if:

 self.player.score + = kNextLevelPoints * self.level; [[NSNotificationCenter defaultCenter] postNotificationName: oggetto kNotificationPlayerScore: nil];

Nessuna sorpresa qui. Se vuoi aggiungere qualche variazione al punteggio nel tuo gioco, sentiti libero di modificare i valori del punteggio.


Passaggio 3: Game Over

A partire da ora, il tuo giocatore ha il genio del gioco e ha vite infinite. Dobbiamo cambiarlo. Innanzitutto, crea un nuovo file chiamato GameOverLayer.m che estende CCLayer.

Aggiungere il seguente codice a GameOverLayer.h:

 #import "cocos2d.h" #import "GameConfig.h" @interface GameOverLayer: CCLayer @property (nonatomic, assign) NSInteger score; @property (nonatomic, retain) CCLabelTTF * scoreLabel; @property (nonatomic, retain) CCLabelTTF * highScoreLabel; + (CCScene *) sceneWithScore: punteggio (NSInteger); @fine

Spiegherò cosa fanno ciascuna di queste proprietà e questi metodi durante l'implementazione. Ora aggiungi il seguente codice a GameOverLayer.m

 #import "GameOverLayer.h" #import "GameLayer.h" #import "SimpleAudioEngine.h" @implementation GameOverLayer @synthesize score = _score; @synthesize scoreLabel = _scoreLabel; @synthesize highScoreLabel = _highScoreLabel; // 1 + (CCScene *) sceneWithScore: punteggio (NSInteger) // 'scene' è un oggetto autorelease. Scena CCScene * = [nodo CCScene]; // 'layer' è un oggetto autorelease. GameOverLayer * layer = [nodo GameOverLayer]; layer.score = punteggio; // aggiungi layer come child alla scena [scene addChild: layer]; // restituisce la scena di ritorno della scena;  // 2 - (void) dealloc [_scoreLabel release]; [_highScoreLabel release]; [super dealloc];  - (id) init if ((self = [super init])) // 3 [CCTexture2D setDefaultAlphaPixelFormat: kCCTexture2DPixelFormat_RGB565]; CCSprite * background = [CCSprite spriteWithFile: @ "game-over.png"]; background.anchorPoint = ccp (0,0); [self addChild: background]; // 4 _scoreLabel = [[CCLabelTTF labelWithString: @ "0" dimensioni: CGSizeMake (320, 30) allineamento: UITextAlignmentCenter fontName: @ "Helvetica" fontSize: 30] retain]; _scoreLabel.anchorPoint = ccp (0,0); _scoreLabel.position = ccp (0,155); [self addChild: _scoreLabel]; _highScoreLabel = [[CCLabelTTF labelWithString: [NSString stringWithFormat: @ "Alto:% d", 0] dimensioni: CGSizeMake (320, 35) allineamento: UITextAlignmentCenter fontName: @ "Helvetica" fontSize: 30] retain]; _highScoreLabel.anchorPoint = ccp (0,0); _highScoreLabel.color = (ccColor3B) 255,0,0; _highScoreLabel.position = ccp (0,195); [self addChild: _highScoreLabel]; // 5 [[CCTouchDispatcher sharedDispatcher] addTargetedDelegate: self priority: 0 swallowsTouches: YES]; [[SimpleAudioEngine sharedEngine] playEffect: @ "game-over.caf"];  return self;  - (void) setScore: (NSInteger) score _score = score; self.scoreLabel.string = [NSString stringWithFormat: @ "Punteggio:% d", _ punteggio]; // 6 NSUserDefaults * defaults = [NSUserDefaults standardUserDefaults]; HighScore NSInteger = [defaults integerForKey: @ "CentipedeHighScore"]; // 7 if (score> highScore) highScore = score; [defaults setInteger: score forKey: @ "CentipedeHighScore"]; [default si sincronizza];  self.highScoreLabel.string = [NSString stringWithFormat: @ "High:% d", highScore];  // 8 - (BOOL) ccTouchBegan: (UITouch *) touch withEvent: (UIEvent *) event [[CCDirector sharedDirector] replaceScene: [CCTransitionFade transitionWithDuration: .5 scene: [Scene GameLayer] withColor: ccWHITE]]; return YES;  @fine
  1. Questo è il nostro metodo standard per creare una nuova scena. L'unica differenza è che richiede un NSInteger e lo imposta sul punteggio corrente.
  2. Pulire
  3. Render lo sfondo
  4. Imposta le etichette per visualizzare il punteggio e il punteggio più alto
  5. Abilita tocchi
  6. Guarda il punteggio più alto
  7. Confronta il nuovo punteggio con il punteggio più alto, salva il nuovo punteggio se è più alto.
  8. Inizia una nuova partita se il giocatore tocca lo schermo

Ecco uno screenshot di ciò che questo schermo dovrebbero Assomiglia a:

L'ultimo passo è aprire GameLayer.m e aggiungere le seguenti righe alla fine del updateLives metodo:

 if (lifeCount == 0) [[CCDirector sharedDirector] replaceScene: [CCTransitionFade transitionWithDuration: .5 scene: [GameOverLayer sceneWithScore: self.player.score] withColor: ccWHITE]]; 

Questo controlla se le vite sono impostate su 0. Se è così, sostituiamo la scena corrente con la scena Game Over.


Passaggio 4: Audio di gioco

Il passo finale nel nostro gioco polacco è aggiungere suono. Innanzitutto, scarica i suoni di seguito e aggiungili al tuo progetto:

GameSounds.zip

Tradizionalmente, la gestione del suono è stata piuttosto dura in un gioco OpenGL. Dovresti usare qualcosa come OpenAL o un'altra complicata libreria C ++. Cocos2D ha semplificato notevolmente le cose con le loro SimpleAudioEngine biblioteca. Ti dà la possibilità di riprodurre facilmente musica di sottofondo in loop e suoni veloci.

Di nuovo, faremo un bel salto. Quindi, se il posizionamento di qualche codice non è chiaro, ti preghiamo di chiedermelo nei commenti o fare riferimento al codice sorgente di questo tutorial.

Apri AppDelegate.m e importa SimpleAudioEngine.h e aggiungi la seguente riga in fondo al file applicationDidFinishLaunching metodo.

 [[SimpleAudioEngine sharedEngine] playBackgroundMusic: @ "background.caf"]; i

Questo è tutto! È necessaria una sola riga per riprodurre la nostra musica di sottofondo per la durata del tempo di riproduzione. Ora abbiamo solo bisogno di riprodurre effetti sonori in risposta a varie azioni.

In Caterpillar.m, quando il Caterpillar entra in collisione con il giocatore (verso la fine del aggiornare: metodo):

 [[SimpleAudioEngine sharedEngine] playEffect: @ "player-hit.caf"];

In Missile.m, quando il Missile colpisce il Germoglio:

 [[SimpleAudioEngine sharedEngine] playEffect: @ "sprout-hit.caf"];

Anche in Missile.m, quando il missile colpisce il Caterpillar:

 [[SimpleAudioEngine sharedEngine] playEffect: @ "caterpillar-hit.caf"];

Nel metodo init in GameOverLayer.m:

 [[SimpleAudioEngine sharedEngine] playEffect: @ "game-over.caf"];

Dovrebbe coprire tutti i suoni che ho usato nel gioco. Inoltre, assicurati di importare SimpleAudioEngine.h in ognuna delle classi di cui sopra.


Conclusione

Questo conclude la serie di tutorial in 7 parti sulla creazione di un gioco Caterpillar utilizzando Cocos2D per l'iPhone. A questo punto, dovresti avere una solida conoscenza di come progettare e costruire un gioco semplice usando il motore di gioco Cocos2D. Se avete domande o commenti, non esitate a lasciarli nella sezione commenti qui o scriveteli su Twitter.

Buona programmazione!