SDL2 Utilisation de la fonction SDL_Blitsurface()

Résolu
poparnassus Messages postés 462 Statut Membre -  
poparnassus Messages postés 462 Statut Membre -
Salut la team,

J'ai un probleme sur l'utilisation de la fonction
SDL_BlitSurface();
!!!
Je suis sous Win7 avec Code::block, je n'arrive pas à utiliser le 4eme parametre de la fonction qui est donc la position, je develeoppe:

Ca c'est mon morceau de code où pour le cas statueCAM == 0 J'affiche CAMERA OFF et ma fenetre qui affiche la camera doit disparaitre (le SDL_Rect de la fenetree camera c'est " camera->Rcamera ").
Et pour le cas ou " statueCAM ==1 " J'affiche camera on et la je balance les images de la camera dans ma surface Rcamera !

PROBLEME; Jusqua present j'ai utiliser cette fonction pour copier les image static
SDL_RenderCopy(ecran->renderer1, menu_haut->TstatueCAM, NULL, &menu_haut->RstatueCAM );
, en revanche j'arrive pas a les supprimer, sauf si je rempli de la couleur blanche mon rectangle, mais ca me fait un joile troue dans mon image de fond ...

J'aimerai des explication sur l'utilisation de
SDL_BlitSurface();
sur le dernier parameter

Ca provient du Wiki sdl, j'arrive pas à utiliser le dernier parametre en passant par ma structure
menu_gauche->Rcamera

int SDL_BlitSurface(SDL_Surface*    src,
                    const SDL_Rect* srcrect,
                    SDL_Surface*    dst,
                    SDL_Rect*       dstrect)


SDL_blitSurface(ecran->SimageFond_1,NULL,camera->Rcamera, ?)

ecran->SimageFond_1 = La surface ou j'ai chargé mon image
NULL = Car je copie l'integralité de l'image sur la surface cible
camera->Rcamera = Surface cible
? = Position de mon image , que j'arrive pas a integrer .....

<souligne>prototype.h</souligne>
typedef struct camera camera;
struct camera
{
    SDL_Surface *SimageFondCam;
    SDL_Texture *TimageFondCam;

    SDL_Rect Rcamera;
    SDL_Surface *Scamera;
    SDL_Texture *Tcamera;
};





<souligne>affichage.c</souligne>
...
if(menu_haut->statueCAM == 0) //camera deconnecter
    {
        SDL_SetRenderDrawColor(ecran->renderer1,255,201,14,0); //orange
        SDL_RenderFillRect(ecran->renderer1, &menu_haut->RstatueCAM);
        menu_haut->SstatueCAM = TTF_RenderText_Blended(ecran->police, " Camera OFF ",ecran->couleurNoire);
        menu_haut->TstatueCAM = SDL_CreateTextureFromSurface(ecran->renderer1, menu_haut->SstatueCAM);
        SDL_RenderFillRect(ecran->renderer1, &menu_haut->RstatueCAM );
        SDL_QueryTexture(menu_haut->TstatueCAM, NULL, NULL, &w, &h);
        SDL_RenderCopy(ecran->renderer1, menu_haut->TstatueCAM, NULL, &menu_haut->RstatueCAM );
        SDL_RenderPresent(ecran->renderer1);

        //SDL_SetRenderDrawColor(ecran->renderer1,0,0,0,0);
        //SDL_RenderFillRect(ecran->renderer1, &camera->Rcamera);
    }
    else if (menu_haut->statueCAM == 1) //Camera connecter
    {
        int w = 5 , h = 5;
        SDL_SetRenderDrawColor(ecran->renderer1,63,241,58,0); //vert
        SDL_RenderFillRect(ecran->renderer1, &menu_haut->RstatueCAM);

        menu_haut->SstatueCAM = TTF_RenderText_Blended(ecran->police, " Camera ON ",ecran->couleurNoire);
        menu_haut->TstatueCAM = SDL_CreateTextureFromSurface(ecran->renderer1, menu_haut->SstatueCAM);
        SDL_RenderFillRect(ecran->renderer1, &menu_haut->RstatueCAM );
        SDL_QueryTexture(menu_haut->TstatueCAM, NULL, NULL, &w, &h);
        SDL_RenderCopy(ecran->renderer1, menu_haut->TstatueCAM, NULL, &menu_haut->RstatueCAM );

        SDL_SetRenderDrawColor(ecran->renderer1,255,255,255,255);
        SDL_RenderFillRect(ecran->renderer1, &camera->Rcamera);
        SDL_RenderPresent(ecran->renderer1);
    }
...


1 réponse

  1. paly2 Messages postés 261 Statut Membre 25
     
    SDL_BlitSurface() permet de copier une surface sur une autre, exactement comme SDL_RenderCopy() copie une texture sur un renderer. Le dernier paramètre est quasiment le même: il s'agit du SDL_Rect qui indique la position à laquelle il faut copier la surface (les membres w et h sont ignorés, seuls x et y importent). Finalement donc une seule différence entre le 4ème paramètre de SDL_BlitSurface() et celui de SDL_RenderCopy(), c'est que SDL_RenderCopy est capable d'étirer ou de rétrécir la texture au moyen des membres w et h (que SDL_BlitSurface() ignore).

    Mais SDL_BlitSurface() n'est plus utile et dépassée en SDL2, je ne comprends par ton problème avec SDL_RenderCopy()... En SDL, on nettoie toujours le renderer (avec SDL_RenderClear() et une couleur que tu choisis avec SDL_
    SetRenderDrawColor()) avant de commencer à tracer, ce qui efface tout. Il ne faut pas avoir peur de retracer l'écran en entier dès qu'on modifie un petit détail, c'est ce que tout le monde fait.
    3
    1. poparnassus Messages postés 462 Statut Membre 31
       
      OUII exactement, merci de ta reponse. Je m'en suis rendu compte en faite, j'utilsai mal les fonction ,deja je ne faisai pas de SDL_RenderClear() du coup j'avais une charge énorme en memoire ^^Maintenant c'est compris.

      Par contre j'ai un autre probleme que je n'arrive pas a identifié, j'ai une fonction chargement_image() qui est appeler dans la boucle principale, cette fonction definit mon rendu sur mon interface, donc j'ai mis une jolie petite image "Quitter" j'aai definit le SDL_Rect, SDL_Surface je la charge dans la fonction chargement_image(), elle s'affiche tout va bien, mais des que je rentre ce code dans ma fonction evenement:


      if(e.type == SDL_MOUSEMOTION)
      {
      ecran->Rscreen.x=e.motion.xrel;
      ecran->Rscreen.y=e.motion.yrel;
      input->sourisX = e.motion.x;
      input->sourisY = e.motion.y;
      }


      avec la condition pour quitter quand la souris est dans le rectangle:

      if( "les limites de mon rectangle ")
      {
      if(input->sourisBG == 1)
      {
      input->quitter = 1; //Quitter le programme
      }

      }


      Quand je clique sur Quitter ca quitte ! Mais limage de fond se deplace avec la souris je pige pas, je peux mettre une video si tu veux.
      0
    2. paly2 Messages postés 261 Statut Membre 25
       
      Il me faudrait le code de ta fonction chargement_image()...

      Mais déjà vérifie que tu n'utilises pas ecran->Rscreen ou input->sourisX dans cette fonction.
      0
    3. poparnassus Messages postés 462 Statut Membre 31
       
      Non imput->souris est defini dans la fonction pilotage, tout comme les autres variables.
      La fonction affichage gere uniquement la partie graphique, donc debut de fonction j'efface le render, ensuite je charge les images si les conditions sont valider j'affiche les images , sauf pour l'image de fond qui est charger et afficher a chaque appel de la fonction; en debut de fonction

      affichage.c
      
      void chargement_image(Input *input, ecran *ecran, menu_droit *menu_droit, menu_haut *menu_haut, menu_gauche *menu_gauche, menu_bas *menu_bas, camera *camera,zozor *zozor)
      {
          int w = 10 , h = 10;
      
      
          //SDL_RenderFillRect(ecran->renderer1, &ecran->screen1);
          SDL_RenderClear(ecran->renderer1);
          SDL_SetRenderDrawColor(ecran->renderer1,255,255,255,255); //BLANC
      
          ecran->SimageFond_1 = SDL_LoadBMP("./image/fond7.bmp");
          if (ecran->SimageFond_1 == NULL)
          {
              //SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR,"Erreur","Erreur: Impossible de charger l'image fond1.",NULL);
          }
          else
          {
              //Affichage image de fond
              ecran->TimageFond_1 = SDL_CreateTextureFromSurface(ecran->renderer1,ecran->SimageFond_1);
              SDL_RenderCopy(ecran->renderer1,ecran->TimageFond_1 ,NULL,&ecran->Rscreen);
          }
      
          //Fonction Temps
          time_t now = time (NULL);
          struct tm tm_now = *localtime (&now);
          //strftime (xdate, sizeof xdate, "%d:%m:%Y", &tm_now);
          strftime (xtime, sizeof xtime, "%H:%M:%S", &tm_now);
          //Affichage temps
          sprintf(xtime_p, "%s",xtime);
          //SDL_SetRenderDrawColor(ecran->renderer1,219,191,36,0);
          //SDL_RenderFillRect(ecran->renderer1, &menu_gauche->Rcase1);
          menu_gauche->Scase1 = TTF_RenderText_Blended(ecran->police, xtime_p ,ecran->couleurRouge);
          menu_gauche->Tcase1 = SDL_CreateTextureFromSurface(ecran->renderer1, menu_gauche->Scase1);
          SDL_QueryTexture(menu_gauche->Tcase1, NULL, NULL, &w, &h);
          SDL_RenderCopy(ecran->renderer1, menu_gauche->Tcase1, NULL, &menu_gauche->Rcase1);
      
          //affichage du boutton QUITTER
          menu_gauche->Scase2 = SDL_LoadBMP("./image/quitter.bmp"); //Chargement de l'image quitter dans la surfase Scase1
          if (menu_gauche->Scase2 == NULL)
          {
              SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR,"Erreur","Erreur: Impossible de charger l'image du boutton quitter.",NULL);
          }
          else
          {
              menu_gauche->Tcase2 = SDL_CreateTextureFromSurface(ecran->renderer1,menu_gauche->Scase2);
              SDL_RenderCopy(ecran->renderer1,menu_gauche->Tcase2,NULL,&menu_gauche->Rcase2);
          }
      
          if(menu_haut->statueCAM == 0) //camera deconnecter
          {
              SDL_SetRenderDrawColor(ecran->renderer1,255,201,14,0); //orange
              SDL_RenderFillRect(ecran->renderer1, &menu_haut->RstatueCAM);
              menu_haut->SstatueCAM = TTF_RenderText_Blended(ecran->police, " Camera OFF ",ecran->couleurNoire);
              menu_haut->TstatueCAM = SDL_CreateTextureFromSurface(ecran->renderer1, menu_haut->SstatueCAM);
              SDL_RenderFillRect(ecran->renderer1, &menu_haut->RstatueCAM );
              SDL_QueryTexture(menu_haut->TstatueCAM, NULL, NULL, &w, &h);
              SDL_RenderCopy(ecran->renderer1, menu_haut->TstatueCAM, NULL, &menu_haut->RstatueCAM );
              SDL_DestroyTexture(menu_haut->TstatueCAM);
              SDL_FreeSurface(menu_haut->SstatueCAM);
          }
          else if (menu_haut->statueCAM == 1) //Camera connecter
          {
              camera->SimageFondCam = SDL_LoadBMP("./image/6wd.bmp");
              if (camera->SimageFondCam == NULL)
              {
                  SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR,"Erreur","Erreur: Impossible de charger l'image 6wd.bmp.",NULL);
              }
              else
              {
                  SDL_SetRenderDrawColor(ecran->renderer1,63,241,58,0); //vert
                  SDL_RenderFillRect(ecran->renderer1, &menu_haut->RstatueCAM);
                  menu_haut->SstatueCAM = TTF_RenderText_Blended(ecran->police, "Camera ON",ecran->couleurNoire);
                  menu_haut->TstatueCAM = SDL_CreateTextureFromSurface(ecran->renderer1, menu_haut->SstatueCAM);
                  SDL_RenderFillRect(ecran->renderer1, &menu_haut->RstatueCAM );
                  SDL_QueryTexture(menu_haut->TstatueCAM, NULL, NULL, &w, &h);
                  SDL_RenderCopy(ecran->renderer1, menu_haut->TstatueCAM, NULL, &menu_haut->RstatueCAM );
                  camera->TimageFondCam = SDL_CreateTextureFromSurface(ecran->renderer1,camera->SimageFondCam); //SDL TEXTURE
                  SDL_RenderCopy(ecran->renderer1, camera->TimageFondCam , NULL, &camera->Rcamera );
              }
              SDL_DestroyTexture(menu_haut->TstatueCAM);
              SDL_FreeSurface(menu_haut->SstatueCAM);
              SDL_DestroyTexture(camera->TimageFondCam);
              SDL_FreeSurface(camera->SimageFondCam);
          }
      
          if (menu_droit->lumiere == 1)
          {
              SDL_SetRenderDrawColor(ecran->renderer1,255,255,0,0);
              menu_droit->SVlumiere = TTF_RenderText_Blended(ecran->police, " Lumiere ON ",ecran->couleurNoire);
              menu_droit->TVlumiere = SDL_CreateTextureFromSurface(ecran->renderer1, menu_droit->SVlumiere);
              SDL_RenderFillRect(ecran->renderer1, &menu_droit->RVlumiere);
              SDL_QueryTexture(menu_droit->TVlumiere, NULL, NULL, &w, &h);
              SDL_RenderCopy(ecran->renderer1, menu_droit->TVlumiere, NULL, &menu_droit->RVlumiere);
          }
          else if(menu_droit->lumiere == 0)
          {
              SDL_SetRenderDrawColor(ecran->renderer1,255,201,14,0);
              menu_droit->SVlumiere = TTF_RenderText_Blended(ecran->police, " Lumiere OFF ",ecran->couleurNoire);
              menu_droit->TVlumiere = SDL_CreateTextureFromSurface(ecran->renderer1, menu_droit->SVlumiere);
              SDL_RenderFillRect(ecran->renderer1, &menu_droit->RVlumiere);
              SDL_QueryTexture(menu_droit->TVlumiere, NULL, NULL, &w, &h);
              SDL_RenderCopy(ecran->renderer1, menu_droit->TVlumiere, NULL, &menu_droit->RVlumiere);
          }
      
          //Detection de deconnexion joystique
          if (SDL_NumJoysticks() < 1)
          {
              //int w = 5 , h = 5;
              SDL_SetRenderDrawColor(ecran->renderer1,255,201,14,0);
              SDL_RenderFillRect(ecran->renderer1, &menu_haut->RVjoystick);
              menu_haut->SVjoystick = TTF_RenderText_Blended(ecran->police, "Joystick deconnecter",ecran->couleurNoire);
              menu_haut->TVjoystick = SDL_CreateTextureFromSurface(ecran->renderer1, menu_haut->SVjoystick);
              SDL_QueryTexture(menu_haut->TVjoystick, NULL, NULL, &w, &h);
              SDL_RenderCopy(ecran->renderer1, menu_haut->TVjoystick, NULL, &menu_haut->RVjoystick);
              SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_WARNING,"Erreur","Erreur: Le joystique viens de se deconnecter, veuillez le reconnecter",NULL);
              SDL_JoystickClose(input->joystick);
      
              SDL_DestroyTexture(menu_haut->TVjoystick);
              SDL_FreeSurface(menu_haut->SVjoystick);
          }
          else
          {
              SDL_SetRenderDrawColor(ecran->renderer1,63,241,58,0);
              SDL_RenderFillRect(ecran->renderer1, &menu_haut->RVjoystick);
              menu_haut->SVjoystick = TTF_RenderText_Blended(ecran->police, "Joystick connecter",ecran->couleurNoire);
              menu_haut->TVjoystick = SDL_CreateTextureFromSurface(ecran->renderer1, menu_haut->SVjoystick);
              SDL_QueryTexture(menu_haut->TVjoystick, NULL, NULL, &w, &h);
              SDL_RenderCopy(ecran->renderer1, menu_haut->TVjoystick, NULL, &menu_haut->RVjoystick);
              input->joystick = SDL_JoystickOpen(0);
              SDL_JoystickEventState(SDL_ENABLE);
      
              SDL_DestroyTexture(menu_haut->TVjoystick);
              SDL_FreeSurface(menu_haut->SVjoystick);
          }
          if (input->mode_pilotage == 1)
          {
              //JGX
              sprintf(input->JGXX, "X %d",input->JGX);
              //SDL_SetRenderDrawColor(ecran->renderer1,255,255,255,255); //BLANC
      
              //SDL_RenderFillRect(ecran->renderer1, &menu_bas->RJoy12);
              menu_bas->SJoy12 = TTF_RenderText_Solid(ecran->police,input->JGXX,ecran->couleurNoire);
              menu_bas->TJoy12 = SDL_CreateTextureFromSurface(ecran->renderer1, menu_bas->SJoy12);
              SDL_QueryTexture(menu_bas->TJoy12, NULL, NULL, &w, &h);
              SDL_RenderCopy(ecran->renderer1, menu_bas->TJoy12, NULL, &menu_bas->RJoy12);
      
              //JGY JGYY
              sprintf(input->JGYY, "Y %d",input->JGY);
              //SDL_SetRenderDrawColor(ecran->renderer1,255,255,255,255); //BLANC
      
              //SDL_RenderFillRect(ecran->renderer1, &menu_bas->RJoy13);
              menu_bas->SJoy13 = TTF_RenderText_Solid(ecran->police,input->JGYY,ecran->couleurNoire);
              menu_bas->TJoy13 = SDL_CreateTextureFromSurface(ecran->renderer1, menu_bas->SJoy13);
              SDL_QueryTexture(menu_bas->TJoy13, NULL, NULL, &w, &h);
              SDL_RenderCopy(ecran->renderer1, menu_bas->TJoy13, NULL, &menu_bas->RJoy13);
      
              //JDX JDXX
              sprintf(input->JDXX, "X %d",input->JDX);
              //SDL_SetRenderDrawColor(ecran->renderer1,255,255,255,255); //BLANC
      
              //SDL_RenderFillRect(ecran->renderer1, &menu_bas->RJoy22);
              menu_bas->SJoy22 = TTF_RenderText_Solid(ecran->police,input->JDXX,ecran->couleurNoire);
              menu_bas->TJoy22 = SDL_CreateTextureFromSurface(ecran->renderer1, menu_bas->SJoy22);
              SDL_QueryTexture(menu_bas->TJoy22, NULL, NULL, &w, &h);
              SDL_RenderCopy(ecran->renderer1, menu_bas->TJoy22, NULL, &menu_bas->RJoy22);
      
              //JDY JDYY
              sprintf(input->JDYY, "Y %d",input->JDY);
              //SDL_SetRenderDrawColor(ecran->renderer1,255,255,255,255); //BLANC
      
              //SDL_RenderFillRect(ecran->renderer1, &menu_bas->RJoy23);
              menu_bas->SJoy23 = TTF_RenderText_Solid(ecran->police,input->JDYY,ecran->couleurNoire);
              menu_bas->TJoy23 = SDL_CreateTextureFromSurface(ecran->renderer1, menu_bas->SJoy23);
              SDL_QueryTexture(menu_bas->TJoy23, NULL, NULL, &w, &h);
              SDL_RenderCopy(ecran->renderer1, menu_bas->TJoy23, NULL, &menu_bas->RJoy23);
      
              //Affichage puissance moteur gauche et droit
              sprintf(input->PRoueGx, "%d",input->PRoueG);
              // SDL_SetRenderDrawColor(ecran->renderer1,0,0,0,0); //BLANC
      
              //SDL_RenderFillRect(ecran->renderer1, &menu_bas->Rproueg);
              menu_bas->Sproueg = TTF_RenderText_Solid(ecran->police,input->PRoueGx,ecran->couleurNoire);
              menu_bas->Tproueg = SDL_CreateTextureFromSurface(ecran->renderer1, menu_bas->Sproueg);
              SDL_QueryTexture(menu_bas->Tproueg, NULL, NULL, &w, &h);
              SDL_RenderCopy(ecran->renderer1, menu_bas->Tproueg, NULL, &menu_bas->Rproueg);
      
              sprintf(input->PRoueDx, "%d",input->PRoueD);
              // SDL_SetRenderDrawColor(ecran->renderer,0,0,0,0); //BLANC
      
              //SDL_RenderFillRect(ecran->renderer1, &menu_bas->Rproued);
              menu_bas->Sproued = TTF_RenderText_Solid(ecran->police,input->PRoueDx,ecran->couleurNoire);
              menu_bas->Tproued = SDL_CreateTextureFromSurface(ecran->renderer1, menu_bas->Sproued);
              SDL_QueryTexture(menu_bas->Tproued, NULL, NULL, &w, &h);
              SDL_RenderCopy(ecran->renderer1, menu_bas->Tproued, NULL, &menu_bas->Rproued);
      
      
              //BOUTTON Y
              if(input->BOUTTON_Y == 1)
              {
                  menu_bas->SbouttonY = SDL_LoadBMP("./image/BouttonY.bmp");
                  if (menu_bas->SbouttonY == NULL)
                  {
                      SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR,"Erreur","Erreur: Impossible de charger l'image du boutton A.",NULL);
                  }
                  else
                  {
                      menu_bas->TbouttonY = SDL_CreateTextureFromSurface(ecran->renderer1,menu_bas->SbouttonY);
                      SDL_RenderCopy(ecran->renderer1,menu_bas->TbouttonY,NULL,&menu_bas->RbouttonY);
                  }
      
                  SDL_DestroyTexture(menu_bas->TbouttonY);
                  SDL_FreeSurface(menu_bas->SbouttonY);
              }
      
              if(input->BOUTTON_X == 1)
              {
                  menu_bas->SbouttonX = SDL_LoadBMP("./image/BouttonX.bmp");
                  if (menu_bas->SbouttonX == NULL)
                  {
                      SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR,"Erreur","Erreur: Impossible de charger l'image du boutton A.",NULL);
                  }
                  else
                  {
                      menu_bas->TbouttonX = SDL_CreateTextureFromSurface(ecran->renderer1,menu_bas->SbouttonX);
                      SDL_RenderCopy(ecran->renderer1,menu_bas->TbouttonX,NULL,&menu_bas->RbouttonX);
                  }
                  SDL_DestroyTexture(menu_bas->TbouttonX);
                  SDL_FreeSurface(menu_bas->SbouttonX);
              }
      
              if(input->BOUTTON_A == 1)
              {
                  menu_bas->SbouttonA = SDL_LoadBMP("./image/BouttonA.bmp");
                  if ( menu_bas->SbouttonA == NULL)
                  {
                      SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR,"Erreur","Erreur: Impossible de charger l'image du boutton A.",NULL);
                  }
                  else
                  {
                      menu_bas->TbouttonA = SDL_CreateTextureFromSurface(ecran->renderer1,menu_bas->SbouttonA);
                      SDL_RenderCopy(ecran->renderer1,menu_bas->TbouttonA,NULL,&menu_bas->RbouttonA);
                  }
      
                  SDL_DestroyTexture(menu_bas->TbouttonA);
                  SDL_FreeSurface(menu_bas->SbouttonA);
              }
              if(input->BOUTTON_B == 1)
              {
                  menu_bas->SbouttonB = SDL_LoadBMP("./image/BouttonB.bmp");
                  if (menu_bas->SbouttonB == NULL)
                  {
                      SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR,"Erreur","Erreur: Impossible de charger l'image du boutton A.",NULL);
                  }
                  else
                  {
                      menu_bas->TbouttonB = SDL_CreateTextureFromSurface(ecran->renderer1,menu_bas->SbouttonB);
                      SDL_RenderCopy(ecran->renderer1,menu_bas->TbouttonB,NULL,&menu_bas->RbouttonB);
                  }
                  SDL_DestroyTexture(menu_bas->TbouttonB);
                  SDL_FreeSurface(menu_bas->SbouttonB);
              }
      
              //Destruction texture
              SDL_DestroyTexture(menu_bas->TJoy23);
              SDL_DestroyTexture(menu_bas->TJoy22);
              SDL_DestroyTexture(menu_bas->TJoy13);
              //boutton
              SDL_DestroyTexture(menu_bas->TJoy12);
      
              SDL_DestroyTexture(menu_bas->Tproueg);
              SDL_DestroyTexture(menu_bas->Tproued);
      
              //Liberation des surfaces
              SDL_FreeSurface(menu_bas->SJoy23);
              SDL_FreeSurface(menu_bas->SJoy13);
              SDL_FreeSurface(menu_bas->SJoy12);
              SDL_FreeSurface(menu_bas->SJoy22);
              SDL_FreeSurface(menu_bas->Sproued);
              SDL_FreeSurface(menu_bas->Sproueg);
              //boutton
      
          }
      
          if(menu_gauche->wifi == 0)
          {
              menu_gauche->Swifi = SDL_LoadBMP("./image/wifi0.bmp");
              if ( menu_gauche->Swifi == NULL)
              {
                  SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR,"Erreur","Erreur: Impossible de charger l'image wifi0.",NULL);
              }
              else
              {
                  menu_gauche->Twifi = SDL_CreateTextureFromSurface(ecran->renderer1,menu_gauche->Swifi);
                  SDL_RenderCopy(ecran->renderer1, menu_gauche->Twifi, NULL, &menu_gauche->Rcase3);
              }
              SDL_DestroyTexture(menu_gauche->Twifi);
              SDL_FreeSurface(menu_gauche->Swifi);
          }
          else if(menu_gauche->wifi == 1)
          {
              menu_gauche->Swifi = SDL_LoadBMP("./image/wifi1.bmp");
              if ( menu_gauche->Swifi == NULL)
              {
                  SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR,"Erreur","Erreur: Impossible de charger l'image wifi1.",NULL);
              }
              else
              {
                  menu_gauche->Twifi = SDL_CreateTextureFromSurface(ecran->renderer1,menu_gauche->Swifi);
                  SDL_RenderCopy(ecran->renderer1, menu_gauche->Twifi, NULL, &menu_gauche->Rcase3);
              }
              SDL_DestroyTexture(menu_gauche->Twifi);
              SDL_FreeSurface(menu_gauche->Swifi);
          }
          else if(menu_gauche->wifi == 2)
          {
              menu_gauche->Swifi = SDL_LoadBMP("./image/wifi2.bmp");
              if ( menu_gauche->Swifi == NULL)
              {
                  SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR,"Erreur","Erreur: Impossible de charger l'image wifi1.",NULL);
              }
              else
              {
                  menu_gauche->Twifi = SDL_CreateTextureFromSurface(ecran->renderer1,menu_gauche->Swifi);
                  SDL_RenderCopy(ecran->renderer1, menu_gauche->Twifi, NULL, &menu_gauche->Rcase3);
              }
              SDL_DestroyTexture(menu_gauche->Twifi);
              SDL_FreeSurface(menu_gauche->Swifi);
          }
          else if(menu_gauche->wifi == 3)
          {
              menu_gauche->Swifi = SDL_LoadBMP("./image/wifi3.bmp");
              if ( menu_gauche->Swifi == NULL)
              {
                  SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR,"Erreur","Erreur: Impossible de charger l'image wifi1.",NULL);
              }
              else
              {
                  menu_gauche->Twifi = SDL_CreateTextureFromSurface(ecran->renderer1,menu_gauche->Swifi);
                  SDL_RenderCopy(ecran->renderer1, menu_gauche->Twifi, NULL, &menu_gauche->Rcase3);
              }
              SDL_DestroyTexture(menu_gauche->Twifi);
              SDL_FreeSurface(menu_gauche->Swifi);
          }
          else if(menu_gauche->wifi == 4)
          {
              menu_gauche->Swifi = SDL_LoadBMP("./image/wifi4.bmp");
              if ( menu_gauche->Swifi == NULL)
              {
                  SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR,"Erreur","Erreur: Impossible de charger l'image wifi1.",NULL);
              }
              else
              {
                  menu_gauche->Twifi = SDL_CreateTextureFromSurface(ecran->renderer1,menu_gauche->Swifi);
                  SDL_RenderCopy(ecran->renderer1, menu_gauche->Twifi, NULL, &menu_gauche->Rcase3);
              }
              SDL_DestroyTexture(menu_gauche->Twifi);
              SDL_FreeSurface(menu_gauche->Swifi);
          }
          else if(menu_gauche->wifi == 5)
          {
              menu_gauche->Swifi = SDL_LoadBMP("./image/wifi5.bmp");
              if ( menu_gauche->Swifi == NULL)
              {
                  SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR,"Erreur","Erreur: Impossible de charger l'image wifi1.",NULL);
              }
              else
              {
                  menu_gauche->Twifi = SDL_CreateTextureFromSurface(ecran->renderer1,menu_gauche->Swifi);
                  SDL_RenderCopy(ecran->renderer1, menu_gauche->Twifi, NULL, &menu_gauche->Rcase3);
              }
              SDL_DestroyTexture(menu_gauche->Twifi);
              SDL_FreeSurface(menu_gauche->Swifi);
          }
          else if(menu_gauche->wifi == 6)
          {
              menu_gauche->Swifi = SDL_LoadBMP("./image/wifi6.bmp");
              if ( menu_gauche->Swifi == NULL)
              {
                  SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR,"Erreur","Erreur: Impossible de charger l'image wifi1.",NULL);
              }
              else
              {
                  menu_gauche->Twifi = SDL_CreateTextureFromSurface(ecran->renderer1,menu_gauche->Swifi);
                  SDL_RenderCopy(ecran->renderer1, menu_gauche->Twifi, NULL, &menu_gauche->Rcase3);
              }
              SDL_DestroyTexture(menu_gauche->Twifi);
              SDL_FreeSurface(menu_gauche->Swifi);
          }
          else if(menu_gauche->wifi == 7)
          {
              menu_gauche->Swifi = SDL_LoadBMP("./image/wifi7.bmp");
              if ( menu_gauche->Swifi == NULL)
              {
                  SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR,"Erreur","Erreur: Impossible de charger l'image wifi1.",NULL);
              }
              else
              {
                  menu_gauche->Twifi = SDL_CreateTextureFromSurface(ecran->renderer1,menu_gauche->Swifi);
                  SDL_RenderCopy(ecran->renderer1, menu_gauche->Twifi, NULL, &menu_gauche->Rcase3);
              }
              SDL_DestroyTexture(menu_gauche->Twifi);
              SDL_FreeSurface(menu_gauche->Swifi);
          }
          else if(menu_gauche->wifi == 8)
          {
              menu_gauche->Swifi = SDL_LoadBMP("./image/wifi8.bmp");
              if ( menu_gauche->Swifi == NULL)
              {
                  SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR,"Erreur","Erreur: Impossible de charger l'image wifi1.",NULL);
              }
              else
              {
                  menu_gauche->Twifi = SDL_CreateTextureFromSurface(ecran->renderer1,menu_gauche->Swifi);
                  SDL_RenderCopy(ecran->renderer1, menu_gauche->Twifi, NULL, &menu_gauche->Rcase3);
              }
              SDL_DestroyTexture(menu_gauche->Twifi);
              SDL_FreeSurface(menu_gauche->Swifi);
          }
      
          SDL_RenderPresent(ecran->renderer1);
      
          SDL_DestroyTexture(menu_gauche->Tcase2);
          SDL_FreeSurface(menu_gauche->Scase2);
      
          SDL_DestroyTexture(menu_droit->TVlumiere);
          SDL_FreeSurface(menu_droit->SVlumiere);
      
      
      
          //Fonction temps
          SDL_DestroyTexture(menu_gauche->Tcase1);
          SDL_FreeSurface(menu_gauche->Scase1);
      
      
          SDL_DestroyTexture(ecran->TimageFond_1);
          SDL_FreeSurface(ecran->SimageFond_1);
      
      }
      
      
      


      main.c
      
      int main(int argc, char** argv)
      {
          //declaration des structures
          ecran ecran;
          Input input;
          menu_bas menu_bas;
          menu_gauche menu_gauche;
          menu_droit menu_droit;
          menu_haut menu_haut;
          camera camera;
      
          zozor zozor;
          reseau reseau;
      
          /*
          //Strcuture Reseau
          WSADATA WSAData;
          SOCKET sock;
          SOCKET csock;
          SOCKADDR_IN sin;
          SOCKADDR_IN csin;
      
          WSAStartup(MAKEWORD(2,0), &WSAData);
          sock = socket(AF_INET, SOCK_STREAM, 0 );
          sin.sin_addr.s_addr = INADDR_ANY;
          sin.sin_family = AF_INET;
          sin.sin_port = htons(23);
          bind(sock,(SOCKADDR *) &sin, sizeof(sin));
          listen(sock, 0);
      */
      
      
       //Initialisation des structures  
       
       init_structure(&ecran, &input, &menu_bas, &menu_gauche, &menu_droit, &menu_haut, &camera,&zozor);  
        
      //Init SDL2 et SDL_TTF    
      
      initialisation("Programme Wild Thumper: Station de pilotage",&input, &ecran);   
      
      init_reseau(&reseau); 
          
      while (!input.quitter)   
       {        
      
      updateEvent(&input, &ecran, &menu_gauche);       
             
      pilotage(&input,&ecran, &menu_droit, &menu_haut, &menu_gauche, &menu_bas);
       //Definition des variables, et mise a jour position image.
              
      chargement_image(&input, &ecran, &menu_droit, &menu_haut, &menu_gauche, &menu_bas, &camera,&zozor);       
       if (menu_haut.statueCAM == 1)       
         {            
               camera_camera(&camera, &menu_haut);       
          }       
       send_data_pilotage (&input);       
       SDL_Delay(1);   
       }  
       
       /*    
      closesocket(csock);   
       closesocket(sock);    
      WSACleanup();    
      */    
      cleanup(&input, &ecran, &menu_bas, &menu_gauche, &menu_droit, &menu_haut, &camera);    
      
      return 0;
      
      }
      
      


      La ces ma fonction qui initialise la librairie SDL2, j'ai lu qu on pouvait integrer une texture dans le dernier parametre de SDL_createwindows, je me suis dit que cest peut la quon charge un arriere plan, mais j'ai pas trouver + dinfo
      init.c
      void initialisation(const char *titre,Input *input, ecran *ecran)
      {
          if (SDL_Init( SDL_INIT_VIDEO |SDL_INIT_JOYSTICK) != 0)
          {
              SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR,"Erreur","Erreur: Impossible de charger la librairie SDL2.0.",NULL);
              EXIT_FAILURE;
          }
          else
          {
              //Creation de la fenetre
              ecran->screen1 = SDL_CreateWindow(titre,SDL_WINDOWPOS_CENTERED,SDL_WINDOWPOS_CENTERED,WINDOW_W,WINDOW_H,SDL_WINDOW_SHOWN);
              //Creation du renderer
              ecran->renderer1 = SDL_CreateRenderer( ecran->screen1,-1,SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
      
              if ( ecran->screen1 == NULL ||  ecran->renderer1 == NULL)
              {
                  SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR,"Erreur","Erreur: Impossible d'initialiser la fenetre ou/et d'afficher le rendu.",NULL);
      
              }
      
              //Verifie si un joystixk est connecter
              if (SDL_NumJoysticks() < 1)
              {
                  SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR,"Erreur","Erreur: Pas de joystick connecter.",NULL);
                  EXIT_FAILURE;
              }
              else
              {
                  SDL_JoystickEventState(SDL_ENABLE);
                  input->joystick = SDL_JoystickOpen(0);
              }
      
          }
      
      
      
      0
    4. paly2 Messages postés 261 Statut Membre 25
       
      SDL_RenderClear(ecran->renderer1);
      SDL_SetRenderDrawColor(ecran->renderer1,255,255,255,255); //BLANC

      Si tu veux nettoyer le renderer en le remplissant de blanc, il faut mettre le SetRenderDrawColor() avant :-)

      SDL_RenderCopy(ecran->renderer1,ecran->TimageFond_1 ,NULL,&ecran->Rscreen);

      Ou, vu que tu copies l'image sur tout l'écran, plus simplement:
      SDL_RenderCopy(ecran->renderer1, ecran->TimageFond_1 , NULL, NULL);

      (J'ai juste mis le 4ème paramètre à NULL.)

      j'ai lu qu on pouvait integrer une texture dans le dernier parametre de SDL_init, je me suis dit que cest peut la quon charge un arriere plan, mais j'ai pas trouver + dinfo
      Non, SDL_Init ne prend qu'un seul paramètre (ses flags).

      DSL, je ne comprends pas en quoi la souris pourrait influer dans la façon dont l'image de fond est tracée :/
      0
    5. poparnassus Messages postés 462 Statut Membre 31
       
      Merciiii, Comme tu l'as suggerer , j'ai remplacer le dernier parametre par Null sur le SDLRendercopy () et magiiiie mon bug a disparue ... Mais j'ai du mal a comprendre pourquoi ca fait ce bug si le paremetre n'est pas a nul ...
      0