que renderizar as atualizações do jogo a todo momento. Uma UIView desenha os
objetos em seu método drawRect:. Este método é chamado toda vez que o iOS
identificar que a nossa UIView deve ser redesenhada.
Para desenhar vamos usar as funções da CGContext, presente no framework
CoreGraphics da Apple. Com ela, conseguiremos definir elementos como textos,
linhas, figuras geométricas, cores e tudo que for referente a colocar os elementos do jogo na tela. Chamamos de context o contexto atual onde o iOS está desenhando
objetos.
Vamos começar sobrescrevendo o método
drawRect: em nossa classe
Impossible.m, e declarando uma variável para buscar o contexto atual onde es-
tão sendo desenhados os objetos:
- (void)drawRect:(CGRect)rect
{
CGContextRef context = UIGraphicsGetCurrentContext();
// desenha o player
// o que fazer aqui??? já vamos aprender
}
No momento em que sobrescrevemos o método drawRect: da UIView, temos
total controle do que iremos desenhar ou não em nossa tela.
Finalmente vamos desenhar o player! Utilizaremos nossos pincéis, no caso, as
funções do CGContext. Para não deixar o método drawRect: muito longo, vamos
criar um outro método:
- (void)drawPlayerInContext:(CGContextRef)context
{
UIGraphicsPushContext(context);
CGContextBeginPath(context);
CGContextAddArc(context,
160,
275,
25,
0,
(2 * M_PI),
YES); // Circulo de 360° (0 ~ 2pi)
22
Casa do Código
Capítulo 2. Protótipo de um jogo
CGContextSetRGBFillColor(context, 0.0f, 0.9f, 0.0f, 1.0f);
CGContextFillPath(context);
UIGraphicsPopContext();
}
Para desenhar nosso player, criamos um círculo completo e preenchemos ele
com uma cor.
Agora basta invocar o método drawPlayer de dentro do nosso drawRect.
Repare que só precisamos alterar uma única linha, a que estava com um comentário:
- (void)drawRect:(CGRect)rect
{
CGContextRef context = UIGraphicsGetCurrentContext();
[self drawPlayerInContext:context];
}
Rode novamente o seu projeto. Obtivemos nosso primeiro resultado!
23
2.4. Captando os comandos do usuário e movendo objetos
Casa do Código
Figura 2.9: Player na tela.
2.4
Captando os comandos do usuário e movendo
objetos
Existem diversas maneiras de interagir com um jogo e com o player principal. Mover o mouse e clicar, utilizar o teclado, tocar a tela ou mesmo capturar o movimento de um aparelho, usando por exemplo, o acelerômetro. No protótipo, utilizaremos o
toque na tela para mover o player. Vamos capturar cada toque como sendo um input
do usuário e, a cada vez que isso ocorrer, iremos dar um comando ao nosso jogo.
Nesse momento vamos explorar esse conceito de inputs do usuário no iOS,
e novamente reparar na importância da
UIViewController principal como
24
Casa do Código
Capítulo 2. Protótipo de um jogo
porta de entrada do jogo.
Utilizaremos um objeto do próprio iOS chamado
UITapGestureRecognizer para identificar os toques na tela. Toda vez que um
toque for detectado, o UITapGestureRecognizer chamará um método passando
as coordenadas tocadas na superfície da tela. E de posse
dessas coordenadas, podemos tomar ações sobre os objetos na tela do jogo.
Nesse momento, ao detectar um toque, moveremos para baixo nosso player. Re-
pare que aqui poderíamos utilizar a informação que recebemos para tomar ações
interessantes no jogo, como mover para um lado ou para ou outro, mover mais rá-
pido etc. Para fim de entendimento de conceito e prototipação, seremos simples
nessa implementação.
Antes de mais nada, precisamos saber em que posição nosso player está. Declare
o atributo playerY no Impossible.h:
@property (nonatomic) int playerY;
Defina também um valor inicial para ele quando nossa classe for criada, no mé-
todo init da Impossible.m:
- (id)init
{
self = [super init];
if (self) {
// Timer que executa o Game Loop (método "run") 60 vezes por segun
self.gameRunTimer = [NSTimer
scheduledTimerWithTimeInterval:1.0f/60.0f
target:self
selector:@selector(run)
userInfo:nil
repeats:YES];
// Posição inicial do jogador
self.playerY = 275;
// Variável para controlar a execução do jogo
self.running = YES;
}
return self;
}
E, toda vez que invocarem o drawPlayerInContext:, vamos desenhá-lo
nessa altura, em vez daquele número fixo. Na Impossible.m altere:
25
2.4. Captando os comandos do usuário e movendo objetos
Casa do Código
// Desenha o Player
- (void)drawPlayerInContext:(CGContextRef)context
{
UIGraphicsPushContext(context);
CGContextBeginPath(context);
CGContextAddArc(context,
160.0f,
self.playerY,
25.0f,
0,
(2 * M_PI),
YES); // Círculo de 360° (0 ~ 2pi)
CGContextSetRGBFillColor(context, 0.0f, 0.9f, 0.0f, 1.0f);
CGContextFillPath(context);
UIGraphicsPopContext();
}
Ainda na Impossible.m teremos um método que pode ser invocado para mo-
ver o player para baixo (a tela do iPhone possui a posição 0,0 no canto superior
esquerdo):
- (void)moveDown:(int)pixels
{
if (self.running == YES) {
self.playerY += pixels;
}
}
Como este será um método público que deverá ser chamado pela nossa