{
UIGraphicsPushContext(context);
CGContextBeginPath(context);
CGContextAddArc(context,
100,
100,
self.enemyRadius,
0,
(2 * M_PI),
YES); // Círculo de 360° (0 ~ 2pi)
CGContextSetRGBFillColor(context, 0.4f, 0.4f, 0.4f, 1.0f);
CGContextFillPath(context);
UIGraphicsPopContext();
}
Para este game, queremos que a cada novo frame o raio do inimigo cresça em 1.
Para isto, vamos alterar o run:
30
Casa do Código
Capítulo 2. Protótipo de um jogo
- (void)run
{
if (self.running == YES) {
// Aumenta raio do inimigo
self.enemyRadius++;
// Informa ao iOS que a tela deve ser redesenhada
[self setNeedsDisplay];
}
}
Ao rodar o jogo, nosso inimigo cresce sozinho e o player se afasta com o touch
na tela!
31
2.6. Detectando colisões e mostrando resultados
Casa do Código
Figura 2.11: Inimigo aparece
na tela.
Nesse momento conseguimos mover o player principal e tentar se afastar do ini-
migo que cresce cada vez mais com o passar do tempo. Agora precisamos detectar a
colisão!
2.6
Detectando colisões e mostrando resultados
Já passamos pelo conceito de mover objetos, no caso, pelo toque na tela e já também por ter um outro objeto que representa o inimigo e tem sua própria inteligência.
A graça do jogo agora é conseguir identificar quando uma determinada situação
acontece, situação essa que o player está lutando contra.
No nosso caso, o player não pode encostar no círculo que cresce cada vez mais.
32
Casa do Código
Capítulo 2. Protótipo de um jogo
Repare que aqui ainda não temos uma história para que essa colisão faça realmente sentido em ser evitada no jogo, porém, é ai que a imaginação faz o jogo se tornar divertido. Jogos antigos, em 2D, não possuíam gráficos incríveis, mas sim, ideias interessantes representadas por objetos simples na tela.
Poderíamos estar desenvolvendo um jogo no qual o player está fugindo de algo.
Como um vulcão entrou em erupção e nosso herói (player) deve salvar os habitantes dessa vila, por exemplo. Ou seja, sabendo os conceitos, iremos incrementar o visual para que represente uma história interessante.
Detectando colisões
Precisamos então reconhecer que o circulo maior, que representa o inimigo, con-
seguiu encostar no circulo menor, movido pelo usuário, que representa o player. Detectar colisões é um assunto muito amplo. Existem diversos tipos de detecção de
colisões possíveis.
Uma maneira bem tradicional é considerar que cada elemento é um quadrado
ou retângulo e verificar através de geometria se um elemento sobrepõe o outro. Essa forma considera mesmo elementos que não contornam um objeto como parte do
mesmo. Na imagem abaixo, uma nave de jogos de tiro. Para detectar que algo colide com ela, a área analisada pode ser generalizada para um quadrado ao redor dela.
33
2.6. Detectando colisões e mostrando resultados
Casa do Código
Figura 2.12: Região detectada pelo jogo.
Pode-se questionar se esse método é bom. Será que, se algo encostar na quina do
quadrado, que não faz parte da nave, uma colisão será detectada? Em muitos casos
essa aproximação é feita por dois motivos.
Simplificação para detectar a colisão.
Menor exigência computacional.
Simplificar a detecção por conta de simplificar o algoritmo da colisão é uma prá-
tica bem comum. Além disso, é bem mais barato computacionalmente do que ter
que analisar cada item real de uma imagem de um player.
Colisões no protótipo
Chegamos a um dos conceitos mais importantes no desenvolvimento de um
game! Precisamos identificar a colisão entre o player e o inimigo. Esse é o item
34
Casa do Código
Capítulo 2. Protótipo de um jogo
chave do nosso protótipo e normalmente na maioria dos jogos. Existem diversas
formas de pontuar, e muitas delas utilizam a colisão entre dois ou mais objetos para isso. Jogos de tiro pontuam pela colisão do tiro com o objeto atirado. Jogos como Super Mario Bros e Street Fighter pontuam pelas colisões do player com moedas ou
com inimigos.
Existem diversas formas de detectar colisões, algumas mais complexas outras
mais simples. Para o nosso protótipo, utilizaremos a colisão de duas circunferências.
A colisão de dois círculos é uma das mais simples, porém, é relacionada a alguns
conceitos matemáticos como o Teorema de Pitágoras.
Figura 2.13: Teorema de Pitágoras.
Na figura anterior, existe uma maneira matematicamente simples de determinar
35
2.6. Detectando colisões e mostrando resultados
Casa do Código
se as circunferências estão sobrepostas. Precisamos identificar os valores a seguir:
Soma dos raios das duas circunferências
Valor da hipotenusa, ou distância entre os dois raios
De posse das duas informações acima, conseguimos identificar se a soma dos
raios é maior que a hipotenusa gerada. Se for maior, não existe colisão.
Vamos ao código!
Primeiro criaremos algumas propriedades para esse cálculo. As variáveis se re-
ferem às posições X e Y de ambas as circunferências, tanto do player quanto a do
inimigo.
Altere sua classe Impossible.h para ter todos esses atributos.