Ask Question

Name:
Title:
Your Question:

Answer Question

Name:
Your Answer:
User Submitted Source Code!


Description:
  teste
Language: C/C++
Code:
#include <stdio.h>
#include <stdlib.h>
#include "glut.h"
#include "fmod.h"
#include "fmod_errors.h"


GLfloat Tx = 2.0;
GLfloat Ty = 2.0;
GLint movernavex = -1;// -10.0;
GLint movernavey = -1; //-10.0;
GLint moverpedra = 36,moverpedra1=36,moverpedra2=36,moverpedra3=36;
GLint moverpedra4 = 36,moverpedra5=36,moverpedra6=36,moverpedra7=36;

GLint tempo=0;
int lado=0;

void LoadBMP(char *filename) {
    #define SAIR {fclose(fp_arquivo); return ;}
    #define CTOI(C) (*(int*)&C)
 
    GLubyte *image;
    GLubyte Header[0x54];
 
    FILE * fp_arquivo = fopen(filename,"rb");
 
    if (fread(Header,1,0x36,fp_arquivo)!=0x36)
    SAIR;
 
    Width = CTOI(Header[0x12]);
    Height = CTOI(Header[0x16]);
    ( CTOI(Header[0x0A]) == 0 ) ? ( DataPos=0x36 ) : ( DataPos = CTOI(Header[0x0A]) );
    imageSize=Width*Height*3;
 
    image = (GLubyte *) malloc ( imageSize );
    int retorno;
    retorno = fread(image,1,imageSize,fp_arquivo);
 
    int t, i;
    for ( i = 0; i < imageSize; i += 3 ) {
        t = image[i];
        image[i] = image[i+2];
        image[i+2] = t;
    }
 
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
    glTexEnvf ( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, Width, Height, 0, GL_RGB, GL_UNSIGNED_BYTE, image);
    fclose (fp_arquivo);
    free (image);
    return ;
}

void T_Quads(GLuint *t_quad, int i, int x, int y, int w, int h) {
    glBindTexture ( GL_TEXTURE_2D, t_quad[i] );
    glBegin(GL_QUADS);
 
    glTexCoord2f(0.0f, 0.0f);  glVertex2f(x, y);
    glTexCoord2f(1.0f, 0.0f);  glVertex2f(x, y);
    glTexCoord2f(1.0f, 1.0f);  glVertex2f(x, y);
    glTexCoord2f(0.0f, 1.0f);  glVertex2f(x, y);
    glEnd();
}

void Comentarios()
{         
glColor3f(1,1,1);
glRasterPos2f(10.5, 6.0);        
char* p = (char*) "Voce Perdeu!!";
while (*p != '\0') {glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24, *p++);}
}  
void Comentarios1()        
{         
glColor3f(1,1,1);
glRasterPos2f(9.2, 6.0);         
char* p = (char*) "Parabens!! Voce Ganhou!!";
while (*p != '\0') {glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24, *p++);}
}  

