@property (nonatomic, assign) float positionX;
@property (nonatomic, assign) float positionY;
+ (Shoot *)shootWithPositionX:(float)positionX
andPositionY:(float)positionY;
- (void)start;
- (void)explode;
@end
120
Casa do Código
Capítulo 7. Detectando colisões, pontuando e criando efeitos
@protocol ShootDelegate <NSObject>
- (void)shootWillBeRemoved:(Shoot *)shoot;
@end
Altere o método explode para que o meteoro notifique seu delegate de que ele
será removido:
- (void)explode
{
//...
// Notifica delegate
if ([self.delegate respondsToSelector:
@selector(shootWillBeRemoved:)]) {
[self.delegate shootWillBeRemoved:self];
}
}
Agora, na nossa GameScene, toda vez que criarmos um novo Meteor ou
Shoot, queremos possibilitar que eles avisem a própria GameScene de que se-
rão removidos. Em outras palavras, a GameScene será o delegate do Meteor
e do Shoot. Informe na GameScene.h de que ela implementará os protocolos
MeteorDelegate e ShootDelegate:
@interface GameScene : CCLayer <MeteorsEngineDelegate,
PlayerDelegate,
MeteorDelegate,
ShootDelegate>
Agora
altere
os
métodos
playerDidCreateShoot:
e
meteorsEngineDidCreateMeteor: na GameScene.m para que ele defina os
delegates:
- (void)playerDidCreateShoot:(Shoot *)shoot
{
// O Player indicou que um novo Tiro foi criado
[self.shootsLayer addChild:shoot];
shoot.delegate = self;
[shoot start];
[self.shootsArray addObject:shoot];
}
121
7.3. Player morre
Casa do Código
- (void)meteorsEngineDidCreateMeteor:(Meteor *)meteor
{
// A Engine de Meteoros indicou que um novo Meteoro foi criado
[self.meteorsLayer addChild:meteor];
meteor.delegate = self;
[meteor start];
[self.meteorsArray addObject:meteor];
}
Feito isso, basta fazer a remoção dos objetos na GameScene.m, implementando
os métodos meteorWillBeRemoved: e shootWillBeRemoved: dos protoco-
los:
- (void)meteorWillBeRemoved:(Meteor *)meteor
{
// Após atingido, um Meteoro notifica a GameScene
// para que seja removido do Array
meteor.delegate = nil;
[self.meteorsArray removeObject:meteor];
}
- (void)shootWillBeRemoved:(Shoot *)shoot
{
// Após explodir, um Tiro notifica a GameScene
// para que seja removido do Array
shoot.delegate = nil;
[self.shootsArray removeObject:shoot];
}
7.3
Player morre
Utilizando a mesma estratégia vamos animar o player quando um meteoro colidir
com ele. Para isso, na classe Player teremos o método explode como abaixo.
Declare-o na Player.h:
- (void)explode;
E o implemente na Player.m:
- (void)explode
{
122
Casa do Código
Capítulo 7. Detectando colisões, pontuando e criando efeitos
// Para o agendamento
[self unscheduleUpdate];
// Cria efeitos
float dt = 0.2f;
CCScaleBy *a1 = [CCScaleBy actionWithDuration:dt scale:2.0f];
CCFadeOut *a2 = [CCFadeOut actionWithDuration:dt];
CCSpawn *s1 = [CCSpawn actionWithArray:
[NSArray arrayWithObjects:a1, a2, nil]];
// Executa efeito
[self runAction:s1];
}
Para que seja executado, crie o método
playerHit:withMeteor: na
GameScene.m. Repare que este é o método de callback que definimos quando che-
camos as colisões entre os arrays de players e meteoros.
- (void)playerHit:(id)player withMeteor:(id)meteor
{
// Quando houve uma colisão entre Player e Meteoro,
// indica que ambos foram atingidos
if ([player isKindOfClass:[Player class]]) {
[(Player *)player explode];
}
if ([meteor isKindOfClass:[Meteor class]]) {
[(Meteor
*)meteor gotShot];
}
}
Rode o projeto e verifique a tela do jogo!
7.4
Placar
Para fechar esse capítulo, vamos adicionar uma pontuação para cada meteoro des-
truído após ser atingido por um tiro. Utilizaremos alguns conceitos já vistos anteriormente.
Primeiramente, trataremos o valor de pontos que aparece na tela como uma nova
camada, e camadas para o Cocos2D são classes que herdam de CCLayer.
123
7.4. Placar
Casa do Código
Essa camada apresentará os pontos em número para o jogador. Para isso, preci-
samos de duas variáveis. A primeira é do tipo inteiro, que guarda os pontos atuais.
A segunda é um campo de texto para colocar esse valor na tela.
Além disso, veremos como utilizar um tipo de letra (font type) diferente para fa-
zer isso. Existe no Cocos2D uma classe chamada CCLabelBMFont. Essa classe pos-
sui um método chamado labelWithString:fntFile: que recebe uma string e
uma fonte a ser usada. Depois disso, basta configurar o tamanho da letra e posicionamento.
Alteraremos o valor do score com um método chamado increase. Esse mé-
todo poderá ser chamado sempre que uma colisão entre tiro e meteoro for detectada.
Crie a classe Score e defina as propriedades e métodos em seu header Score.h.
@interface Score : CCLayer
@property (nonatomic, assign) int score;
@property (nonatomic, retain) CCLabelBMFont *text;
+ (Score *)score;
- (void)increase;
@end
No init da Score.m crie o label de texto:
+ (Score *)score
{
return [[[Score alloc] init] autorelease];
}
- (id)init
{
self = [super init];
if (self) {
// Inicializa a pontuação com o valor "0"