Versão Explicativa do Jogo em OpenGL Street Frog

Recebi alguns e-mails solicitando uma forma mais fácil do código para o jogo Street Frog. Abaixo estarei mostrando o código com apenas um carro, o sapo, o prédio, e seus movimentos.

Clique abaixo para baixar o código:

frog_simples.rar

Usar o Dev C++ para compilar.

/*
Name: Street Frog
Copyright: 2008 Thiago Medeiros
Author: Thiago Medeiros Cavalcanti Sant' Anna
Date: 10/11/08 23:05
Description: Baseado no jogo de atari no qual o sapo tem que atravessar a avenida.
*/
 
#include "glut.h" //Janelas etc...
//Declaracoes das variaveis
GLint movercarro=0;
GLint moversapox=0;
GLint moversapoy=0;
GLint predioy=0;
GLint tempo=0;
GLint lado=0;

Ver o resto do código:

//Desenha a pista
void Pista ()
{
glColor3f(1,1,1);
glLineWidth(3);
glBegin(GL_LINES);
glVertex2i(1,1);
glVertex2i(29,1);
glVertex2i(1,7);
glVertex2i(29,7);
glEnd();
 
glColor3f(1,1,1);
glLineWidth(2);
glBegin(GL_LINES);
glVertex2i(2,3);
glVertex2i(6,3);
glVertex2i(10,3);
glVertex2i(14,3);
glVertex2i(18,3);
glVertex2i(22,3);
glVertex2i(26,3);
glVertex2i(29,3);
glVertex2i(2,5);
glVertex2i(6,5);
glVertex2i(10,5);
glVertex2i(14,5);
glVertex2i(18,5);
glVertex2i(22,5);
glVertex2i(26,5);
glVertex2i(29,5);
glEnd();
 
glColor3f(0,0.5,0);
//Gramado
glBegin(GL_QUADS);
glVertex2f(1.0, 0.0);
glVertex2f(1.0, 0.8);
glVertex2f(29.0, 0.8);
glVertex2f(29.0, 0.0);
glEnd();
 
glColor3f(0,0.5,0);
//Gramado
glBegin(GL_QUADS);
glVertex2f(1.0, 7.2);
glVertex2f(1.0, 8.0);
glVertex2f(29.0, 8.0);
glVertex2f(29.0, 7.2);
glEnd();
}
 
//Desenha o sapo
void Sapo ()
{
glColor3f(0,1,0);
glPointSize(20.0);
glBegin(GL_POINTS);
glVertex2f (moversapox+15,moversapoy+1);
glEnd();
 
glColor3f(1,1,0);
glPointSize(3.0);
glBegin(GL_POINTS);
glVertex2f (moversapox+14.8,moversapoy+1.2);  //Olho esquerdo
glVertex2f (moversapox+15.2,moversapoy+1.2);  //Olho direito
glEnd();
 
//Desenha as pernas
glColor3f(0,1,0);
glLineWidth(2);
glBegin(GL_LINES);
glVertex2f(moversapox+14.3,moversapoy+1.3);
glVertex2f(moversapox+14.8,moversapoy+1.1);
glVertex2f(moversapox+15.7,moversapoy+1.3);
glVertex2f(moversapox+15.2,moversapoy+1.1);
glVertex2f(moversapox+14.8,moversapoy+0.9);
glVertex2f(moversapox+14.3,moversapoy+0.7);
glVertex2f(moversapox+15.7,moversapoy+0.7);
glVertex2f(moversapox+15.2,moversapoy+0.9);
glEnd();
 
//Ponto das maos
glColor3f(0,1,0);
glPointSize(1.0);
glBegin(GL_POINTS);
glVertex2f (moversapox+14.3,moversapoy+1.15);
glVertex2f (moversapox+15.7,moversapoy+1.15);
glVertex2f (moversapox+14.2,moversapoy+1.3);
glVertex2f (moversapox+15.8,moversapoy+1.3);
glVertex2f (moversapox+14.4,moversapoy+1.4);
glVertex2f (moversapox+15.6,moversapoy+1.4);
glEnd();
}
 