void Nave (void)

  
  glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
  glClear(GL_COLOR_BUFFER_BIT);
  glColor3f(1,0,0);
  /*
  glBegin(GL_TRIANGLES);
  glVertex3f(movernavex+4.0,movernavey+5.0,0);
  glVertex3f(movernavex+3.0,movernavey+4.0,0);
  glVertex3f(movernavex+3.0,movernavex+6.0,0);
  glEnd();
  //quadrado principal
  glColor3f(1,1,0);
  glBegin(GL_QUADS);
  glVertex2f(movernavex+3.0,movernavey+4.0);
  glVertex2f(movernavex+3.0,movernavex+6.0);
  glVertex2f(movernavex+2.0,movernavex+6.0);
  glVertex2f(movernavex+2.0,movernavey+4.0);
  glEnd();
  //quadrado pequeno
  glColor3f(1,0,0);
  glBegin(GL_QUADS);
  glVertex2f(movernavex+2.0,movernavey+4.5);
  glVertex2f(movernavex+2.0,movernavey+5.0);
  glVertex2f(movernavex+1.5,movernavex+5.0);
  glVertex2f(movernavex+1.5,movernavex+4.5);
  glEnd();
  //quadrado pequeno   
  glColor3f(1,0,0);
  glBegin(GL_QUADS);
  glVertex2f(movernavex+2.0,movernavey+5.0);
  glVertex2f(movernavex+2.0,movernavex+5.5);
  glVertex2f(movernavex+1.5,movernavex+5.5);
  glVertex2f(movernavex+1.5,movernavex+5.0);
  glEnd();
//  glutPostRedisplay();
*/

     glGenTextures ( 1, texture_id );
    glBindTexture ( GL_TEXTURE_2D, texture_id[0] );
 
    LoadBMP("mota.bmp");
    T_Quads( texture_id,0, movernavex+1.5, movernavey+4.5, 0, 0);

}
//Desenha os asteroides
void Asteroides ()
{   
glColor3f(0.7,0.7,0.7);
glBegin(GL_QUADS);
glVertex2f (moverpedra+2,3.5); //Asteroide1
glVertex2f (moverpedra+2,4.5);  
glVertex2f (moverpedra+4,4.5); 
glVertex2f (moverpedra+4,3.5);  

glVertex2f (moverpedra1+6,1.5);  //Asteroide2
glVertex2f (moverpedra1+6,2.5);  
glVertex2f (moverpedra1+8,2.5); 
glVertex2f (moverpedra1+8,1.5);  

glVertex2f (moverpedra2+15,5.5); //Asteroide3
glVertex2f (moverpedra2+15,7.5);  
glVertex2f (moverpedra2+16,7.5); 
glVertex2f (moverpedra2+16,5.5);  

glVertex2f (moverpedra3+33,9.5);  //Asteroide4
glVertex2f (moverpedra3+33,10.5);  
glVertex2f (moverpedra3+35,10.5); 
glVertex2f (moverpedra3+35,9.5);  

glVertex2f (moverpedra4+23,5.5);  //Asteroide5
glVertex2f (moverpedra4+23,6.5);  
glVertex2f (moverpedra4+25,6.5); 
glVertex2f (moverpedra4+25,5.5);  

glVertex2f (moverpedra5+18,2.5);  //Asteroide6
glVertex2f (moverpedra5+18,3.5);  
glVertex2f (moverpedra5+20,3.5); 
glVertex2f (moverpedra5+20,2.5);   

glVertex2f (moverpedra6+19,11.5);  //Asteroide7
glVertex2f (moverpedra6+19,12.5);  
glVertex2f (moverpedra6+21,12.5); 
glVertex2f (moverpedra6+21,11.5);  
glEnd(); 

glColor3f(1,1,1); //Estrelas
glPointSize(5.0);
glBegin(GL_POINTS);        
glVertex2f (moverpedra+10+rand() %100,movernavey+rand() %100);  //Estrelas1
glVertex2f (moverpedra+15+rand() %100,movernavey+rand() %100);  //Estrelas2        
glVertex2f (moverpedra+8 +rand() %100,movernavey+rand() %100);  //Estrelas3  
glVertex2f (moverpedra+5 +rand() %100,movernavey+rand() %100);  //Estrelas4       
glVertex2f (moverpedra+3 +rand() %100,movernavey+rand() %100);  //Estrelas5  
glVertex2f (moverpedra+0 +rand() %100,movernavey+rand() %100);  //Estrelas6     
glVertex2f (1+rand() %100,rand() %100);  //Estrelas7       
glVertex2f (3+rand() %100,rand() %100);  //Estrelas8
glVertex2f (5+rand() %100,rand() %100);  //Estrelas9           
glVertex2f (8+rand() %100,rand() %100);  //Estrelas10           
glVertex2f (11+rand()%100,rand() %100);  //Estrelas11      
glEnd();  
}       
 
  
void Mover (int key, int x, int y)

