Capítulo 7. Animação 2D
- Índice
- 7.1. Descrição
do programa anima_telejogo.c- 7.2. Outros programas relacionados
- 7.3. Exercícios
- 7.1. Descrição
O propósito desta lição é ilustrar os conceitos
envolvidos na geração de uma animação no OpenGL. Neste caso, animação é feita em
2D e trata-se de um antigo jogo da década de 80, chamado de Telejogo, como ilustrado
na Figura 7-1.
O jogo consiste em um campo de futebol com dois jogadores, uma bola e duas traves (esses
elementos não estão todos presentes na figura abaixo). Os jogadores movimentam-se na
horizontal e vertical; a bola movimenta-se em diversas
direções (não implementados). O objetivo do jogo, logicamente, é marcar gol.
O programa usado para modelar esta cena é mostrado no Exemplo
7-1. A única tecla habilitada é a ESC, utilizada para
finalizar o programa.
Exemplo 7-1. programa anima_telejogo.c
/* programa TELEJOGO */
/* Prof. Marco Antonio G. de Carvalho, UNICAMP-2006 */
/* EXEMPLO DE ANIMACAO */
#include <stdlib.h>
#include <GL/glut.h>
GLint movebola=0;
GLint direcao=1;
void init(void);
void display(void);
void bola(int passo);
void keyboard(unsigned char key, int x, int y);
int main(int argc, char** argv){
glutInit(&argc, argv);
// glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize (600, 400);
glutInitWindowPosition (100, 100);
glutCreateWindow ("TELEJOGO");
init();
glutDisplayFunc(display);
glutTimerFunc(10,bola,1);
glutKeyboardFunc(keyboard);
//glutMouseFunc(mouse);
glutMainLoop();
return 0;
}
void init(void){
glClearColor(0.0, 0.0, 0.0, 0.0);
glOrtho (0, 600, 0, 400, -1 ,1);
}
void display(void){
glClear(GL_COLOR_BUFFER_BIT);
// glPolygonMode(GL_BACK, GL_LINE);
glColor3f(1.0, 1.0, 1.0);
glLineWidth(15.0);
glBegin(GL_LINE_LOOP);
glVertex2i(2,2); glVertex2i(599,2);
glVertex2i(599,399); glVertex2i(2,399);
glEnd();
glBegin(GL_LINES);
glVertex2i(100,190); glVertex2i(100,240);
glVertex2i(500,190); glVertex2i(500,240);
glEnd();
glPointSize(15.0);
glBegin(GL_POINTS);
glVertex2i(movebola+200,210);
glEnd();
// glFlush();
glutSwapBuffers();
}
void keyboard(unsigned char key, int x, int y){
switch (key) {
case 27:
exit(0);
break;
}
}
void bola(int passo)
{
if(direcao==1)
{
movebola += 1;
if(movebola==290) direcao = 0;
}
else
{
movebola -= 1;
if(movebola==-90) direcao = 1;
}
glutPostRedisplay();
glutTimerFunc(10,bola, 1);
}
|
Para compilar e executar o programa anima_telejogo.c, salve-o juntamente com o
arquivo Makefile em um diretório e execute a seguinte seqüência de
comandos:
$ make iluminacao
$ ./anima_telejogo
|
7.1. Descrição do programa
anima_telejogo.c
A idéia central da animação neste programa consiste em criar um laço que altere as
transformações geométricas presentes na função display . Para isso, é utilizada a função
glutTimerFunc() , cuja sintaxe é dada a seguir.
glutTimerFunc(unsigned int msecs, void (*func)(int value), int value)
Associa uma função de callback que deve ser executada de tempos em tempos, definido pelo
primeiro parâmetro msecs; o parâmetro func corresponde ao nome da função que deve ser
chamada e o parâmetro value consiste em um valor inteiro definido pelo usuário, passado
para a função func e que pode ou não ser utilizado por esta.
A linha de programa
glutTimerFunc(10,bola,1); |
Define o período entre a execução da chamada da função bola de 10msecs e passa
para a função o valor inteiro 1. Esse valor poderá (ou não) ser utilizado como o
incremento (passo) na posição da bola do jogo.
if(direcao==1)
{
movebola += 1;
if(movebola==290) direcao = 0;
}
|
A variável movebola controla até que posição mais a esquerda ou mais a direita a bola
pode se locomover, enquanto que a variável direcao controla a mudança de direção quando
a bola atinge esses limites laterais, incrementando ou decrementado a variável movebola.
