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.