//Desenha o predio
void Predio ()
{
glColor3f(1,1,1);
glBegin(GL_QUADS);
glVertex2f (1,8);
glVertex2f (1,predioy+10);
glVertex2f (6,predioy+10);
glVertex2f (6,8);
glEnd();
 
//Janela Esquerda
glColor3f(0,0,0);
glLineWidth(2);
glBegin(GL_LINES);
glVertex2f (2,9.3);
glVertex2f (3,9.3);
glVertex2f (2,9.8);
glVertex2f (3,9.8);
glVertex2f (2,9.3);
glVertex2f (2,9.8);
glVertex2f (3,9.3);
glVertex2f (3,9.8);
glEnd();
 
//Janela Direita
glColor3f(0,0,0);
glLineWidth(2);
glBegin(GL_LINES);
glVertex2f (4,9.3);
glVertex2f (5,9.3);
glVertex2f (4,9.8);
glVertex2f (5,9.8);
glVertex2f (4,9.3);
glVertex2f (4,9.8);
glVertex2f (5,9.3);
glVertex2f (5,9.8);
 
//Janela Esquerda Escondida
glColor3f(0,0,0);
glLineWidth(2);
glBegin(GL_LINES);
glVertex2f (2,10.3);
glVertex2f (3,10.3);
glVertex2f (2,10.8);
glVertex2f (3,10.8);
glVertex2f (2,10.3);
glVertex2f (2,10.8);
glVertex2f (3,10.3);
glVertex2f (3,10.8);
glEnd();
 
//Janela Direita Escondida
glColor3f(0,0,0);
glLineWidth(2);
glBegin(GL_LINES);
glVertex2f (4,10.3);
glVertex2f (5,10.3);
glVertex2f (4,10.8);
glVertex2f (5,10.8);
glVertex2f (4,10.3);
glVertex2f (4,10.8);
glVertex2f (5,10.3);
glVertex2f (5,10.8);
glEnd();
 
//Janela Esquerda Escondida
glColor3f(0,0,0);
glLineWidth(2);
glBegin(GL_LINES);
glVertex2f (2,11.3);
glVertex2f (3,11.3);
glVertex2f (2,11.8);
glVertex2f (3,11.8);
glVertex2f (2,11.3);
glVertex2f (2,11.8);
glVertex2f (3,11.3);
glVertex2f (3,11.8);
glEnd();
 
//Janela Direita Escondida
glColor3f(0,0,0);
glLineWidth(2);
glBegin(GL_LINES);
glVertex2f (4,11.3);
glVertex2f (5,11.3);
glVertex2f (4,11.8);
glVertex2f (5,11.8);
glVertex2f (4,11.3);
glVertex2f (4,11.8);
glVertex2f (5,11.3);
glVertex2f (5,11.8);
glEnd();
}
 
//Desenha o caminhao
void Caminhao ()
 
{
glColor3f(0.5,1,0);
glBegin(GL_QUADS);
glVertex2f (movercarro+2,3.5);
glVertex2f (movercarro+2,4.5);
glVertex2f (movercarro+4,4.5);
glVertex2f (movercarro+4,3.5);
glEnd();
glBegin(GL_QUADS);
glVertex2f (movercarro+1,3.5);
glVertex2f (movercarro+1,4.0);
glVertex2f (movercarro+2,4.0);
glVertex2f (movercarro+2,3.5);
glEnd();
glPointSize(5.0);
glBegin(GL_POINTS);
glColor3f(0.5,0.5,0.5);
glVertex2f (movercarro+1.5,3.5);
glVertex2f (movercarro+3.5,3.5);
glEnd();
}
 
//Movimentação automatica apenas ir
void movimentacarro(int passo) //Carro verde (Caminhao)
{
{
movercarro -= 4; //carro anda de -4 em -4 na tela.. ou seja pra esquerda..
if(movercarro == -8) // se o carro tocar  a tela em -8
{
movercarro = 36; //carro reaparece em 36 na tela (lado direito da tela)
}
glutPostRedisplay(); //redesenhe o carro
glutTimerFunc(100-tempo,movimentacarro, 1); //timer de tempo pra ajustar a velocidade de movimento do carro
}
}
 
