CCMenuItemGameButton.m:
@implementation CCMenuItemGameButton
- (void)selected
{
// Quando está "selected", aciona o "activate" para disparar o botão
// antes de o jogador tirar o dedo da tela
[super activate];
}
98
Casa do Código
Capítulo 6. Criando o Player
- (void)activate
{
// Não chama mais o super "activate" aqui, já que este foi
// acionado no método "selected"
// [super activate];
}
@end
Pronto, temos nosso botão customizado criado. Agora vamos incluir os botões
na tela alterando a classe GameScene. Vamos importar a classe de botões e definir sua camada, a declarando na GameScene.h:
# import "CCMenuItemGameButton.h"
//...
@property (nonatomic, retain) CCLayer *gameButtonsLayer;
No arquivo de implementação GameScene.m, vamos instanciar a camada
dos botões e criar o menu.
Perceba que os botões serão criados da mesma
forma que fizemos na TitleScreen, mas desta vez utilizaremos nossa classe
CCMenuItemGameButton:
- (id)init
{
self = [super init];
if (self) {
//...
// CCLayer para os Botões
self.gameButtonsLayer = [CCLayer node];
[self addChild:self.gameButtonsLayer];
// Cria os botões
CCMenuItemGameButton *leftControl = [CCMenuItemGameButton
itemWithNormalSprite:[CCSprite spriteWithFile:kLEFTCONTROL]
selectedSprite:[CCSprite spriteWithFile:kLEFTCONTROL]
target:self
selector:@selector(moveLeft:)];
CCMenuItemGameButton *rightControl = [CCMenuItemGameButton
itemWithNormalSprite:[CCSprite spriteWithFile:kRIGHTCONTROL]
selectedSprite:[CCSprite spriteWithFile:kRIGHTCONTROL]
target:self
99
6.2. Botões de controle
Casa do Código
selector:@selector(moveRight:)];
CCMenuItemGameButton *shootButton = [CCMenuItemGameButton
itemWithNormalSprite:[CCSprite spriteWithFile:kSHOOTBUTTON]
selectedSprite:[CCSprite spriteWithFile:kSHOOTBUTTON]
target:self
selector:@selector(shoot:)];
// Define as posições dos botões
leftControl.position = ccp(-110.0f,
(SCREEN_HEIGHT() / -2.0f) + 50.0f);
rightControl.position = ccp(-50.0f,
(SCREEN_HEIGHT() / -2.0f) + 50.0f);
shootButton.position = ccp((SCREEN_WIDTH() / 2.0f) - 50.0f,
(SCREEN_HEIGHT() / -2.0f) + 50.0f);
// Cria o menu que terá os botões
CCMenu *menu = [CCMenu menuWithItems:leftControl,
rightControl,
shootButton,
nil];
[self.gameButtonsLayer addChild:menu];
[self addGameObjects];
}
return self;
}
Por fim, é necessário criar os métodos que receberão os inputs dos botões:
- (void)moveLeft:(id)sender
{
NSLog(@"Botão selecionado: Esquerda");
}
- (void)moveRight:(id)sender
{
NSLog(@"Botão selecionado: Direita");
}
- (void)shoot:(id)sender
{
100
Casa do Código
Capítulo 6. Criando o Player
NSLog(@"Botão selecionado: Atirar");
}
Rode o jogo e aperte os botões. Veja que eles respondem logo quando você os
toca, e não quando retira o dedo da tela!
Figura 6.3: Controles de direção e tiro.
Imagens posicionadas e preparadas. Hora de começar a ação!
6.3
Atirando
Falaremos agora de uma parte do jogo que pode parecer simples a princípio, mas
tem impacto em muitas outras partes para que funcione: o tiro! Para que a nave
101
6.3. Atirando
Casa do Código
atire, precisaremos de uma série de coisas, portanto, vamos primeiro listar o que será necessário para organizar o pensamento antes de ir para o código.
Um novo asset, ou seja, imagem do tiro
Uma classe que represente o tiro como um CCSprite
Definir o posicionamento do tiro na tela
Uma engine responsável por criar um tiro
Uma camada na tela do jogo para os tiros
Associar o tiro e o player, para que o tiro saia do player
Há muita coisa para que o tiro de fato aconteça, porém, se listarmos cada uma
dessas dependências podemos simplificar o desenvolvimento. Iniciaremos adicio-
nando a figura do tiro na classe Assets.h.
@interface Assets : NSObject
# define kSHOOTBUTTON
@"shootButton.png"
@end
Podemos iniciar a programação do tiro. Antes de pensar em fazer a nave atirar
ou algo assim, vamos tentar pensar em o que é o tiro?. O tiro é um sprite, ou seja, uma imagem, que anda pela tela de baixo para cima. Assim, uma vez que um tiro
aparece na tela, precisamos movimentá-lo para cima com o passar do tempo.
Para gerar essa sensação de movimento e controlar esses updates do posiciona-
mento do tiro no eixo vertical, criaremos um método com o nome update:. Esse
método será executado pelo Cocos2D a cada iteração. O framework manda como
parâmetro um tempo de execução, para que possa ser analisado se algo deve ou não
ser executado desde a última vez que ele invocou esse método. No nosso caso, esse parâmetro não será utilizado, pois a lógica do tiro é pelo toque no botão e não por uma regra de tempo.
A classe de tiro precisa manter o link com a tela de jogo, então utilizaremos o
delegate. Criaremos também um método chamado start, que será utilizado para
indicar que o tiro está funcionando.
Declare as propriedades e métodos na Shoot.h:
102
Casa do Código
Capítulo 6. Criando o Player
@interface Shoot : CCSprite
@property (nonatomic, assign) float positionX;