SDL2 Utilisation de la fonction SDL_Blitsurface()

Résolu/Fermé
poparnassus Messages postés 426 Date d'inscription vendredi 28 mars 2014 Statut Membre Dernière intervention 25 décembre 2019 - Modifié par poparnassus le 26/08/2016 à 05:19
poparnassus Messages postés 426 Date d'inscription vendredi 28 mars 2014 Statut Membre Dernière intervention 25 décembre 2019 - 30 août 2016 à 12:08
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

paly2 Messages postés 254 Date d'inscription vendredi 29 août 2014 Statut Membre Dernière intervention 15 février 2018 25
27 août 2016 à 17:47
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
poparnassus Messages postés 426 Date d'inscription vendredi 28 mars 2014 Statut Membre Dernière intervention 25 décembre 2019 30
28 août 2016 à 07:35
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
paly2 Messages postés 254 Date d'inscription vendredi 29 août 2014 Statut Membre Dernière intervention 15 février 2018 25
28 août 2016 à 11:13
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
poparnassus Messages postés 426 Date d'inscription vendredi 28 mars 2014 Statut Membre Dernière intervention 25 décembre 2019 30
Modifié par poparnassus le 29/08/2016 à 11:51
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
paly2 Messages postés 254 Date d'inscription vendredi 29 août 2014 Statut Membre Dernière intervention 15 février 2018 25
29 août 2016 à 12:56
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
poparnassus Messages postés 426 Date d'inscription vendredi 28 mars 2014 Statut Membre Dernière intervention 25 décembre 2019 30
Modifié par poparnassus le 29/08/2016 à 13:34
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