Computação Gráfica

Animação da Água + Terreno + Simulador de Voo

Boids

Breakout Game

Desenvolvi um jogo 2D chamado Breakout para a disciplina de Computação Gráfica da UFMG lecionada pelo professor Renato Ferreira.

Foram anexados o código fonte, o executável e a descrição do trabalho no final da página.

Créditos ao Thiago Goulart que tem me dado dicas valiosas sobre o assunto, a Ana Paula por ter tido paciência e me deixado passar as noites programando e ao Gordo por tentar fazer da computação uma coisa legal.

A figura abaixo mostra uma imagem do jogo que foi desenvolvido.

Foram desenvolvidas todas as funcionalidades padrões mais algumas extras. O jogo foi desenvolvido em C++, com base no OpenGL 3.0 e na GLSL 1.3. A seguir serão listas as funcionalidades extras:

1. O deslocamento vertical do mouse indica a força a ser usada na rebatida da “bola”. Ela pode ter uma velocidade máxima e mínima, e dependendo da posição vertical do cursor na tela, ela pode incrementar ou decrementar a velocidade da bola até os limites.

2. Efeito na rebatida. Quando os cálculos de reflexão forem feitos na “bola”, a velocidade do “paddle” é utilizada para calcular a variação no ângulo refletido.

3. Os “tijolos” podem estar em movimento, como no arcade Space Invaders.

4. Alguns tijolos podem ser indestrutíveis (tijolos pretos), provocando apenas a reflexão da “bola”.

5. Tijolos surpresas. Esses tijolos são marcados com uma interrogação. Quando destruídos esses tijolos liberam um bônus. Se o paddle colidir com o bônus será aplicado uma ação de acordo com a cor da bola. As opção são: 1) azul – diminui o tamanho do paddle, 2) amarela – aumenta o tamanho do paddle , 3) verde – ganha vida e 4) preta – perde vida.

6. Níveis de dificuldades. Cada vez que o jogador derruba toda uma parede ele passa de fase. Na próxima fase será acrescentada mais uma parede de tijolos (até um número máximo de 7), a bola ficará mais rápida (até uma velocidade máxima) , irão haver mais tijolos se movendo, mais tijolos indestrutíveis e mais tijolos surpresas.

7. Aplicação de Textura no plano de fundo do jogo, nos tijolos e no paddle.

8. Aplicação do modelo de iluminação Phong – Gouraud nas esferas (bola e bônus surpresas)

9. Explosão. Sempre que um tijolo é destruído ele explode liberando partículas na direção da colisão que levam em consideração a posição da bola.

Todas as funcionalidades padrões pedidas foram desenvolvidas, sendo elas:

· Cálculo da velocidade do paddle de acordo com a posição do mouse na tela.

· Exibição do placar no lado superior direito da tela.

· Contagem do número de bolas e exibição do número de bolas disponíveis no lado superior direito da tela.

· O jogo deve sempre começar no modo pausa, com a “bola” parada em alguma posição

inicial da tela, e o “paddle” no centro da tela. A tecla R é usada para voltar o jogo para

essa configuração inicial a qualquer momento.

· A tecla Q, em qualquer momento que for pressionada, termina o programa.

· O botão da esquerda do mouse coloca o jogo num modo de pausa, quando todos os

objetos são congelados. Quando pressionado no modo de pausa, retorna o jogo ao

movimento.

· O botão da direita imprime os atributos de todos os objetos, e coloca o jogo em modo

pausa. Deve listar o “paddle” com sua posição e velocidade, a “bola”, e todos os

“tijolos”. Pressionado novamente, executa um ciclo do jogo, e novamente imprime todos

os atributos.

Detalhes de desenvolvimento

Foram implementados 3 shaders em GLSL 1.3, 1) Linear - apenas desenha os objetos com uma cor constante e aplica as transformações necessárias; 2) Textura – Carrega uma textura e a aplica nos objetos; 3) Phong Gouraud – Aplica o modelo de iluminação Phong nos vértices e propaga utilizando Gouraud.

A cena foi modelada utilizando projeção ortográfica. Cada objeto da cena possui 3 propriedades: posição, velocidade e fator. O fator é utilizado para escalar a velocidade, sendo que o vetor velocidade sempre possui tamanho 1. Ou seja, ele aponta apenas a direção. O deslocamento é dado utlizando o fator multiplicado pelo tempo transcorrido entre atualizações. P = V * F * (delta tempo)

A detecção de colisão foi realizada projetando os objetos nos eixos X e Y. Quando ambas as projeções se interceptam quer dizer que os objetos colidiram.

Para a manipulação das matrizes ModelView e Projection foi utilizada a biblioteca GLTools disponibilizada no livro “OpenGL SuperBible: Comprehensive Tutorial and Reference (5th Edition) Richard S. Wright, Nicholas Haeme, Graham Sellers, Benjamin Lipchak” .