17
2.2. Criando a base do jogo
Casa do Código
# import <UIKit / UIKit.h>
# import "Impossible.h"
@interface GameViewController : UIViewController
@property
(nonatomic, strong) Impossible *impossibleView;
@end
Na GameViewController.m inicializaremos nossa impossibleView e adi-
cionaremos ela à tela:
- (void)viewDidLoad
{
[super viewDidLoad];
// Instancia um objeto do tipo Impossible
self.impossibleView = [[Impossible alloc] init];
// Define o tamanho dele, com base no tamanho da tela
self.impossibleView.frame = CGRectMake(0.0f,
0.0f,
self.view.frame.size.width,
self.view.frame.size.height);
[self.view addSubview:self.impossibleView];
}
Pode rodar seu projeto novamente, mas ainda não temos bons resultados! Parece
que um jogo ainda está longe de se concretizar, mas até o final do capítulo você já terá um protótipo para mostrar.
Game Loop
Normalmente os jogos têm um primeiro conceito importante: um
loop
infinito, conhecido como game loop ou main loop.
O jogo é uma série de iterações nesse loop infinito. Nele, o jogo define posições de elementos, desenha-os na tela, atualiza valores como placar, verifica colisões entre elementos. Isso tudo é realizado diversas vezes por segundo, em que cada tela desenhada é chamada de frame. Uma boa analogia são os desenhos feitos em blocos de papel, onde cada desenho (frame) é um pedaço da animação. Ao passar tudo
rapidamente temos a impressão de movimento.
18
Casa do Código
Capítulo 2. Protótipo de um jogo
Figura 2.7: Desenho animado em bloco de papel.
Esse conceito é extremamente importante e, com o passar do tempo, difícil de
lidar no desenvolvimento de um jogo. Com vários objetos tendo diversas possibi-
lidades na tela a chance de perder o controle é grande. Por isso, tente sempre criar métodos pequenos, com pouca responsabilidade. Dessa forma, encontrar o que pode
estar errado fica muito mais fácil.
Vamos colocar o nosso loop infinito dentro da classe Impossible. Para isto,
criaremos um timer que chamará um método 60 vezes por segundo, repetidamente.
Também teremos a propriedade running que controlará se o jogo está em execução
ou não. Primeiramente, inclua o código abaixo no Impossible.h:
@property (nonatomic, strong) NSTimer *gameRunTimer;
@property (nonatomic) BOOL running;
Então altere também o Impossible.m:
- (id)init
{
self = [super init];
19
2.3. Desenhando o objeto principal
Casa do Código
if (self) {
// Timer que executa o Game Loop ("run") 60 vezes por segundo
self.gameRunTimer = [NSTimer
scheduledTimerWithTimeInterval:1.0f/60.0f
target:self
selector:@selector(run)
userInfo:nil
repeats:YES];
// Variável para controlar a execução do jogo
self.running = YES;
}
return self;
}
// Game Loop
- (void)run
{
if (self.running == YES) {
NSLog(@"Impossible Running...!");
}
}
Como criamos nosso timer dentro do
init, no momento em que a
Impossible for criada ela já começará a repetir o run 60 vezes por segundo.
Rode o projeto novamente. Temos nossa primeira saída, ainda não muito em-
polgante. O console exibe Impossible Running...! infinitamente.
2.3
Desenhando o objeto principal
O motor do nosso jogo já está ligado, funcionando a todo vapor, porém nada acon-
tece na tela. Nosso próximo passo será definir o objeto principal, que chamaremos de Player. Nosso player será bem simples, apenas um elemento gráfico, no caso um
círculo. Pode parecer simples mas jogos 2D são objetos triviais que são animados
muitas vezes por segundo. No nosso caso temos um círculo, mas podemos trocar
por qualquer recurso ou imagem melhor trabalhado para definir um personagem
interessante.
Com a popularização dos smartphones e dos jogos casuais, esse tipo de player
simples de jogos 2D reapareceu com muita força. O nome atribuído a esses objetos
20
Casa do Código
Capítulo 2. Protótipo de um jogo
é Sprite, que nada mais são que imagens, normalmente retangulares ou mesmo
quadradas, com fundos transparentes.
Você pode encontrar Sprites de diversos jogos clássicos na internet. Procure
no Google por sprites mais o nome de um jogo que você goste. Comece a imaginar
como esse jogo funciona com o que falamos
até aqui.
Figura 2.8: Sprites do famoso Mario Bros.
Utilizando iOS UIView e CGContext
Para desenhar elementos na tela do jogo no iPhone, temos algumas opções. Po-
deríamos criar os objeto pelo próprio Xib ou StoryBoard do Xcode. Porém, para que possamos entender como funciona o desenho dos objetos de um game, realizaremos
todo o desenho através de códigos.
Quando desenhamos na vida real, precisamos de ferramentas como pincéis e um
lugar para utilizá-las, como papel ou telas. O elemento UIView no iOS representa
essa tela, na qual podemos desenhar diversas formas ou mesmo Sprites. Para ter
acesso a esse elemento, podemos declarar nossa classe como sendo uma tela, por
meio da UIView.
21
2.3. Desenhando o objeto principal
Casa do Código
Ao utilizar uma UIView, temos um tipo de View especializado em exibir dese-
nhos na tela. O principal propósito da UIView é fornecer o que precisamos para