{     //AO INVÉS DE MOVERNAVE UTILIZE TRANSLAÇÃO. 
    //SE QUYISER QUE A NAVE FIQUE MAIS RÁPIDA AUMENTE O INCREMENTO
if(key == GLUT_KEY_UP)    {Ty += 1;}//  { movernavey += 1; }
if(key == GLUT_KEY_DOWN)  {Ty -= 1;}// { movernavey -= 1; }
if(key == GLUT_KEY_LEFT)  {Tx -= 1;}//  { movernavex -= 1; }
if(key == GLUT_KEY_RIGHT) {Tx += 1;}// { movernavex += 1; }

//VOCÊ TERÁ QUE REVER OS LIMITES

//Limitando a nave, para nao sair da tela
if (Ty < -3)        { Ty = -3;  } 
if (Ty > 8)     { Ty = 8; }
if (Tx < 2)     { Tx = 2;}
if (Tx > 2)     { Tx = 2;}
}
//Movimentação automatica 
void movimentapedra(int passo) 
{
moverpedra  -= 1,moverpedra1 -= 1,moverpedra2 -= 1,moverpedra3 -= 1;
moverpedra4 -= 1,moverpedra5 -= 1,moverpedra6 -= 1,moverpedra7 -= 1;

if(moverpedra  == -30) {moverpedra  = 36;}
if(moverpedra1 == -18) {moverpedra1 = 36;}
if(moverpedra2 == -40) {moverpedra2 = 36;}
if(moverpedra3 == -35) {moverpedra3 = 36;}
if(moverpedra4 == -20) {moverpedra4 = 36;}
if(moverpedra5 == -33) {moverpedra5 = 36;}
if(moverpedra6 == -22) {moverpedra6 = 36;}
if(moverpedra7 == -35) {moverpedra7 = 36;

if (tempo <   89) {tempo = tempo + 10;}
if (tempo ==  90) {lado  = 1;}} 

glutPostRedisplay();
glutTimerFunc(100-tempo,movimentapedra, 1);
}
//VOCÊ TERÁ QUE REVER OS CÁLCULOS DA COLISÃO
//Colisao
void Colisao ()
{
if ((moverpedra  == Tx) && (Ty == 0))    {lado = 2;}
if ((moverpedra1  == Tx-4  ) && (Ty == -2))    {lado = 2;}
if ((moverpedra2 == Tx-13) && ((Ty == 2) || (Ty == 3)))    {lado = 2;}
if ((moverpedra3 == Tx-31) && (Ty == 6))    {lado = 2;}
if ((moverpedra4 == Tx-21) && (Ty == 2))    {lado = 2;}
if ((moverpedra5 == Tx-16) && (Ty == -1))    {lado = 2;}
if ((moverpedra6 == Tx-17) && (Ty == 8))    {lado = 2;}
glutPostRedisplay();
}
          
