IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SDL Discussion :

Problème d'affichage d'image et plantage du programme à la fin de son exécution [SDL 2.0]


Sujet :

SDL

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Chomeur
    Inscrit en
    Février 2013
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Chomeur

    Informations forums :
    Inscription : Février 2013
    Messages : 37
    Points : 32
    Points
    32
    Par défaut Problème d'affichage d'image et plantage du programme à la fin de son exécution
    Bon, j'ai commencé un petit projet personnel que je voudrais finir avant vendredi 22 Janvier. Il avance bien mais je tombe sur deux os :

    Le premier est que je n'arrive pas à faire afficher une image que je charge depuis un png. Il m'affiche un écran noir au lieu de l'image. Je n'ai aucune erreur avec SDL_GetError.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
     
    int main(int argc, char** argv)
        {
        SDL_Window* GameWindow = NULL;
        SDL_Event event;
        SDL_Renderer *Pencil = NULL;
        Mix_Music* MusicList[5];
        Mix_Chunk* SFX[14];
        Sprite ImageArray[20]; //Tableau qui contient à la fois les surfaces et textures
        int loop = 1;
        int i = 0;
        int playMusic=0;
     
        GameWindow = SDL_Start(); // Démarre les fonction SDL
        if (!GameWindow)
            {
             fprintf(stderr, "Erreur de création de la fenêtre: %s\n", SDL_GetError());
             SDL_Delay(5000);
             return -1;
            }
        InitiateImageArray(ImageArray); // Initie toutes les valeurs du tableau à NULL
        Pencil = SDL_CreateRenderer(GameWindow, -1, SDL_RENDERER_ACCELERATED);
    	if (!Pencil)
            {
    		fprintf(stdout, "Échec de chargement du renderer (%s)\n", SDL_GetError());
    		SDL_Delay(5000);
    		return -1;
            }
        LoadMusicList(MusicList);
        for (i = 0; i < 5; i++)
            {
    		if (MusicList[i]==NULL)
                {
    			printf("Erreur de chargement de la musique.\n");
                }
            }
        LoadSFX(SFX);
        for (i = 0; i < 14; i++)
            {
    		if (SFX[i]==NULL)
                {
    			printf("Erreur de chargement d'un son.\n");
                }
            }
        ImageArray[0]=LoadBackground (Pencil);//Charge l'image du background dans le tableau
        while (loop==1)
            {
             while (SDL_PollEvent(&event))
                {
                if (event.type == SDL_QUIT)
                    {
                     loop = 0;
                    }
                if (event.type == SDL_KEYDOWN)
                    {
                     if (event.key.keysym.sym == SDLK_ESCAPE)
                        {
                         loop = 0;
                        }
                    }
                }
             RefreshImage(Pencil,&ImageArray[0],0,0);//Raffaichit l'image avec le renderer, la texture la surface donnée et les coordonnées à 0,0
             PlayMusic (MusicList[0],&playMusic);
             SDL_RenderPresent(Pencil);
            }
        CloseImageArray (&ImageArray[20]);// Détruit les textures les surfaces rentrés dans le tableau
        Mix_HaltMusic();
        FreeSFX(SFX);
        FreeMusicList(MusicList);
        SDL_Stop(); //Arrête les fonctions SDL
        return 0;
        }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    //Structure Sprite qui contient à la fois la surface et la texture pour son traitement dans les fonctions suivantes
    typedef struct Sprite Sprite;
    struct Sprite
    {
    	SDL_Surface* Image;
    	SDL_Texture* Texture;
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    //Fonction de chargement des images
    Sprite LoadImage(SDL_Renderer* Pencil,char FileName[100])//Crée la surface et la texture
        {
    	Sprite sprite;
    	sprite.Image = IMG_Load(FileName);
    	if (!sprite.Image)
            {
    		fprintf(stdout, "Échec de création de l'image (%s)\n", SDL_GetError());
    		SDL_Delay(5000);
            }
    	sprite.Texture = SDL_CreateTextureFromSurface(Pencil, sprite.Image);
    	if (!sprite.Texture)
            {
    		fprintf(stdout, "Échec de création de la texture (%s)\n", SDL_GetError());
    		SDL_Delay(5000);
            }
    	return sprite;
        }
     
     
    void RefreshImage(SDL_Renderer* Pencil, Sprite* sprite,int x,int y)//Copie la texture dans le renderer
        {
    	SDL_Rect dest = { x - sprite->Image->w, y - sprite->Image->h, sprite->Image->w, sprite->Image->h };
    	SDL_RenderCopy(Pencil, sprite->Texture, NULL, &dest);
        }
     
    void CloseImage(Sprite* sprite)//Ferme l'image
        {
    	SDL_DestroyTexture(sprite->Texture);
    	SDL_FreeSurface(sprite->Image);
        }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    // Code qui permet de charger l'image (qui est en fait un arrière plan)
    Sprite LoadBackground (SDL_Renderer *Pencil)
        {
         Sprite Image;
     
         Image = LoadImage(Pencil, "Background/Zone1.png");
         return Image;
        }
    L'autre problème est qu'à la fin du programme, il plante. Après débogage, j'apprends qu'il y a une segmentation fault sur la fonction CloseArrayImage.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    //Ferme le tableau de Sprite
    void CloseImageArray (Sprite ImageArray[20])
        {
         int i =0;
     
          for (i=0;i<20;i++)
            {
             if (ImageArray[i].Image!=NULL && ImageArray[i].Texture!=NULL)
                {
                 CloseImage(&ImageArray[i]);
                }
            }
        }
    La segmentation fault arrive à i=9 (sachant que le tableau fait 20) et le tableau est initialisé à NULL grâce à cette fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    //Initialise le tableau de Sprite
    void InitiateImageArray (Sprite ImageArray[20])
        {
         int i = 0;
     
         for (i=0;i<20;i++)
            {
             ImageArray[i].Image   = NULL;
             ImageArray[i].Texture = NULL;
            }
        }
    Aussi, le if lance le code même si les éléments du tableau sont NULL.

    Une petite idée ?

    Edit :

    Bon, grâce à un tableau dynamique, j'ai pu régler le second problème mais le premier reste entier.

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Je crois que ... vous n'affichez pas l'image à l'écran
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SDL_Rect dest = { x - sprite->Image->w, y - sprite->Image->h, sprite->Image->w, sprite->Image->h };
    Lorsque l'on veut afficher une image on donne son point en haut à gauche de l'image.
    Vous, vous décalez le x (qui est à 0), en - la largeur de l'image. Du coup, l'image apparait un écran de trop vers la gauche (et pareil sur Y).
    Votre code, devrait être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SDL_Rect dest = { x, y, sprite->Image->w, sprite->Image->h };
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Chomeur
    Inscrit en
    Février 2013
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Chomeur

    Informations forums :
    Inscription : Février 2013
    Messages : 37
    Points : 32
    Points
    32
    Par défaut
    En fait, j'ai pu régler le premier problème. Merci quand même !

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut
    Et quel était le problème, du coup ?
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XML/CSS/XSL] Problème d'affichage des images "dynamiqu
    Par popol55 dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 06/04/2006, 16h24
  2. Problème d'affichage d'image...
    Par fabreizhad dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 21/03/2006, 12h43
  3. problème d'affichage d'image avec mozilla
    Par lyon31 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 16/03/2006, 16h27
  4. Problème d'affichage d'image
    Par AurelBUD dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 16/09/2005, 11h56
  5. CSS Probléme d'affichage d'images
    Par tebonb dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 01/06/2005, 18h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo