Partage
  • Partager sur Facebook
  • Partager sur Twitter

Afficher des textures différentes pour la même fonction

En opengl

    5 juin 2006 à 14:12:40

    Bonjour

    Alors voila, je débute en opengl avec les cours de Kayl, et pour essayer de faire un jeu en 2D, j'ai voulu créer un fonction pour afficher simplement une surface texturée. Cette fonction marche bien, sauf que la texture utilisée pour la premiere surface se retrouve également sur la deuxieme, alors que j'en avait demandé une autre.

    Voila donc le code de mon fichier main qui contient aussi la fonction qui pose probleme :

    #include "allthings.h"
    #include "main.h"
    #include "sdlglutils.h"


    int main(int argc, char *argv[])
    {
        GLuint sol, perso;
        int posX=100;
        int posY=100;
        int tailleX, tailleY, tailleFX, tailleFY;
        SDL_Surface *surface, *fond;

        fond = IMG_Load("imageterrain.jpg");
        surface = IMG_Load("perso.png");
       

        SDL_Init(SDL_INIT_VIDEO);
        SDL_WM_SetCaption("Test",NULL);
        SDL_SetVideoMode(SCREEN_X, SCREEN_Y, 32, SDL_OPENGL);

        glMatrixMode( GL_PROJECTION );
        glLoadIdentity( );

        gluOrtho2D(0,SCREEN_X,0,SCREEN_Y);
        glEnable(GL_TEXTURE_2D);

        tailleX = surface->w;
        tailleY = surface->h;
        tailleFX = fond->w;
        tailleFY = fond->h;

        SDL_FreeSurface(surface);
        SDL_FreeSurface(fond);

        sol = loadTexture("imageterrain.jpg");
        perso = loadTexture("perso.png");



        bool continuer = true;
        SDL_Event event;

        while (continuer)
        {
            SDL_PollEvent(&event);
            switch(event.type)
            {
                case SDL_QUIT:
                continuer = false;
                break;
                case SDL_KEYDOWN:
                    switch (event.key.keysym.sym)
                    {
                        case SDLK_UP:
                        posY++;
                        break;
                        case SDLK_DOWN:
                        posY--;
                        break;
                        case SDLK_LEFT:
                        posX--;
                        break;
                        case SDLK_RIGHT:
                        posX++;
                        break;
                    }
                    break;

            }

            glClear(GL_COLOR_BUFFER_BIT);
            glMatrixMode( GL_MODELVIEW );
            glLoadIdentity( );

            createSurface(sol, 0, 0, tailleFX, tailleFY);
            createSurface(perso, posX, posY, tailleX, tailleY);
            glFlush();
            SDL_GL_SwapBuffers();


        }

        SDL_Quit();

        return 0;
    }

    void createSurface(GLuint texture, long posX, long posY, long tailleX, long tailleY)
    {


        long posXend = posX + tailleX;
        long posYend = posY + tailleY;


        GLuint texture1;

        texture1 = texture;

        glPushMatrix();


        glEnable(GL_BLEND);
        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);


        glBegin(GL_QUADS);
        glBindTexture(GL_TEXTURE_2D, texture1);

        glTexCoord2d(0,0);  glVertex2d(posX,posY);
        glTexCoord2d(0,1);  glVertex2d(posX,posYend);
        glTexCoord2d(1,1);  glVertex2d(posXend,posYend);
        glTexCoord2d(1,0);  glVertex2d(posXend,posY);

        glEnd();

        glDisable(GL_BLEND);
        glFlush();

        glPopMatrix();
    }


    Voilà, j'espere que mon code n'est pas trop salement codé :honte:

    Merci

    PS : Je précise que ce code me donne un perso élargit a la taille de toute la fenetre ( a la taille a laquelle doit etre le terrain, normal quoi :) ) avec le perso taille normale dessus. Et moi, je voudrais l'image du terrain avec dessus l'image du perso.
    • Partager sur Facebook
    • Partager sur Twitter
      5 juin 2006 à 14:16:34

      Citation : http://www.opengl.org/documentation/specs/man_pages/hardcopy/GL/html/gl/bindtexture.html

      GL_INVALID_OPERATION is generated if glBindTexture is
      executed between the execution of glBegin and the
      corresponding execution of glEnd.

      • Partager sur Facebook
      • Partager sur Twitter
        5 juin 2006 à 14:19:52

        Merci énormément pour cette réponse tres rapide. Sa marche maintenant parfaitement :)
        • Partager sur Facebook
        • Partager sur Twitter
          6 juin 2006 à 17:53:59

          Rebonjour.

          Voila, comme j'ai un autre probleme sur le même code, j'ai pensé que je pouvais le mettre ici plutôt que de recréer un post.

          Voila mon code actuel



          #include "allthings.h"
          #include "main.h"
          #include "sdlglutils.h"


          int main(int argc, char *argv[])
          {
              GLuint sol, perso;
              int posX=100;
              int posY=100;
              int tailleX, tailleY, tailleFX, tailleFY;
              SDL_Surface *surface, *fond;

              fond = IMG_Load("terrain.jpg");
              surface = IMG_Load("perso.png");


              SDL_Init(SDL_INIT_VIDEO);
              SDL_WM_SetCaption("Test",NULL);
              SDL_SetVideoMode(SCREEN_X, SCREEN_Y, 32, SDL_OPENGL);

              glMatrixMode( GL_PROJECTION );
              glLoadIdentity( );

              gluOrtho2D(0,SCREEN_X,0,SCREEN_Y);
              glEnable(GL_TEXTURE_2D);

              tailleX = surface->w;
              tailleY = surface->h;
              tailleFX = fond->w;
              tailleFY = fond->h;

              SDL_FreeSurface(surface);
              SDL_FreeSurface(fond);

              sol = loadTexture("terrain.jpg");
              perso = loadTexture("perso.png");

              bool forward = false;
              bool backward = false;
              bool left = false;
              bool right = false;
              long angle = 0;

              const Uint32 time_per_frame = 1000/FPS;
              Uint32 last_time,current_time,elapsed_time;
              Uint32 start_time,stop_time;

              const double forwardspeed = 0.1;
              const double turnspeed = 0.1;
              double forwardX = -sin(angle*M_PI/180);
              double forwardY = cos(angle*M_PI/180);

              bool continuer = true;
              SDL_Event event;

              while (continuer)
              {
                  start_time = SDL_GetTicks();
                  SDL_PollEvent(&event);
                  switch(event.type)
                  {
                      case SDL_QUIT:
                      exit(0);
                      break;
                      case SDL_KEYDOWN:
                      switch (event.key.keysym.sym)
                      {
                          case SDLK_UP:
                          forward = true;
                          break;
                          case SDLK_DOWN:
                          backward = true;
                          break;
                          case SDLK_LEFT:
                          left = true;
                          break;
                          case SDLK_RIGHT:
                          right = true;
                          break;
                      }
                      break;
                      case SDL_KEYUP:
                      switch (event.key.keysym.sym)
                      {
                          case SDLK_UP:
                          forward = false;
                          break;
                          case SDLK_DOWN:
                          backward = false;
                          break;
                          case SDLK_LEFT:
                          left = false;
                          break;
                          case SDLK_RIGHT:
                          right = false;
                          break;
                      }
                      break;

                  }


                  current_time = SDL_GetTicks();
                  elapsed_time = current_time - last_time;
                  last_time = current_time;

                  /*Deplacements*/
                  if (left)
                  {
                      angle += elapsed_time*turnspeed;
                  }
                  if (right)
                  {
                      angle -= elapsed_time*turnspeed;
                  }
                  if (forward)
                  {
                      posX += elapsed_time*forwardspeed*forwardX;
                      posY += elapsed_time*forwardspeed*forwardY;
                  }
                  if (backward)
                  {
                      posX -= elapsed_time*forwardspeed*forwardX;
                      posY -= elapsed_time*forwardspeed*forwardY;
                  }

                  glClear(GL_COLOR_BUFFER_BIT);
                  glMatrixMode( GL_MODELVIEW );
                  glLoadIdentity( );

                  createSurface(sol, 0, 0, tailleFX, tailleFY);
                  glRotated(angle,0,0,1);
                  createSurface(perso, posX, posY, tailleX, tailleY);


                  /*Limitation FPS*/
                  stop_time = SDL_GetTicks();
                  if ((stop_time - last_time) < time_per_frame)
                  {
                      SDL_Delay(time_per_frame - (stop_time - last_time));
                  }

                  glFlush();
                  SDL_GL_SwapBuffers();

              }

              SDL_Quit();

              return EXIT_SUCCESS;
          }



          void createSurface(GLuint texture, long posX, long posY, long tailleX, long tailleY) // Fonction pour créer simplement une surface texturée
          {
              long posXend = posX + tailleX;
              long posYend = posY + tailleY;

              GLuint texture1;

              texture1 = texture;

              glEnable(GL_BLEND);
              glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

              glBindTexture(GL_TEXTURE_2D, texture1);

              /*Le dessin de la surface avec ses textures*/
              glBegin(GL_QUADS);
              glTexCoord2d(0,0);
              glVertex2d(posX,posY);
              glTexCoord2d(0,1);
              glVertex2d(posX,posYend);
              glTexCoord2d(1,1);
              glVertex2d(posXend,posYend);
              glTexCoord2d(1,0);
              glVertex2d(posXend,posY);
              glEnd();

              glDisable(GL_BLEND);

          }


          Donc, que j'ai fait avec l'exemple de Kayl pour faire bouger un personnage a 360°
          mais voila, tout marche bien, a peut pres, parceque le centre de rotation n'est pas au bon endroit et ne suis pas le perso. Je suppose donc qu'il y a quelque chose que je n'ai pas compris dans l'exemple et que j'ai oublié de modifier. Voila, si quelqu'un saurait me dire pourquoi :)

          Merci
          • Partager sur Facebook
          • Partager sur Twitter
            14 juin 2006 à 15:36:07

            Je ressai un dernier up
            • Partager sur Facebook
            • Partager sur Twitter

            Afficher des textures différentes pour la même fonction

            × 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