Animação 2D

Capítulo 7. Animação 2D

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.