de jogos, pois programaremos o objeto que será controlado pelos inputs do usuário.
Para isso, utilizaremos a maioria dos elementos do framework Cocos2D que vi-
mos até agora para trabalhar com o player. Utilizaremos camadas, sprites e os conceitos vistos anteriormente.
Nossa tela de jogo precisará de mais uma camada, utilizaremos Sprites para
o Player e detectaremos inputs do usuário para movê-lo.
Resumidamente, nesse capítulo faremos:
Colocar o player na tela
Movimentar o player
E atirar!
6.1. Desenhando o Player
Casa do Código
Daremos um passo importante na construção do jogo nesse capítulo, o objetivo
final é ter a cena a seguir, ainda sem detectar colisões.
Figura 6.1: 14 bis atirando contra os meteoros.
6.1
Desenhando o Player
Iniciaremos pela imagem, adicionando a figura do player no Assets.h.
@interface Assets : NSObject
# define kNAVE
@"nave.png"
@end
94
Casa do Código
Capítulo 6. Criando o Player
Criaremos o objeto principal e, como anteriormente, controlamos figuras e ima-
gens herdando do CCSprite do Cocos2D.
Utilizaremos o método que retorna a largura da tela para centralizar o Player.
Precisamos de variáveis que guardem essas posições pois precisaremos alterá-las
mais à frente.
Como já utilizado pelas outras classes, manteremos o link entre tela de abertura
e player utilizando um delegate.
Na Player.h iremos declarar nossas propriedades de posição do player, e o
construtor.
@protocol PlayerDelegate;
@interface Player : CCSprite
@property (nonatomic, assign) id<PlayerDelegate>delegate;
@property (nonatomic, assign) float positionX;
@property (nonatomic, assign) float positionY;
+ (Player *)player;
@end
@protocol PlayerDelegate <NSObject>
// Vamos criar os métodos de delegate mais pra frente
@end
A Player.m será iniciada da seguinte maneira:
# import "Player.h"
@implementation Player
+ (Player *)player
{
Player *player = [Player spriteWithFile:kNAVE];
// Posiciona o Player recém criado
player.positionX = SCREEN_WIDTH() / 2.0f;
player.positionY = 120.0f;
player.position = ccp(player.positionX, player.positionY);
95
6.1. Desenhando o Player
Casa do Código
return player;
}
O objeto Player já está pronto para ser inicializado, mas ainda não existe uma
camada na tela do jogo responsável por mostrá-lo. Para que o player apareça na
tela do jogo, temos que adicionar mais uma camada. Essa camada terá o nome de
playerLayer.
Na GameScene.h vamos declarar as propriedades da layer e do player, além de
informar que ela implementará o protocolo PlayerDelegate:
# import "Player.h"
//...
@interface GameScene : CCLayer <MeteorsEngineDelegate, PlayerDelegate>
//...
@property (nonatomic, retain) CCLayer *playerLayer;
@property (nonatomic, retain) Player *player;
Na GameScene.m é necessário adicionar a variável de layer e iniciá-la no cons-
trutor. Após isso, adicione a camada criada através do método addGameObjects.
- (id)init
{
self = [super init];
if (self) {
//...
// CCLayer para o Jogador
self.playerLayer = [CCLayer node];
[self addChild:self.playerLayer];
[self addGameObjects];
}
return self;
}
- (void)addGameObjects
{
// Inicializa os Arrays
self.meteorsArray = [NSMutableArray array];
96
Casa do Código
Capítulo 6. Criando o Player
// Inicializa a Engine de Meteoros
self.meteorsEngine = [MeteorsEngine meteorEngine];
// Cria o Player
self.player = [Player player];
self.player.delegate = self;
[self.playerLayer addChild:self.player];
}
Figura 6.2: 14 bis pronto para ação.
97
6.2. Botões de controle
Casa do Código
6.2
Botões de controle
Já temos o player aparecendo na tela. Além disso, ele já está em uma camada da tela do game, o que faz com que seja renderizado durante o jogo.
Vamos agora adicionar outros elementos à tela, para que o player possa ser co-
mandado pelos inputs do usuário. Para isso, precisaremos de novas imagens para
esses controles.
Iniciaremos adicionando 3 imagens, duas para movimentar o player entre di-
reita e esquerda e outra que será o botão de atirar. Essas imagens serão incluídas no arquivo Assets.h.
@interface Assets : NSObject
# define kLEFTCONTROL
@"left.png"
# define kRIGHTCONTROL @"right.png"
# define kSHOOTBUTTON
@"shootButton.png"
@end
Para os botões, poderíamos utilizar novamente a classe CCMenuItemSprite.
Entretanto, os objetos do tipo CCMenuItemSprite são ativados somente quando
o usuário retira o dedo do botão. Este comportamento é aceitável para botões de
menu, porém, para jogos o ideal é que o botão execute a ação no momento que o
usuário tocá-lo, e não após retirar o dedo.
Para isto, criaremos a classe CCMenuItemGameButton que irá sobrescrever
alguns métodos padrões da CCMenuItemSprite, a fim de que as ações dos botões
sejam executadas logo quando o botão for tocado.
Crie a classe CCMenuItemGameButton, subclasse da CCMenuItemSprite.
No arquivo header CCMenuItemGameButton.h não é necessário nenhuma al-
teração.
Vamos apenas alterar os métodos de ativação e seleção do botão na