Partage
  • Partager sur Facebook
  • Partager sur Twitter

Probleme evenement SDL

Sujet résolu
    24 mai 2006 à 20:42:13

    Bonjour,
    j'ai un petit probleme
    je ne comprend pas pourqu'oi lorsque j'appuie sur la touche monter le programme boucle plusieurs fois dans le "case" de la touche.
    Voici le code!




    #include <SDL/sdl.h>
    #include <SDL/SDL_image.h>
    #include <GL/gl.h>
    #include <GL/glu.h>
    #include <cstdlib>
    #include <math.h>
    #include "sdlglutils.h"

    //Quadratique
         GLUquadric* params=gluNewQuadric();            //Parametre de visu des quadrique

    GLuint texture_terre,texture_haut, texture_milieu,texture_bas, texture_cul;  //Texture

    void roquette();


    //Programme
    int main(int argc, char *argv[])
    {
        bool continuer = true;
        SDL_Event event;
        int angle_camera=0, camera=0, angle=0,tempsPrecedent = 0, tempsActuel = 0;
        int type_texture=0;
    //Init SDL   
        SDL_Init(SDL_INIT_VIDEO);
    //Cretion de l'ecran
        SDL_WM_SetCaption("Roquette !",NULL);
        SDL_SetVideoMode(640, 480, 32, SDL_OPENGL);
    //Parametrage OPENGL
        glMatrixMode( GL_PROJECTION );//Definie la matrice projection (orthogonale, perspective)
        glLoadIdentity( );          //Init matrice projection
        gluPerspective(70,(double)640/480,1,1000);//fovy, ratio, near, far
       
        glMatrixMode( GL_MODELVIEW ); //Definie la matrice placement objet
        glLoadIdentity( );            //Replace la matrice
       
        glEnable(GL_DEPTH_TEST);//Buffer de profondeur
        glEnable(GL_TEXTURE_2D);//Gestion des textures
    //Camera
        //gluLookAt(15,15,15,0,0,0,0,0,1);

    //Parametre quadratique   
       
        texture_terre=loadTexture("Texture/EarthLow.jpg");
        texture_haut=loadTexture("Texture/rocket_top.jpg");
        texture_milieu=loadTexture("Texture/rocket_middle.jpg");
        texture_bas=loadTexture("Texture/rocket_bottom.jpg");
        texture_cul=loadTexture("Texture/rocket_motor.jpg");   
               
    //Boucle principale
    //SDL_EnableKeyRepeat(10,10);
        while (continuer)
        {
           glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );//Initialise les couleur et le buffer
           glPushMatrix(); //pour que les transformations soient réversibles
           
    //Type d'affichage
            switch (type_texture)
            {
            case 0:
               gluQuadricDrawStyle(params,GLU_FILL);//Texture plein
               gluQuadricTexture(params,GL_TRUE);//Activation des texture     
            break;
            case 1:
               gluQuadricDrawStyle(params,GLU_LINE);//Texture line
               gluQuadricTexture(params,GL_FALSE);//Activation des texture     
            break;
            case 2:
               gluQuadricDrawStyle(params,GLU_POINT);//Texture plein
               gluQuadricTexture(params,GL_FALSE);//Activation des texture     
            break;
            }                   
    //Camera
           gluLookAt(15+8*cos(2*camera*M_PI/180),15,15,0,0,0,0,0,1);
    //Dessine la terre
              glBindTexture(GL_TEXTURE_2D,texture_terre);//Appliquer texture
              glRotated(angle,0,0,1);//Rotation
              gluSphere(params,10,30,30);//Rayon, Verticale, Horizontal
              glRotated(-angle,0,0,1);//Rotation         
    //Roquette 1
               glRotated(angle,0,1,0);//Rotation
               glTranslated(12,0,0);//Deplacement
               roquette();
    //Roquette 2
               glTranslated(-12,0,0);//Deplacement
               glRotated(-angle,0,1,0);//Rotation
               glRotated((angle*2),1,0,0);//Rotation
               glTranslated(0,12,0);//Deplacement
               glRotated(180,1,0,0);//Rotation
               
               roquette()
          glPopMatrix(); //hop je remets tout comme je l'ai trouvé
    //Raffraichir 
          glFlush();                  //Correspond au SDL_Flip(ecran);
          SDL_GL_SwapBuffers();       //Correspond au SDL_Flip(ecran);   
     
      //Gestion du temps
                tempsActuel = SDL_GetTicks();//SDL_GetTicks() donne le temps d'exution du programme en MS
                if (tempsActuel - tempsPrecedent > 50) /*  ms se sont écoulées */
                {
                angle=angle-5;
                camera++;
                if (angle<0)
                   angle =360;       
                tempsPrecedent = tempsActuel; /* Le temps "actuel" devient le temps "precedent" pour nos futurs calculs */
                }
                else /* Si ça fait moins de 30ms depuis le dernier tour de boucle, on endort le programme le temps qu'il faut */
                {
                SDL_Delay(50 - (tempsActuel - tempsPrecedent));//Attend le reste du temps
                }
            //Fin gestion du temps
             
          //Gestion des touches
            SDL_PollEvent(&event);
            switch(event.type)
            {
                case SDL_QUIT:
                    continuer = false;
                    break;
                case SDL_KEYUP:
                     switch (event.key.keysym.sym)
                     {
                     case SDLK_UP:
                          type_texture++;
                          if (type_texture>3)
                          type_texture=0;
                    break;
                    }//Fin du switch key
           }
    }   


    //Fin du programme liberation de la memoire
        gluDeleteQuadric(params);
        SDL_Quit();

        return 0;
    }


    void roquette()
    {
    //Roquette 
         glPushMatrix(); //pour que les transformations soient réversibles       
         //Cone top
          glTranslated(0,0,0);//Deplacement
          glBindTexture(GL_TEXTURE_2D,texture_haut);//Appliquer texture
          gluCylinder(params,0.5,0.001,1.6,15,1);//Diam base, Diam haut, hauteur, facette verticale, facette horizontal
     //Cone milieu
          glTranslated(0,0,-1.05);//Deplacement
          glBindTexture(GL_TEXTURE_2D,texture_milieu);//Appliquer texture
          gluCylinder(params,0.15,0.5,1.05,15,1);//Diam base, Diam haut, hauteur, facette verticale, facette horizontal
      //Cone bas
          glTranslated(0,0,-0.25);//Deplacement
          glBindTexture(GL_TEXTURE_2D,texture_bas);//Appliquer texture
          gluCylinder(params,0.30,0.15,0.25,15,1);//Diam base, Diam haut, hauteur, facette verticale, facette horizontal
      //Disque bas
          glBindTexture(GL_TEXTURE_2D,texture_cul);//Appliquer texture
          gluCylinder(params,0.30,0.15,0.25,15,1);//Diam base, Diam haut, hauteur, facette verticale, facette horizontal
          gluDisk(params,0,0.3,15,1);//Diam int, diam out, facette cote, facette diametre
    //Fin roquette
          glPopMatrix(); //hop je remets tout comme je l'ai trouvé

    }
         


    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      24 mai 2006 à 21:07:25

      Tu n'a mis qu'un break alors qu'il y a deux switchs a ce niveau :

      case SDL_KEYUP:
                       switch (event.key.keysym.sym)
                       {
                       case SDLK_UP:
                            type_texture++;
                            if (type_texture>3)
                            type_texture=0;
                      break;
                      }//Fin du switch key


      Fais cela :


      case SDL_KEYUP:
                       switch (event.key.keysym.sym)
                       {
                       case SDLK_UP:
                            type_texture++;
                            if (type_texture>3)
                            type_texture=0;
                      break;
                      }//Fin du switch key
      break;
      • Partager sur Facebook
      • Partager sur Twitter
        24 mai 2006 à 21:21:48

        Bien vu :-°
        Mais cela ne regle paqs mon probleme
        Merci quand meme :p
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          24 mai 2006 à 22:22:55

          Ton programme change de texture jusqu'a ce que tu lache la touche ? si c'est cela, c'est normal, utilise la fonction SDL_GetTicks
          • Partager sur Facebook
          • Partager sur Twitter
            25 mai 2006 à 9:03:14

            Non, j'ai fait un "SDL_KEYUP" pour que l'evenement se face lorsque je lache la touche, mias il change de texture encore pendant environ 1sec voir plus.
            • Partager sur Facebook
            • Partager sur Twitter
              27 mai 2006 à 21:31:26

              Personne n'a de reponse a mon probleme
              • Partager sur Facebook
              • Partager sur Twitter
              Anonyme
                27 mai 2006 à 21:49:45

                Essaye quand même avec SDL_GetTicks

                Ou, au pire tu met un SDL_Delay après le changement de texture, pour voir comment ca foire
                • Partager sur Facebook
                • Partager sur Twitter
                  27 mai 2006 à 22:12:49

                  il y a deja un SDL_GetTicks et SDL_Delay dans "gestion du temps
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Anonyme
                    27 mai 2006 à 22:31:47

                    Essaye ainsi :

                         case SDL_KEYUP:
                                     switch (event.key.keysym.sym)  {
                                       case SDLK_UP:
                                            type_texture++;
                                            if (type_texture>3)
                                                type_texture=0;
                                            SDL_Delay(100);
                                            break;
                                     }//Fin du switch key
                         break;
                    • Partager sur Facebook
                    • Partager sur Twitter
                      28 mai 2006 à 10:45:04

                      toujours le meme défaut meme avec "SDL_Delay(100);"
                      • Partager sur Facebook
                      • Partager sur Twitter
                        29 mai 2006 à 22:46:08

                        Voila ton code modifié (attention j'ai changé le chemin des textures)



                        #include <SDL/sdl.h>
                        #include <SDL/SDL_image.h>
                        #include <GL/gl.h>
                        #include <GL/glu.h>
                        #include <cstdlib>
                        #include <math.h>
                        #include "sdlglutils.h"

                        //Quadratique
                        GLUquadric* params=gluNewQuadric();            //Parametre de visu des quadrique

                        GLuint texture_terre,texture_haut, texture_milieu,texture_bas, texture_cul;  //Texture

                        void roquette();


                        //Programme
                        int main(int argc, char *argv[])
                        {
                            bool continuer = true;
                            SDL_Event event;
                            int angle_camera=0, camera=0, angle=0,tempsPrecedent = 0, tempsActuel = 0;
                            int type_texture=0;
                            //Init SDL
                            SDL_Init(SDL_INIT_VIDEO);
                            //Cretion de l'ecran
                            SDL_WM_SetCaption("Roquette !",NULL);
                            SDL_SetVideoMode(640, 480, 32, SDL_OPENGL);
                            //Parametrage OPENGL
                            glMatrixMode( GL_PROJECTION );//Definie la matrice projection (orthogonale, perspective)
                            glLoadIdentity( );          //Init matrice projection
                            gluPerspective(70,(double)640/480,1,1000);//fovy, ratio, near, far

                            glMatrixMode( GL_MODELVIEW ); //Definie la matrice placement objet
                            glLoadIdentity( );            //Replace la matrice

                            glEnable(GL_DEPTH_TEST);//Buffer de profondeur
                            glEnable(GL_TEXTURE_2D);//Gestion des textures
                            //Camera
                            //gluLookAt(15,15,15,0,0,0,0,0,1);

                            //Parametre quadratique

                            texture_terre=loadTexture("EarthLow.jpg");
                            texture_haut=loadTexture("rocket_top.jpg");
                            texture_milieu=loadTexture("rocket_middle.jpg");
                            texture_bas=loadTexture("rocket_bottom.jpg");
                            texture_cul=loadTexture("rocket_motor.jpg");

                            //Boucle principale
                            //SDL_EnableKeyRepeat(10,10);
                            while (continuer)
                            {
                                glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );//Initialise les couleur et le buffer
                                glPushMatrix(); //pour que les transformations soient réversibles

                                //Type d'affichage
                                switch (type_texture)
                                {
                                    case 0:
                                    gluQuadricDrawStyle(params,GLU_FILL);//Texture plein
                                    gluQuadricTexture(params,GL_TRUE);//Activation des texture
                                    break;
                                    case 1:
                                    gluQuadricDrawStyle(params,GLU_LINE);//Texture line
                                    gluQuadricTexture(params,GL_FALSE);//Activation des texture
                                    break;
                                    case 2:
                                    gluQuadricDrawStyle(params,GLU_POINT);//Texture plein
                                    gluQuadricTexture(params,GL_FALSE);//Activation des texture
                                    break;
                                }
                                //Camera
                                gluLookAt(15+8*cos(2*camera*M_PI/180),15,15,0,0,0,0,0,1);
                                //Dessine la terre
                                glBindTexture(GL_TEXTURE_2D,texture_terre);//Appliquer texture
                                glRotated(angle,0,0,1);//Rotation
                                gluSphere(params,10,30,30);//Rayon, Verticale, Horizontal
                                glRotated(-angle,0,0,1);//Rotation
                                //Roquette 1
                                glRotated(angle,0,1,0);//Rotation
                                glTranslated(12,0,0);//Deplacement
                                roquette();
                                //Roquette 2
                                glTranslated(-12,0,0);//Deplacement
                                glRotated(-angle,0,1,0);//Rotation
                                glRotated((angle*2),1,0,0);//Rotation
                                glTranslated(0,12,0);//Deplacement
                                glRotated(180,1,0,0);//Rotation

                                roquette();
                                glPopMatrix(); //hop je remets tout comme je l'ai trouvé
                                //Raffraichir
                                glFlush();                  //Correspond au SDL_Flip(ecran);
                                SDL_GL_SwapBuffers();       //Correspond au SDL_Flip(ecran);

                                //Gestion du temps
                                tempsActuel = SDL_GetTicks();//SDL_GetTicks() donne le temps d'exution du programme en MS
                                if (tempsActuel - tempsPrecedent > 50) /*  ms se sont écoulées */
                                {
                                    angle=angle-5;
                                    camera++;
                                    if (angle<0)
                                        angle =360;
                                    tempsPrecedent = tempsActuel; /* Le temps "actuel" devient le temps "precedent" pour nos futurs calculs */
                                }
                                else /* Si ça fait moins de 30ms depuis le dernier tour de boucle, on endort le programme le temps qu'il faut */
                                {
                                    SDL_Delay(50 - (tempsActuel - tempsPrecedent));//Attend le reste du temps
                                }
                                //Fin gestion du temps

                                //Gestion des touches
                                while (SDL_PollEvent(&event))
                                {
                                switch(event.type)
                                {
                                    case SDL_QUIT:
                                    continuer = false;
                                    break;
                                    case SDL_KEYDOWN:
                                    switch (event.key.keysym.sym)
                                    {
                                        case SDLK_UP:
                                        type_texture++;
                                        if (type_texture>2)
                                            type_texture=0;
                                        break;
                                    }//Fin du switch key
                                    break;
                                }
                                }
                            }


                            //Fin du programme liberation de la memoire
                            gluDeleteQuadric(params);
                            SDL_Quit();

                            return 0;
                        }


                        void roquette()
                        {
                            //Roquette
                            glPushMatrix(); //pour que les transformations soient réversibles
                            //Cone top
                            glTranslated(0,0,0);//Deplacement
                            glBindTexture(GL_TEXTURE_2D,texture_haut);//Appliquer texture
                            gluCylinder(params,0.5,0.001,1.6,15,1);//Diam base, Diam haut, hauteur, facette verticale, facette horizontal
                            //Cone milieu
                            glTranslated(0,0,-1.05);//Deplacement
                            glBindTexture(GL_TEXTURE_2D,texture_milieu);//Appliquer texture
                            gluCylinder(params,0.15,0.5,1.05,15,1);//Diam base, Diam haut, hauteur, facette verticale, facette horizontal
                            //Cone bas
                            glTranslated(0,0,-0.25);//Deplacement
                            glBindTexture(GL_TEXTURE_2D,texture_bas);//Appliquer texture
                            gluCylinder(params,0.30,0.15,0.25,15,1);//Diam base, Diam haut, hauteur, facette verticale, facette horizontal
                            //Disque bas
                            glBindTexture(GL_TEXTURE_2D,texture_cul);//Appliquer texture
                            gluCylinder(params,0.30,0.15,0.25,15,1);//Diam base, Diam haut, hauteur, facette verticale, facette horizontal
                            gluDisk(params,0,0.3,15,1);//Diam int, diam out, facette cote, facette diametre
                            //Fin roquette
                            glPopMatrix(); //hop je remets tout comme je l'ai trouvé

                        }



                        Il ne faut pas Poller un seul event. Il faut vider toute la queue avant de continuer. (ce n'est pas comme un wait event).
                        Note : sympa ton petit truc au passage ;)
                        • Partager sur Facebook
                        • Partager sur Twitter
                          30 mai 2006 à 8:28:01

                          Merci, beaucoup mon problème est resolu. J'attend avec impatience la suite.
                          • Partager sur Facebook
                          • Partager sur Twitter

                          Probleme evenement SDL

                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                          • Editeur
                          • Markdown