Leite Anderson - Desenvolvimento de Jogos para iOS стр 26.

Шрифт
Фон

@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"

Ваша оценка очень важна

0
Шрифт
Фон

Помогите Вашим друзьям узнать о библиотеке