@property (nonatomic, assign) float positionY;
+ (Shoot *)shootWithPositionX:(float)positionX
andPositionY:(float)positionY;
- (void)start;
@end
Vamos implementar os métodos na Shoot.m:
@implementation Shoot
+ (Shoot *)shootWithPositionX:(float)positionX
andPositionY:(float)positionY
{
Shoot *shoot = [Shoot spriteWithFile:kSHOOT];
// Posiciona o Tiro recém criado no ponto indicado
shoot.positionX = positionX;
shoot.positionY = positionY;
shoot.position
= ccp(shoot.positionX, shoot.positionY);
return shoot;
}
- (void)start
{
// Inicia a Animação / Movimentação do Tiro
[self scheduleUpdate];
}
- (void)update:(float)dt
{
// Move o Tiro para cima
self.positionY += 2;
self.position = ccp(self.positionX, self.positionY);
}
103
6.3. Atirando
Casa do Código
@end
Tiro e tela de jogo
Até aqui, a classe de tiro foi definida. Agora vamos à tela do jogo para adicionar esse novo elemento. Duas coisas são necessárias nesse momento. A primeira é a camada do Cocos2D para que os tiros apareçam. A segunda é um NSMutableArray
que guardará os tiros para que possamos detectar a colisão com os meteoros. Altere a GameScene.h:
# import "Shoot.h"
//...
@property (nonatomic, retain) CCLayer *shootsLayer;
@property (nonatomic, retain) NSMutableArray *shootsArray;
Além de criar as propriedade, é necessário inicializá-las. No construtor criare-
mos a camada.
- (id)init
{
self = [super init];
if (self) {
//...
// CCLayer para os Tiros
self.shootsLayer = [CCLayer node];
[self addChild:self.shootsLayer];
}
return self;
}
E no método addGameObjects criaremos o array.
- (void)addGameObjects
{
//...
self.shootsArray = [NSMutableArray array];
//...
}
104
Casa do Código
Capítulo 6. Criando o Player
Atirando!
Já temos a classe do tiro e também a preparação na tela de jogo para o link entre esses dois objetos. O que fizemos até aqui foi preparar a estrutura para que o tiro aconteça. Vamos nos concentrar agora na relação entre o tiro e o Player.
Nesse momento, iremos definir o método que o player notificará o delegate de
que ele está atirando. Inclua o método no PlayerDelegate da Player.h:
# import "Shoot.h"
//...
@protocol PlayerDelegate <NSObject>
- (void)playerDidCreateShoot:(Shoot *)shoot;
@end
Nesse
momento,
implementaremos
a
interface
PlayerDelegate
na
GameScene.
Dessa forma, a tela de jogo saberá o que deve fazer
quando for requisitada para atirar.
A interface obriga a criação do método
playerDidCreateShoot:. Nele, um novo tiro, que é recebido como parâmetro,
é adicionado à camada e ao array de tiros. Além disso, chama o método start da
classe Shoot, permitindo que ela controle o que for necessário lá dentro.
Primeiramente, implemente o método
playerDidCreateShoot:
na
GameScene.m
- (void)playerDidCreateShoot:(Shoot *)shoot
{
// O Player indicou que um novo Tiro foi criado
[self.shootsLayer addChild:shoot];
[shoot start];
[self.shootsArray addObject:shoot];
}
Criaremos na classe Player um método chamado shoot para disparar os ti-
ros. Precisamos disso por um fato muito importante, que é o posicionamento inicial do tiro. Lembre-se que o tiro deve sair da nave, portanto o Player e seu posicionamento são muito importantes. O método shoot conterá todas as variáveis de
posicionamento da nave na hora do tiro.
Declare o método na Player.h:
- (void)shoot;
Implemente o código de tiro na Player.m:
105
6.3. Atirando
Casa do Código
- (void)shoot
{
// Aqui será disparado o tiro!
}
Apertando o botão!
A GameScene.m é quem tem o menu de botões e recebe o input do usuário, ou
seja, o momento em que o botão é pressionado, e consequentemente o tiro disparado.
Vamos alterar o método shoot:, disparado pelo botão de tiro, para chamar o
método de atirar do Player:
- (void)shoot:(id)sender
{
NSLog(@"Botão selecionado: Atirar");
[self.player shoot];
}
Player atirando
Tudo pronto para atirar a partir do botão de tiro pressionado! Temos a classe de
tiro definida, o botão de tiro programado e a tela de jogo com a camada e métodos necessários prontos. Precisamos que alguém dê o comando de atirar e nada melhor
que o próprio Player para fazer isso! Vamos alterar o método shoot da Player.m
para que capture o posicionamento da nave e chame seu delegate para
criação do tiro.
Bang!
- (void)shoot
{
// Atira
if ([self.delegate respondsToSelector:
@selector(playerDidCreateShoot:)]) {
[self.delegate playerDidCreateShoot:
[Shoot shootWithPositionX:self.positionX
andPositionY:self.positionY]];
}
}
106
Casa do Código
Capítulo 6. Criando o Player
Figura 6.4: Player atirando.
6.4
Movendo o player
Vamos fechar esse capítulo com uma das partes mais importantes do jogo. Após
atirar, moveremos o Player para esquerda e direita. Utilizaremos a mesma estratégia de atirar, mas agora as coisas serão mais simples.
Para iniciar, o Player deve saber se mover. Movimentar o player é fazer com
que sua posição X seja atualizada quando um evento for detectado.
Na classe Player adicionaremos dois novos métodos, que quando chamados,