78
Casa do Código
Capítulo 5. Tela do jogo e objetos inimigos
O Maestro
Idealmente, essa classe não deve ter muitas responsabilidades, mas sim funci-
onar como um orquestrador de todos os elementos, ou seja, um maestro em uma
orquestra, que dirige e comanda o que todos os outros elementos fazem e como eles interagem entre si.
Ela será a classe que inicializa objetos no jogo, que coloca objetos na tela, porém o comportamento de cada um deles será representado individualmente em cada classe
correspondente.
Algumas das responsabilidades da GameScene, a classe maestro do jogo, devem
ser:
Iniciar a tela do game e organizar as camadas
Adicionar objetos como player, inimigos e botões à essas camadas
Inicializar cada um desses objetos
Checar colisões entre objetos
A classe GameScene tem muita responsabilidade, porém não detém regras e
lógicas de cada elemento. Outra função importante dessa classe é aplicar um dos
conceitos vistos anteriormente, do game loop.
Vamos então criar a classe GameScene já colocando um background como fi-
zemos anteriormente na tela de abertura. O header GameScene.h ficará assim:
@interface GameScene : CCLayer
+ (CCScene *)scene;
@end
E o implementation GameScene.m
# import "GameScene.h"
@implementation GameScene
+ (CCScene *)scene
{
// 'scene' is an autorelease object.
79
5.2. Transição de telas
Casa do Código
CCScene *scene = [CCScene node];
// 'layer' is an autorelease object.
GameScene *layer = [GameScene node];
// add layer as a child to scene
[scene addChild:layer];
// return the scene
return scene;
}
- (id)init
{
self = [super init];
if (self) {
// Imagem de Background
CCSprite *background = [CCSprite spriteWithFile:kBACKGROUND];
background.position =
ccp(SCREEN_WIDTH() / 2.0f, SCREEN_HEIGHT() / 2.0f);
[self addChild:background];
}
return self;
}
@end
5.2
Transição de telas
Para que o jogo comece, precisamos fazer o link entre a tela de abertura e a tela do game!
Aqui utilizaremos o CCDirector que sabe manter uma CCScene ativa por vez.
Além de trocar de uma tela para outra, o Cocos2D nos permite escolher e configurar detalhes dessa transição.
Utilizaremos o método replaceScene: que fará uma transição com o tempo
de pausa entre uma tela e outro, gerando um efeito suave.
Para isso, na classe TitleScreen, mudamos o playGame: para que botão de
play comece o jogo. Importe a GameScene na TitleScreen.h
# import "GameScene.h"
80
Casa do
Código
Capítulo 5. Tela do jogo e objetos inimigos
E mude o método playGame::
//...
- (void)playGame:(id)sender
{
NSLog(@"Botão selecionado: Play");
[[CCDirector sharedDirector]
replaceScene:[CCTransitionFade transitionWithDuration:1.0
scene:[GameScene scene]]];
}
Rode o jogo e clique no botão play. O que acontece? Por enquanto, só temos a
tela de background!
5.3
Engines
Temos a classe que orquestrará os objetos do game e criaremos agora classes res-
ponsáveis por gerenciar outros elementos. O primeiro elemento que teremos serão
os inimigos. Nossos inimigos serão meteoros que cairão e precisarão ser destruídos pelo player.
Criaremos uma nova camada, um novo layer para representar esses inimi-
gos. Como utilizado anteriormente, camadas são representadas por heranças ao
CCLayer do Cocos2D.
Engine de objetos inimigos
Nossa camada de objetos inimigos, os meteoros, será responsável por criar ini-
migos e enviar à tela do jogo. Essa engine de meteoros não é responsável pelo movimento do meteoro em si, mas sim de controlar a aparição deles na tela e fazer o link entre objeto Meteoro e tela do Game.
precisaremos manter o link entre a tela principal do game e a engine de inimigos.
Essa é uma parte complexa do desenvolvimento de games. Não é simples coordenar
objetos com ciclos de vida diferentes que rodam pela aplicação. O que faremos aqui é utilizar o Design Pattern de delegate para auxiliar na comunicação entre os objetos.
Delegates são muito utilizados em games e aplicações iOS. Você já deve ter
visto este conceito em diversas outras classes do iOS, como a UITableView e
UIScrollView por exemplo.
A engine de inimigos sabe como e quando criar os inimigos. Mas apenas isto.
81
5.3. Engines
Casa do Código
Nossa tela principal é que sabe em qual camada incluir o inimigo, além de conhecer todos os demais objetos (players, tiros etc) para poder checar a colisão entre eles.
Em nosso game, a tela principal do jogo será o delegate da engine de inimigos.
Ou seja, a tela principal do jogo será responsável por escutar e tratar as instruções da engine de inimigo. Pense da seguinte maneira: a engine de inimigos irá dizer Ei delegate! Eu quero criar o inimigo!, e a tela principal irá responder OK! Vou criar o inimigo. Deixe comigo que daqui pra frente eu cuido dele!.
É importante que uma Engine saiba quando é o momento de colocar um novo
elemento no jogo. Muitas vezes, principalmente para objetos inimigos, utilizamos
números randômicos para definir a hora de colocar um novo inimigo na tela.
Essa ideia foi muito utilizada por jogos em que o nível mais difícil era apenas uma equação na qual o número randômico gerado satisfazia uma condição de entrada em