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 avec IMG_load


Sujet :

SDL

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Problème avec IMG_load
    Bonjour,

    Je débute le C et voudrait faire un petit programme pour un enfant handicapé.
    Pour un début, je veux faire simple mais je me heurte déjà à des soucis!!!
    Le but est d'afficher une page d'images (200*200pix) et quand il clique dessus il y a un son.
    La colonne de droite est dédiée à la gestion des pages et autres fonctions.

    En gros, un petite synthèse vocale.
    En faisant
    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
    picto1 = IMG_Load("chat.png");
        SDL_BlitSurface(picto1, NULL, ecran, &positionPicto1);
        picto2 = IMG_Load("cheval.png");
        SDL_BlitSurface(picto2, NULL, ecran, &positionPicto2);
        picto3 = IMG_Load("chien.png");
        SDL_BlitSurface(picto3, NULL, ecran, &positionPicto3);
        picto4 = IMG_Load("cochon.png");
        SDL_BlitSurface(picto4, NULL, ecran, &positionPicto4);
        picto5 = IMG_Load("elephant.png");
        SDL_BlitSurface(picto5, NULL, ecran, &positionPicto5);
        picto6 = IMG_Load("grenouille.png");
        SDL_BlitSurface(picto6, NULL, ecran, &positionPicto6);
        picto7 = IMG_Load("lion.png");
        SDL_BlitSurface(picto7, NULL, ecran, &positionPicto7);
        picto8 = IMG_Load("singe.png");
        SDL_BlitSurface(picto8, NULL, ecran, &positionPicto8);
        picto9 = IMG_Load("vache.png");
        SDL_BlitSurface(picto9, NULL, ecran, &positionPicto9);
        picto_oui = IMG_Load("oui.png");
        SDL_BlitSurface(picto_oui, NULL, ecran, &positionPicto_oui);
        picto_non = IMG_Load("non.png");
        SDL_BlitSurface(picto_non, NULL, ecran, &positionPicto_non);
        picto_next = IMG_Load("next.png");
        SDL_BlitSurface(picto_next, NULL, ecran, &positionPicto_next);
        picto_prev = IMG_Load("prev.png");
        SDL_BlitSurface(picto_prev, NULL, ecran, &positionPicto_prev);
        picto_quit = IMG_Load("quit.png");
        SDL_BlitSurface(picto_quit, NULL, ecran, &positionPicto_quit);
        picto_start = IMG_Load("menu.png");
        SDL_BlitSurface(picto_start, NULL, ecran, &positionPicto_start);
     
        SDL_Flip(ecran);
    J'ai bien l'écran ci dssus avec les sons qui vont bien lorsque je clique dessus.
    Pour rendre le système facilement évolutif et pouvoir ajouter des pages, je souhaite pouvoir récupérer le nom des différentes images dans un fichier texte.
    J'ai beau tourner mon code dans tous les sens, je n'y arrive pas.
    J'ai l'impression que l'argument de "IMG_load" doit absolument être ("image.png").
    Quelqu'un peut il me confirmer ce point et éventuellement me donner une piste pour arriver à mes fins?
    S'il faut que je recompile dés que j'ajoute une page, c'est un peu galére.
    Merci d'avance pour votre aide.

  2. #2
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Salut,

    on peut aussi passer un argument char* en paramètre.

    Tu récupères le nom de l'image à partir d'un fichier, que tu mets dans un char *, puis tu appelles IMG_Load sur ce char*.

    Attention, avec les fonctions C on peut des fois récupérer un caractère de fin de ligne (\r ou \n) à la fin de la chaine, c'est peut être ça qui cause le problème (affiche la chaine récupérée et la longueur de la chaine récupérée pour voir si les deux coïncident).

    Mais sinon, vraiment, y'a aucun problème:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    const char *file = "image.png"
    SDL_Surface *s = IMG_Load(file);
     
    if (s == NULL)
     ...

  3. #3
    Futur Membre du Club
    Inscrit en
    Mars 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    Bonjour Coyotte,

    J'ai un peu de mal à voir comment faire cela.
    Voila comment j'ai procédé.
    Au départ, je crée mes surfaces:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SDL_Surface *ecran = NULL, *picto1 = NULL, *picto2 = NULL, etc
    Ensuite, je récupére chaque ligne de mon fichier dans un tableau de 9 char avec un fgets par l'intermédiare de pictoEnCours.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    while (fgets(pictoEnCours, 100, menu) != NULL)
        {
            printf ( "pictoEnCours = %s, \n)",pictoEnCours);
            *pictoName[i] = pictoEnCours;
            i++;
        }
    Si je fais un fprintf dans stdout, j'ai bien les noms de chaque image hormis le dernier. Il faut que je vois pourquoi.
    Ensuite, j'ai adapté la version initiale ou j'ai les noms de fichiers et cela donne ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SDL_BlitSurface(picto1, NULL, ecran, &positionPicto1);
    picto2 = IMG_Load(*pictoName[1]);
    SDL_BlitSurface(picto2, NULL, ecran, &positionPicto2);
    picto3 = IMG_Load(*pictoName[2]);
    J'ai vraiment essayé toutes les possibilité pour IMG_Load() sans résultats.
    Je dois rater quelque chose, mais je ne vois pas quoi.
    Si besoin, je peux mettre le code complet.
    Merci.

  4. #4
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Salut

    En fait quand tu fais ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    *pictoName[i] = pictoEnCours;
    Tu stockes juste un pointeur.
    Le contenu pointé par pictoEnCours change à chaque fois que tu fais un fget, donc ça va pas marcher...

    Il faut copier la chaine de caractère avec strcpy.

    Ou sinon tu peux faire quelque chose du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    while (fgets(pictoEnCours, 100, menu) != NULL)
        {
            printf ( "pictoEnCours = %s, \n)",pictoEnCours);
            *pictoName[i] = strdup(pictoEnCours);
            i++;
        }
    strdup duplique la chaine et en crée une copie.
    Bien sûr, à la fin il ne faut pas oublier de libérer la mémoire allouée dynamiquement par strdup.

    Sinon c'est bizarre, comment as-tu déclaré pictoName? en char *** ?

  5. #5
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381
    Par défaut
    Citation Envoyé par erreip-naej Voir le message
    Ensuite, je récupére chaque ligne de mon fichier dans un tableau de 9 char avec un fgets par l'intermédiare de pictoEnCours.
    Un tableau de char c'est un peu contraignant à gérer.
    Vaut mieux prendre un std::vector<std::string>> c.a.d. un tableau dynamique qui contient des strings..

    Si tu n'as pas de compilateur C++, il suffit de faire un tableau de structures allouées avec malloc()

    Mais je conseille plutot que de gérer des chaines de caractères ( à quoi cela sert-il de mémoriser le nom du fichier on en a plus besoin une fois que l'image est chargée ), de gérer des structures ou classes cliquables à l'écran
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    class ZoneCliquable{
    ZoneCliquable(const char *NomBitmap);
    SDL_Rect ZoneDeClick;
    void Affiche();
    Ceci est un peu lourd comme méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    picto1 = IMG_Load("chat.png");
        SDL_BlitSurface(picto1, NULL, ecran, &positionPicto1);
        picto2 = IMG_Load("cheval.png");
        SDL_BlitSurface(picto2, NULL, ecran, &positionPicto2);
        picto3 = IMG_Load("chien.png");
        SDL_BlitSurface(picto3, NULL, ecran, &positionPicto3);
        picto4 = IMG_Load("cochon.png");
    Le mieux c'est de faire une seule et unique bitmap qu'on charge une bonne fois pour toute en général c'est la méthode employée dans les jeux vidéos.
    Après pour afficher le chat ou le cochon il suffit avec une banale boucle de découper l'image en carrés correspondants

  6. #6
    Futur Membre du Club
    Inscrit en
    Mars 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    Bonsoir à tous et merci pour vos réponses.

    @Coyotte,

    Je déclare pictoEnCours comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char pictoEnCours[100];
    J'ai modifié mon "while" avec strdup et ai réduit un peu les vérifs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    while (fgets(pictoEnCours, 100, menu) != NULL)
        {
            fprintf ( stdout,"%s)",pictoEnCours);
            *pictoName[i] = strdup(pictoEnCours);
           i++;
        }
    Cela me donne dans stdout:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    chat.png
    )cheval.png
    )chien.png
    )cochon.png
    )elephant.png
    )grenouille.png
    )lion.png
    )singe.png
    )vache.png
    )
    Le strdup donne le même résultat, pas d'images....
    Donc à première vue, il faut que je fasse sauter le dernier caractère [saut de ligne et )]
    Je suis loin de tout connaitre et à mon age, c'est plus dur à rentrer
    Donc au boulot.

    @Mat.M
    Je commence le C (allez disons depuis 2 mois, le soir aprés le boulot) alors le C++, ce n'est pas pour tout de suite.
    J'ai choisi cette méthode lourde, je suis d'accord, car le soft, à terme sera utilisé par des orthophonistes, des ergothérapeutes et par moi à l'occasion pour faire travailler mon fils.
    Il faut que les pages puissent être composées facilement à partir d'une bibliothèque de pictogrammes et de sons associés. Donc un fichier texte avec les noms des images me semblait le plus facile.

    Je poste la solution dés que je l'ai trouvé. C'est bon pour mon apprentissage.
    @+, j'ai du taf!!!

  7. #7
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Oui donc il faut trouver un moyen de faire sauter le dernier caractère...

    Le site www.cppreference.com contient le descriptif de plusieurs fonctions C, dont fscanf.


    Ca donnerait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    while (fscanf(menu, "%s\n", pictoEnCours) != EOF)
        {
            fprintf ( stdout,"--*%s*--\n",pictoEnCours);
            *pictoName[i] = strdup(pictoEnCours);
           i++;
        }
    Et comment est déclaré pictoName? (pas pictoEnCours)

  8. #8
    Futur Membre du Club
    Inscrit en
    Mars 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    Re,

    En modifiant ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    while (fgets(pictoEnCours, 100, menu) != NULL)
        {
            pictoEnCours[strlen(pictoEnCours) - 1] = '\0';
            fprintf ( stdout,"%s)",pictoEnCours);
            *pictoName[i] = strdup(pictoEnCours);
           i++;
        }
    j'obtiens un résultat tout à fait conforme à mes souhaits et stdout ressemble à ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    chat.png)cheval.png)chien.png)cochon.png)elephant.png)grenouille.png)lion.png)singe.png)vache.png)
    Encore merci pour votre aide.
    Je vais me plonger dans les docs pour voir comment libérer la mémoire allouée par strdup.
    Allez, je m'y recolle!
    @+

  9. #9
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381
    Par défaut
    Citation Envoyé par erreip-naej Voir le message
    @Mat.M
    Je commence le C (allez disons depuis 2 mois, le soir aprés le boulot) alors le C++, ce n'est pas pour tout de suite.
    Ok.
    Dès que tu te sens un peu plus à l'aise alors, je conseillerais de s'initier aux listes chainées
    il y a des bons tutoriels sur ce forum.
    Ceci dit std::vector et la STL c'est un peu difficile à comprendre au début mais cela apporte considérablement de la souplesse.
    Pour quelque chose de plus souple et évolué les images pourraient être chargées selon un fichier .XML ou un langage de script

  10. #10
    Futur Membre du Club
    Inscrit en
    Mars 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    Bonjour,

    me revoila!!!
    Pour coyotte pictoEnCours est declaré comme ça:
    J'ai découpé mon code en plusieurs fonctions et fichiers, car c'était un peu long et difficile à gérer.
    Miracle, ça marche toujours!
    Maintenant,je vais me battre pour mettre mes fichiers "image" et "son" dans des sous-repertoires.
    Ca avance doucement, mais ca avance!!!
    @+

  11. #11
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Citation Envoyé par erreip-naej Voir le message
    Bonjour,

    me revoila!!!
    Pour coyotte pictoEnCours est declaré comme ça:
    J'ai découpé mon code en plusieurs fonctions et fichiers, car c'était un peu long et difficile à gérer.
    Miracle, ça marche toujours!
    Maintenant,je vais me battre pour mettre mes fichiers "image" et "son" dans des sous-repertoires.
    Ca avance doucement, mais ca avance!!!
    @+
    Salut,

    Pour la troisième fois c'est PictoName et pas pictoEnCours que je demande

    Enfin si ton programme marche, oublie ça!

    J'espère que tu libères bien la mémoire allouée.

    @+

  12. #12
    Membre actif Avatar de ironzorg
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 288
    Points : 245
    Points
    245
    Par défaut
    Omg tu ne fais aucun test de retour de tes fonctions de chargement ?

Discussions similaires

  1. Problème également avec IMG_Load
    Par Soward dans le forum SDL
    Réponses: 124
    Dernier message: 29/08/2007, 13h05
  2. VC++ Direct3D8, problème avec LPD3DXFONT et LPD3DTEXTURE8
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 03/08/2002, 11h10
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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