//Caso o carro passe por cima do sapo, retornar ao inicio
void Colisao ()
{
//obs: Porque 4 linhas de colisao? Simples, o carro anda de -4 em -4, se vc tiver no ponto x= 3, não iria acontecer
// a colisao, ou seja, +1, +2, +3 foi uma forma de corrigir esse erro. (x=3 +1...
 
if ((movercarro-10 == moversapox+1) && (4 == moversapoy+1)) moversapoy = 0;
// se movercarro-10 igual a valor x do sapo +1 e o valor da altura do sapo em y igual a 4 (altura da linha do carro,
// sapo vai para o inicio
if ((movercarro-10 == moversapox+2) && (4 == moversapoy+1)) moversapoy = 0;
if ((movercarro-10 == moversapox+3) && (4 == moversapoy+1)) moversapoy = 0;
if ((movercarro-10 == moversapox+4) && (4 == moversapoy+1)) moversapoy = 0;
 
if ((7 == moversapoy+1) && (lado == 0)) lado = 1;  //Mudanca de lado
 
glutPostRedisplay();
}
 
//Comentario final
void Comentarios ()
{
 
{
glColor3f(1,1,1);
glRasterPos2f(9.2, 6.0);
char* p = (char*) "Parabens!! Voce Ganhou!!";
while (*p != '�')
{
glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24, *p++);
}
}
}
 
//Chama o desenho
void Desenha(void)
{
 
if(lado == 0)
{
tempo = 40;  //Inicio
glClear(GL_COLOR_BUFFER_BIT);
Pista();
Colisao();
Caminhao();
Sapo();
Predio();
glutSwapBuffers();
}
 
if(lado == 1) //Final
{
glClear(GL_COLOR_BUFFER_BIT);
Comentarios();
glutSwapBuffers();
}
 
}
 
//Funcoes para teclado (atribuicoes de teclas especiais)
void Mover (int key, int x, int y)
{
if(key == GLUT_KEY_UP)      { moversapoy += 1; }
if(key == GLUT_KEY_DOWN)    { moversapoy -= 1; }
if(key == GLUT_KEY_LEFT)    { moversapox -= 1; }
if(key == GLUT_KEY_RIGHT)   { moversapox += 1; }
 
//Limitando o sapo, para nao sair da tela
if (moversapoy < 0)   		 { moversapoy = 0;  }
if (moversapoy > 6)         { moversapoy = 6;  }
if (moversapox < -13)       { moversapox = -13;}
if (moversapox > 13)        { moversapox = 13; }
}
 
//Funcoes para teclado (atribuicoes de teclas)
void Teclado ( unsigned char key, int x, int y )
{
//Fazer o predio subir e descer com W e S
if(key == 119)        { predioy += 1; }
if(key == 115)        { predioy -= 1; }
//Limites minimo e maximo do predio
if (predioy < 0)      { predioy = 0;  }
if (predioy > 2)      { predioy = 2;  }
//Tela cheia na tecla f
if(key == 102)        { glutFullScreen(); }
//Redesenha o novo valor
glutPostRedisplay();
//Sai ao se precionar a tecla esc
if(key == 27)  {   exit(0); }
}
 
//Define configuracoes da janela
void Inicializa (void)
{
// Define a cor de fundo da janela de visualização como preta
glClearColor(0.0, 0.0, 0.0, 0.0);
glMatrixMode(GL_PROJECTION);
gluOrtho2D(0.0,30.0,0.0,15.0);
}
 
//Chamada do main
int main(void)
{
//E por fim a chamada para o OpenGL
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); //Modo para nao exibir rastros na tela
glutInitWindowSize (690, 530); //Tamanho da janela
glutInitWindowPosition (50, 50);  //Localizacao inicial da janela
glutCreateWindow("Street Frog"); //Nome da janela
glutKeyboardFunc(Teclado); //Chama as funcoes do teclado
glutSpecialFunc(Mover);  //Chama as funcoes especias do teclado (setas de movimento)
Inicializa(); //Define cor de fundo da janela, largura e altura
glutDisplayFunc(Desenha); //Chama o desenho
glutTimerFunc(10,movimentacarro,1);   //Chamada de movimento do carro
glutMainLoop();
//Final das funcoes do OpenGL
 
}