//Funcoes para teclado (atribuicoes de teclas)   
void Teclado ( unsigned char key, int x, int y )
{   
//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); }

//Funcoes do menu
void MenuJanela(int op)
{
switch(op) {
case 0:
{ glutFullScreen(); }
break;
}
glutPostRedisplay();


//Funcoes do menu      
void MenuSom(int op)
{
switch(op) 
{
case 0:
{ FSOUND_Close(); }
break;

glutPostRedisplay();
}  

// Gerenciamento do menu principal           
void MenuPrincipal(int op)
{
}
    
//Cria o Menu
void CriaMenu() 
{
int menu,submenu1,submenu2;

submenu1 = glutCreateMenu(MenuJanela);
glutAddMenuEntry("Tela Cheia",0);

submenu2 = glutCreateMenu(MenuSom);
glutAddMenuEntry("Desligar o som",0);

menu = glutCreateMenu(MenuPrincipal);
glutAddSubMenu("Janela",submenu1);
glutAddSubMenu("Som",submenu2);
    
glutAttachMenu(GLUT_RIGHT_BUTTON);
}

// Função callback chamada para gerenciar eventos do mouse
void GerenciaMouse(int button, int state, int x, int y)
{        
if (button == GLUT_RIGHT_BUTTON)
if (state == GLUT_DOWN) 
CriaMenu();
         
glutPostRedisplay();
}

//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);
}


// Função callback chamada quando o tamanho da janela é alterado 
void AlteraTamanhoJanela(GLsizei w, GLsizei h)
{
GLsizei largura, altura;

// Evita a divisao por zero
if(h == 0) h = 1;

// Atualiza as variáveis
largura = w;
altura = h;

// Especifica as dimensões da Viewport
glViewport(0, 0, largura, altura);

// Inicializa o sistema de coordenadas
glMatrixMode(GL_PROJECTION);
glLoadIdentity();

// Estabelece a janela de seleção (esquerda, direita, inferior, 
// superior) mantendo a proporção com a janela de visualização
if (largura <= altura) 
gluOrtho2D (0.0f, 23.0f, 0.0f*altura/largura, 13.0f*altura/largura);
else 
gluOrtho2D (0.0f*largura/altura, 23.0f*largura/altura, 0.0f, 13.0f);
}

//Chama o desenho
void Desenha(void)
{
if (lado == 0) {
glClear(GL_COLOR_BUFFER_BIT);
glPushMatrix();
glTranslatef(Tx, Ty, 0);
Nave();
glPopMatrix();
Asteroides();
Colisao();
glutSwapBuffers();
}

if (lado == 1) { 
glClear(GL_COLOR_BUFFER_BIT);
Comentarios1();
glutSwapBuffers();


if (lado == 2) { 
glClear(GL_COLOR_BUFFER_BIT);
Comentarios();
glutSwapBuffers();

}


//Chamada do main
int main(void)
{
//Inicia o som
FSOUND_SAMPLE *samp1 = 0; //cria um ponteiro para armazenar o som em memória
if (FSOUND_GetVersion() < FMOD_VERSION) // verificação da versão do fmod caso a versão do FSOUND for menor que a do FMOD retorna uma menssagem de erro
{
printf("Error : You are using the wrong DLL version!  You should be using FMOD %.02f\n", FMOD_VERSION);
return 1;
}
//    Seleciona a saída de audio
FSOUND_SetOutput(FSOUND_OUTPUT_DSOUND);

//    Seleção do driver
FSOUND_GetOutput(); // indentifica o tipo de saida
FSOUND_GetMixer(); // indentifica o mixer
FSOUND_SetDriver(0); // seta o driver de som que vai ser usado

//    Inicializando o FMOD
if (!FSOUND_Init(44100, 32, FSOUND_INIT_GLOBALFOCUS)) // se o valor do FSOUND_Init for 0 execute o tratamento de erro
{
printf("Error!\n");
printf("%s\n", FMOD_ErrorString(FSOUND_GetError()));
return 1;
}

// Carrengando o Sample
// PCM,44,100 Hz, 32 Bit, Mono ou uma mp3 ou outros formatos suportados pelo fmod
samp1 = FSOUND_Sample_Load(FSOUND_UNMANAGED, "StarWarsTheme.ogg", FSOUND_NORMAL | FSOUND_HW2D, 0, 0); 
if (!samp1)
{
printf("Error!\n");
printf("%s\n", FMOD_ErrorString(FSOUND_GetError()));
return 1;
}

// Aqui fala qual maneira o sample ira tocar caso falhe excute o tratamento de erro
if(!FSOUND_Sample_SetMode(samp1, FSOUND_LOOP_NORMAL))// o loop normal toca a musica continuamente ate o programa fechar
{
printf("Error!\n");   
printf("%s\n", FMOD_ErrorString(FSOUND_GetError()));
}
// Aqui sera tocado o sample ,caso falhe, execute o tratamento de erro
if(!FSOUND_PlaySound(FSOUND_FREE, samp1))
{
printf("Error!\n");   
printf("%s\n", FMOD_ErrorString(FSOUND_GetError()));
}
//Fim do codigo do som \\o  \o/   o//\o/
//Sleep(10000);  // executa o som durante 10 segundos     (Essa funcao esta desativada)    

//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("Jogo da Nave =D"); //Nome da janela
glutKeyboardFunc(Teclado); //Chama as funcoes do teclado
glutSpecialFunc(Mover);  //Chama as funcoes especias do teclado (setas de movimento)
Inicializa(); 
glutDisplayFunc(Desenha); //Chama o desenho
glutReshapeFunc(AlteraTamanhoJanela); //Correcao de largura e altura para a janela
glutTimerFunc(10,movimentapedra,1);   //Chamada de movimento do carro
glutMouseFunc(GerenciaMouse);         //Ativa o botao direito
glutMainLoop();
//Final das funcoes do OpenGL

//Limpando a memoria e fechando o fmod (Som)
FSOUND_Sample_Free(samp1); // limpa a memoria ultilizada pelo ponteiro do sample
FSOUND_Close();  // encerra a API FMOD
}     
Comments: