Leite Anderson - Desenvolvimento de Jogos para iOS стр 8.

Шрифт
Фон

{

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.

Ваша оценка очень важна

0
Шрифт
Фон

Помогите Вашим друзьям узнать о библиотеке