Casa do Código
Capítulo 2. Protótipo de um jogo
@property (nonatomic, strong) UILabel *gameScoreLabel;
- (void)increaseScore:(int)points;
Na Impossible.m vamos instanciar o label do score e implementar o método
que aumenta o score:
- (id)init
{
//...
// Criação do Label que exibirá o score do jogador
self.gameScoreLabel = [[UILabel alloc]
initWithFrame:CGRectMake(20.0f, 85.0f, 300.0f, 30.0f)];
self.gameScoreLabel.font = [UIFont systemFontOfSize:25.0f];
self.gameScoreLabel.textColor = [UIColor whiteColor];
self.gameScoreLabel.backgroundColor = [UIColor clearColor];
self.gameScoreLabel.text = @"0";
[self addSubview:self.gameScoreLabel];
//...
}
// Soma Pontos
- (void)increaseScore:(int)points
{
if (self.running == YES) {
self.score += points;
self.gameScoreLabel.text = [NSString stringWithFormat:@"%d",
self.score];
}
}
No método que recebe o evento de toque, incrementaremos os pontos. Atualize
o método handleTapGesture: do arquivo GameViewController.m:
- (void)handleTapGesture:(UITapGestureRecognizer *)gesture
{
if (gesture.state == UIGestureRecognizerStateEnded) {
[self.impossibleView moveDown:10];
[self.impossibleView increaseScore:100];
}
}
41
2.8. Criando botões de interface do usuário
Casa do Código
O jogo deve estar assim:
Figura 2.15: Score aparece na tela.
2.8
Criando botões de interface do usuário
Outro conceito importante em jogos é a possibilidade de interagir com elementos
de configuração do game. Poder pausar o jogo, entrar em uma tela para mudar, por
exemplo, a dificuldade ou mesmo fechar e sair do jogo são partes importante do
desenvolvimento.
No protótipo, ilustraremos esse conceito com duas opções na tela, para Restart
(reiniciar) e Stop (parar). Simplificaremos para entender o conceito, e depois, poderemos converter para botões mais interessantes.
42
Casa do Código
Capítulo 2. Protótipo de um jogo
No arquivo GameViewController.m crie os botões e métodos para o Restart
e Stop:
- (void)viewDidLoad
{
//...
// Botão para Reiniciar o jogo
UIButton *buttonRestart =
[UIButton buttonWithType:UIButtonTypeCustom];
[buttonRestart setTitle:@"Restart"
forState:UIControlStateNormal];
buttonRestart.contentHorizontalAlignment =
UIControlContentHorizontalAlignmentLeft;
buttonRestart.frame = CGRectMake(20.0f, 170.0f, 80.0f, 35.0f);
[buttonRestart addTarget:self
action:@selector(restart:)
forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:buttonRestart];
// Botão para Parar o jogo
UIButton *buttonStop =
[UIButton buttonWithType:UIButtonTypeCustom];
[buttonStop setTitle:@"Stop" forState:UIControlStateNormal];
buttonStop.contentHorizontalAlignment =
UIControlContentHorizontalAlignmentLeft;
buttonStop.frame = CGRectMake(20.0f, 250.0f, 80.0f, 35.0f);
[buttonStop addTarget:self
action:@selector(stop:)
forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:buttonStop];
}
- (void)restart:(id)sender
{
// Reinicia o jogo
// Já vamos aprender o que fazer aqui!
}
- (void)stop:(id)sender
{
// Para o jogo
43
2.8. Criando botões de interface do usuário
Casa do Código
// Já vamos aprender o que fazer aqui!
}
Rode o jogo e veja que os botões de Restart e Stop já aparecem na tela.
Figura 2.16: Botões de Restart e Stop na tela.
Agora, precisaremos de uma forma de parar e reinicializar as propriedades do
game. No arquivo Impossible.h defina os métodos restart e stopGame:
- (void)restart;
- (void)stopGame;
No arquivo Impossible.m implemente estes métodos. Repare que, para o
restart, utilizaremos uma abordagem simples de reinicialização.
44
Casa do Código
Capítulo 2. Protótipo de um jogo
// Para o Jogo
- (void)stopGame
{
self.running = NO;
}
// Reinicia o jogo, redefinindo as variáveis
- (void)restart
{
self.enemyX = 0;
self.enemyY = 0;
self.enemyRadius = 0;
self.playerRadius = 25;
self.playerX = 160;
self.playerY = 275;
self.score = 0;
self.gameScoreLabel.text = @"0";
self.gameOverLabel.text = @"";
self.running = YES;
}
Precisamos agora alterar para que o toque dos botões chame estes métodos da
classe Impossible. Na GameViewController.m, altere os métodos restart:
e stop: :
- (void)restart:(id)sender
{
[self.impossibleView restart];
}
- (void)stop:(id)sender
{
[self.impossibleView stopGame];
}
A tela final do protótipo deve estar assim:
45
2.9. Adicionando mais vida: imagens da nave e do céu
Casa do Código
Figura 2.17: Protótipo final.
2.9
Adicionando mais vida: imagens da nave e do céu
Temos toda a lógica do protótipo rodando e já podemos, finalmente, alterar alguns elementos visuais para finalizar o protótipo do jogo e fechar os conceitos básicos.
Vamos desenhar um background que simule um céu escuro com estrelas. Para
isso, utilizaremos a imagem sky.png. Um ponto importante é reparar que quanto
mais sprites forem adicionados ao jogo, mais esforço computacional, o que pode
tornar o jogo mais lento. Mais a frente, utilizaremos frameworks que otimizam essa questão.