Partage
  • Partager sur Facebook
  • Partager sur Twitter

Oû est le problème???

no match for 'operator =='

Anonyme
    28 avril 2006 à 22:21:12

    Bonsoir.

    J'ai un petit gros problème que je n'arrive pas à résoudre et que je ne comprends pas...

    Dans mon programme, le compilateur m'indique une erreur et me dit:
    no match for 'operator ==" in 'pos_curseur == Rect(72, 93)'
    Pour la ligne:
    if (pos_curseur == Rect(72, 93)) PositionCurseur = 1;

    pos_curseur est de type SDL_Rect ainsi que la fonction:
    SDL_Rect Rect(int x,int y,int w=0,int h=0)
    {
            SDL_Rect r;
            r.x=x;
            r.y=y;
            r.w=w;
            r.h=h;
            return r;
    }


    Je ne comprends pas pourquoi cela ne marche pas...
    Je ne pense pas que ça ait un rapport avec le reste du code, mais bon je vous le mets quand même, qui sait :)

    #include <SDL/SDL.h>


    ////////////MACROS (pour simplifier le codage des events)////////////

    #define ECHAPE SDLK_ESCAPE
    #define ENTREE SDLK_RETURN
    #define HAUT SDLK_UP
    #define BAS SDLK_DOWN
    #define DROITE SDLK_RIGHT
    #define GAUCHE SDLK_LEFT

    #define TEMPS_MENU 1000

    ////////////INITIALISATION DES TAMPONS//////////

    SDL_Surface* screen;
    SDL_Surface* menu1;
    SDL_Surface* message_clignotant;
    SDL_Surface* menu2;
    SDL_Surface* curseur;

    ////////////INITIALISATION DES EVENEMENTS//////////

    SDL_Event event;

    ///////////CREATION DES FONCTIONS NECESSAIRES AU PROGRAMME/////////////

    SDL_Rect Rect(int x,int y,int w=0,int h=0) //pour faire des rectangles
    {
            SDL_Rect r;
            r.x=x;
            r.y=y;
            r.w=w;
            r.h=h;
            return r;
    }   

    SDL_Surface* ChargeBMP(char* fichier,int vram=1)  //Pour charger un bitmap
    {
       SDL_Surface* f = SDL_LoadBMP(fichier);       
       SDL_Surface* r=NULL;
       if (vram)
               r=SDL_CreateRGBSurface(SDL_HWSURFACE, f->w, f->h, 32, 0, 0, 0, 0);
       if (r==NULL) vram=0
       if (!vram)
               r=SDL_CreateRGBSurface(SDL_SWSURFACE, f->w, f->h, 32, 0, 0, 0, 0);
       SDL_Rect R=Rect(0,0,f->w,f->h);
       SDL_BlitSurface(f,NULL,r,&R);   
       SDL_FreeSurface(f);     
       return r;
    }   

    void init_SDL() //initialisation de SDL
    {
        SDL_Init(SDL_INIT_VIDEO);
        SDL_WM_SetIcon(SDL_LoadBMP("Graphismes/icone.bmp"), NULL);
        screen = SDL_SetVideoMode(600, 500, 32,SDL_HWSURFACE|SDL_DOUBLEBUF);
        SDL_ShowCursor(0); //on enlève le curseur
        SDL_WM_SetCaption("Pong", NULL); //titre
    }

    void quit_SDL() //pour quitter
    {
        SDL_ShowCursor(1);
        SDL_Quit();
    }

    //Appui des touches
    char intern_key[400];

    void UpdateKeys()
    {
        while(SDL_PollEvent(&event))
        {
            switch (event.type)
            {
               
                    case SDL_KEYDOWN:
                    intern_key[event.key.keysym.sym]=1;
                    break;
                   
                    case SDL_KEYUP:
                    intern_key[event.key.keysym.sym]=0;
                    break;
            }
        }
    }   
           
    int Touche(int sdlcode)
    {
        int retour = intern_key[sdlcode];
        return retour;
    }





    ///////////CORPS DU PROGRAMME////////////////

    int main(int argc, char** argv)
    {
        init_SDL(); //Initialisation de SDL   
       
        SDL_Rect fenetre_entiere = Rect(0, 0);
        SDL_Rect pos_message_clignotant = Rect(60, 360);
        SDL_Rect pos_curseur = Rect(92, 73);
       
        menu1 = ChargeBMP("Graphismes/menus/menu1.bmp", 0);
        message_clignotant = ChargeBMP("Graphismes/menus/message_clignotant.bmp");
        curseur = ChargeBMP("Graphismes/autres_images/curseur.bmp");
       
       
        bool direct_m2 = false;
       
        int attente;
        int activer_menu=-1;
        int activer_attente=1;
        int PositionCurseur;
        SDL_Rect pos_1 = Rect(92, 73);
       
        while (!Touche(ECHAPE)) //tant qu'on appuie pas sur echape
        {
            UpdateKeys(); //Rafraichissement des events
           
            if (direct_m2 == true) goto menu2; //si la variable vaut true on passe direct au deuxième menu
           
           
           //Si l'attente est activer, on la met en place, et on la desactive
            if(activer_attente==1)
            {
                attente= SDL_GetTicks() + TEMPS_MENU;
                activer_attente=0;
            }
           
            //Si l'attente est passée, on inverse activer_menu et on active l'attente pour le prochain tour
            if( SDL_GetTicks() > attente )
            {
                activer_menu = -activer_menu;   
                activer_attente=1;
            }   
           
            //Si activer_menu=-1 on affiche image de fond + menu
            if(activer_menu==-1)
            {
                SDL_BlitSurface(menu1, NULL, screen, &fenetre_entiere);           
                SDL_BlitSurface(message_clignotant, NULL, screen, &pos_message_clignotant);
            }
           
            //Si activer_menu=1 on affiche que l'image de fond
            if(activer_menu==1)
            {
                SDL_BlitSurface(menu1, NULL, screen, &fenetre_entiere);
            } 
                   
            if (Touche(ENTREE)) //si on appuie sur entree
            {
               
                SDL_FreeSurface(screen); //libération de l'écran
                direct_m2 = true; //pour dire de passer direct au deuxième menu après la boucle
               
                menu2:
                menu2 = ChargeBMP("Graphismes/menus/menu2.bmp", 0);
               
                while (1)
                {
                    if (Touche(ECHAPE)) return 0;
                   
                             
                    SDL_BlitSurface(menu2, NULL, screen, &fenetre_entiere); //on colle l'image sur l'écran
                   
                    SDL_BlitSurface(curseur, NULL, screen, &pos_curseur);
                   
                    if (pos_curseur==pos_1) PositionCurseur = 1;                   
                   
                    if (PositionCurseur == 1)
                    {
                        SDL_FreeSurface(curseur);
                        pos_curseur = Rect(92, 73);
                        SDL_BlitSurface(curseur, NULL, screen, &pos_curseur);
                        if (Touche(BAS)) PositionCurseur = 2;
                        if (Touche(HAUT)) PositionCurseur = 3;
                        SDL_Flip(screen);
                    }
                   
                    if (PositionCurseur == 2)
                    {
                        SDL_FreeSurface(curseur);
                        pos_curseur = Rect(69, 230);
                        SDL_BlitSurface(curseur, NULL, screen, &pos_curseur);
                        if (Touche(BAS)) PositionCurseur = 3;
                        if (Touche(HAUT)) PositionCurseur = 1;
                        SDL_Flip(screen);
                    }
                   
                    if (PositionCurseur == 3)
                    {
                        SDL_FreeSurface(curseur);
                        pos_curseur = Rect(107, 384);
                        SDL_BlitSurface(curseur, NULL, screen, &pos_curseur);
                        if (Touche(HAUT)) PositionCurseur = 2;
                        if (Touche(BAS)) PositionCurseur = 1;
                        SDL_Flip(screen);
                    }       
                   
                    SDL_Flip(screen);
                    UpdateKeys();
                   
                }   
            }   
           
           
            SDL_FreeSurface(screen);
           
            SDL_Flip(screen); //Rafraîchissement de screen           
        }
       
       
        quit_SDL(); // On quitte SDL
        return 0;   
    }   

    • Partager sur Facebook
    • Partager sur Twitter
      28 avril 2006 à 22:28:43

      if (pos_curseur == Rect(72, 93)) PositionCurseur = 1;
      tu compares quoi là ?
      • Partager sur Facebook
      • Partager sur Twitter
        28 avril 2006 à 22:30:23

        On ne peut pas comparer une structure à une autre, tu dois comparer les éléments 1 à 1.

        ++
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          28 avril 2006 à 22:33:54

          Donc je dois faire quelquechose comme:

          if (pos_curseur.x == 72 && pos_curseur.y == 93) PositionCurseur = 1;


          C'est ça?
          • Partager sur Facebook
          • Partager sur Twitter
            28 avril 2006 à 22:39:54

            Oui, le mieux c'est que tu crée une fonction qui prend les deux structures en paramètres, qui compare les éléments 1 à 1, elle retournera 1 si les structures sont identiques ou 0 dans le cas contraire. Tu pourra alors faire :

            if (cmp_rect(pos_curseur, Rect(72, 93))) PositionCurseur = 1;

            C'est moins lourd que de comparer tous les éléments dans la condition (w, h, x, y ...)
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              28 avril 2006 à 22:40:22

              Merci, c'est vrai ça marche... :D

              Mais seulement maintenant, avec le code qui suit, le programme s'ouvre, et la surface 'message_clignotant' clignote toutes les secondes par-dessus la surface 'menu1', comme je le voulais, mais si j'appuie sur Entrée, le programme s'arrête...
              Je vais voir si il y a un fichier stderr...
              Oui, et il me dit:
              Fatal signal: Segmentation Fault (SDL Parachute Deployed)

              Quel est le problème? :

              #include <SDL/SDL.h>


              ////////////MACROS (pour simplifier le codage des events)////////////

              #define ECHAPE SDLK_ESCAPE
              #define ENTREE SDLK_RETURN
              #define HAUT SDLK_UP
              #define BAS SDLK_DOWN
              #define DROITE SDLK_RIGHT
              #define GAUCHE SDLK_LEFT

              #define TEMPS_MENU 1000

              ////////////INITIALISATION DES TAMPONS//////////

              SDL_Surface* screen;
              SDL_Surface* menu1;
              SDL_Surface* message_clignotant;
              SDL_Surface* menu2;
              SDL_Surface* curseur;

              ////////////INITIALISATION DES EVENEMENTS//////////

              SDL_Event event;

              ///////////CREATION DES FONCTIONS NECESSAIRES AU PROGRAMME/////////////

              SDL_Rect Rect(int x,int y,int w=0,int h=0) //pour faire des rectangles
              {
                      SDL_Rect r;
                      r.x=x;
                      r.y=y;
                      r.w=w;
                      r.h=h;
                      return r;
              }   

              SDL_Surface* ChargeBMP(char* fichier,int vram=1)  //Pour charger un bitmap
              {
                 SDL_Surface* f = SDL_LoadBMP(fichier);       
                 SDL_Surface* r=NULL;
                 if (vram)
                         r=SDL_CreateRGBSurface(SDL_HWSURFACE, f->w, f->h, 32, 0, 0, 0, 0);
                 if (r==NULL) vram=0
                 if (!vram)
                         r=SDL_CreateRGBSurface(SDL_SWSURFACE, f->w, f->h, 32, 0, 0, 0, 0);
                 SDL_Rect R=Rect(0,0,f->w,f->h);
                 SDL_BlitSurface(f,NULL,r,&R);   
                 SDL_FreeSurface(f);     
                 return r;
              }   

              void init_SDL() //initialisation de SDL
              {
                  SDL_Init(SDL_INIT_VIDEO);
                  SDL_WM_SetIcon(SDL_LoadBMP("Graphismes/icone.bmp"), NULL);
                  screen = SDL_SetVideoMode(600, 500, 32,SDL_HWSURFACE|SDL_DOUBLEBUF);
                  SDL_ShowCursor(0); //on enlève le curseur
                  SDL_WM_SetCaption("Pong", NULL); //titre
              }

              void quit_SDL() //pour quitter
              {
                  SDL_ShowCursor(1);
                  SDL_Quit();
              }

              //Appui des touches
              char intern_key[400];

              void UpdateKeys()
              {
                  while(SDL_PollEvent(&event))
                  {
                      switch (event.type)
                      {
                         
                              case SDL_KEYDOWN:
                              intern_key[event.key.keysym.sym]=1;
                              break;
                             
                              case SDL_KEYUP:
                              intern_key[event.key.keysym.sym]=0;
                              break;
                      }
                  }
              }   
                     
              int Touche(int sdlcode)
              {
                  int retour = intern_key[sdlcode];
                  return retour;
              }





              ///////////CORPS DU PROGRAMME////////////////

              int main(int argc, char** argv)
              {
                  init_SDL(); //Initialisation de SDL   
                 
                  SDL_Rect fenetre_entiere = Rect(0, 0);
                  SDL_Rect pos_message_clignotant = Rect(60, 360);
                  SDL_Rect pos_curseur = Rect(92, 73);
                 
                  menu1 = ChargeBMP("Graphismes/menus/menu1.bmp", 0);
                  message_clignotant = ChargeBMP("Graphismes/menus/message_clignotant.bmp");
                  curseur = ChargeBMP("Graphismes/autres_images/curseur.bmp");
                 
                 
                  bool direct_m2 = false;
                 
                  int attente;
                  int activer_menu=-1;
                  int activer_attente=1;
                  int PositionCurseur;
                 
                  while (!Touche(ECHAPE)) //tant qu'on appuie pas sur echape
                  {
                      UpdateKeys(); //Rafraichissement des events
                     
                      if (direct_m2 == true) goto menu2; //si la variable vaut true on passe direct au deuxième menu
                     
                     
                     //Si l'attente est activer, on la met en place, et on la desactive
                      if(activer_attente==1)
                      {
                          attente= SDL_GetTicks() + TEMPS_MENU;
                          activer_attente=0;
                      }
                     
                      //Si l'attente est passée, on inverse activer_menu et on active l'attente pour le prochain tour
                      if( SDL_GetTicks() > attente )
                      {
                          activer_menu = -activer_menu;   
                          activer_attente=1;
                      }   
                     
                      //Si activer_menu=-1 on affiche image de fond + menu
                      if(activer_menu==-1)
                      {
                          SDL_BlitSurface(menu1, NULL, screen, &fenetre_entiere);           
                          SDL_BlitSurface(message_clignotant, NULL, screen, &pos_message_clignotant);
                      }
                     
                      //Si activer_menu=1 on affiche que l'image de fond
                      if(activer_menu==1)
                      {
                          SDL_BlitSurface(menu1, NULL, screen, &fenetre_entiere);
                      } 
                             
                      if (Touche(ENTREE)) //si on appuie sur entree
                      {
                         
                          SDL_FreeSurface(screen); //libération de l'écran
                          direct_m2 = true; //pour dire de passer direct au deuxième menu après la boucle
                         
                          menu2:
                          menu2 = ChargeBMP("Graphismes/menus/menu2.bmp", 0);
                         
                          while (1)
                          {
                              if (Touche(ECHAPE)) return 0;
                             
                                       
                              SDL_BlitSurface(menu2, NULL, screen, &fenetre_entiere); //on colle l'image sur l'écran
                             
                              SDL_BlitSurface(curseur, NULL, screen, &pos_curseur);
                             
                              if (pos_curseur.x ==92 && pos_curseur.y == 73) PositionCurseur = 1;                   
                             
                              if (PositionCurseur == 1)
                              {
                                  SDL_FreeSurface(curseur);
                                  pos_curseur = Rect(92, 73);
                                  SDL_BlitSurface(curseur, NULL, screen, &pos_curseur);
                                  if (Touche(BAS)) PositionCurseur = 2;
                                  if (Touche(HAUT)) PositionCurseur = 3;
                                  SDL_Flip(screen);
                              }
                             
                              if (PositionCurseur == 2)
                              {
                                  SDL_FreeSurface(curseur);
                                  pos_curseur = Rect(69, 230);
                                  SDL_BlitSurface(curseur, NULL, screen, &pos_curseur);
                                  if (Touche(BAS)) PositionCurseur = 3;
                                  if (Touche(HAUT)) PositionCurseur = 1;
                                  SDL_Flip(screen);
                              }
                             
                              if (PositionCurseur == 3)
                              {
                                  SDL_FreeSurface(curseur);
                                  pos_curseur = Rect(107, 384);
                                  SDL_BlitSurface(curseur, NULL, screen, &pos_curseur);
                                  if (Touche(HAUT)) PositionCurseur = 2;
                                  if (Touche(BAS)) PositionCurseur = 1;
                                  SDL_Flip(screen);
                              }       
                             
                              SDL_Flip(screen);
                              UpdateKeys();
                             
                          }   
                      }   
                     
                     
                      SDL_FreeSurface(screen);
                     
                      SDL_Flip(screen); //Rafraîchissement de screen           
                  }
                 
                 
                  quit_SDL(); // On quitte SDL
                  return 0;   
              }   


              Merci de bien vouloir m'aider. ^^
              • Partager sur Facebook
              • Partager sur Twitter
                28 avril 2006 à 22:43:40

                Rien dit lu trop vite :s
                • Partager sur Facebook
                • Partager sur Twitter
                  28 avril 2006 à 22:44:51

                  Citation : fock

                  Pour quitter la SDL c'est SDL_Quit(); et pa quit_SDL();


                  c'est une de ces fonctions
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Anonyme
                    28 avril 2006 à 22:46:48

                    quit_SDL

                    Est une fonction définie par le programme qui permet de tout désinitialiser et qui comprend entre-autres la fonction de SDL SDL_Quit();... :

                    void quit_SDL() //pour quitter
                    {
                        SDL_ShowCursor(1);
                        SDL_Quit();
                    }


                    En fait, c'est vrai qu'elle ne sert pas à grand chose :p
                    • Partager sur Facebook
                    • Partager sur Twitter

                    Oû est le problème???

                    × 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