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 :

SDL Affichage image


Sujet :

SDL

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

    Informations forums :
    Inscription : Avril 2011
    Messages : 4
    Points : 1
    Points
    1
    Par défaut SDL Affichage image
    Bonjour,

    Je cherche à afficher une image en SDL, le problème est que j'ai l'impression de tout bien faire mais l'image ne s'affiche pas et j'ai du noir à la place.
    Je suis sur mac OS X Mountain Lion et j'utilise xcode pour travailler.

    Mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SDL_Surface* ecran = SDL_SetVideoMode( 800, 600, 32, SDL_HWSURFACE );
        if(imgSurface = SDL_LoadBMP("image.bmp")==NULL){
            printf("Can't find picture: %s\n", SDL_GetError( ));
        }
        SDL_Rect positionImg;
        positionImg.x=0;
        positionImg.y=0;
        SDL_BlitSurface( imgSurface, NULL, ecran, &positionImg);
        SDL_Flip( ecran );
    Je me retrouve avec le message Couldn't open image.bmp
    L'image est pourtant dans le dossier de mon projet. J'ai essayé a peu pres tous les dossiers possibles mais à chaque fois Couldn't open damier.bmp...

    J'arrive par contre bien a afficher des rectangles dans ma fenêtre...

    Merci de votre aide.
    Flouck.

  2. #2
    Membre régulier Avatar de c1702
    Homme Profil pro
    Inscrit en
    Mai 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 22
    Points : 90
    Points
    90
    Par défaut
    Bonsoir,

    Normalement ce code te renvoie un warning, quelque chose du genre :
    warning: suggest parentheses around assignment used as truth value

    Ca vient de la priorité des opérateurs "=" et "==". C'est ennuyeux parce que dans ton cas, imgSurface se retrouve à valoir 0 ou 1 et pas l'adresse de la surface. Ca se corrige comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if ((imgSurface = SDL_LoadBMP("image.bmp")) == NULL) {
            printf("Can't find picture: %s\n", SDL_GetError());
    }
    Une fois ce problème reglé, je pense que ça ne résoudra pas ton problème et que l'image n'est pas où elle devrait être (sinon tu ne rentrerais pas dans le 'if'). A priori, j'essayerai de la mettre au même endroit que les fichiers ".c" et ".h" de ton projet. (A moins qu'il n'y ait une subtilité sur le mac ?).

    Notes :
    - Il faut vérifier le retour de SDL_SetVideoMode.
    - Je suppose que le SDL_Init (qu'il faut vérifier également) est présent.
    - Dans ton post, il est question de "image.bmp" puis de "damier.bmp", j'ai supposé que tu parlais bien de la même image.

    Clément.

    PS : La prochaine fois, essaye de mettre les balises de code.

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Merci pour ta réponse rapide, j'ai du coup modifié le code pour ajouter toutes les verifications et tout se passe bien sauf la récupération de l'image...
    J'ai même essayé d'ajouter l'image au projet mais elle ne s'affiche pas non plus.

    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
     
        if( SDL_Init( SDL_INIT_EVERYTHING ) == -1 ){
            printf( "Can't init SDL:  %s\n", SDL_GetError() );
            return EXIT_FAILURE;
        }
        SDL_Surface* ecran = NULL;
        ecran = SDL_SetVideoMode( 800, 600, 32, SDL_HWSURFACE|SDL_DOUBLEBUF );
        if( ecran == NULL ){
            printf( "Can't set video mode: %s\n", SDL_GetError( ) );
            return EXIT_FAILURE;
        }
        imgSurface = SDL_LoadBMP("image.bmp");
        if(imgSurface==NULL){
            printf("No picture:  %s\n", SDL_GetError());
            return EXIT_FAILURE;
        }
        SDL_Rect positionImg;
        positionImg.x=0;
        positionImg.y=0;
        SDL_BlitSurface( imgSurface, NULL, ecran, &positionImg);
        SDL_Flip( ecran );
        if( SDL_Flip( ecran ) == -1 ) {
            printf( "Can't flip the screen: %s\n", SDL_GetError( ) );
    	return EXIT_FAILURE;
        }
    Voila du coup le nouveau code (dans les balises code )

    Je n'arrive toujours pas a afficher d'image et ca me renvoi une erreur : Couldn't open image.bmp

    Aidez moi s'il vous plait.

    Merci
    Flouck

  4. #4
    Membre régulier Avatar de c1702
    Homme Profil pro
    Inscrit en
    Mai 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 22
    Points : 90
    Points
    90
    Par défaut
    Bonjour,

    Je ne connais pas du tout le mac ni XCode, désolé.

    Ce que tu peux essayer pour tester :
    - Mettre le chemin absolu vers l'image (temporairement, bien sûr).
    - Utiliser un "getcwd" ou une fonction de ce style pour vérifier que le répertoire de travail est bien le bon.

    Le coup du getcwd, je j'ai touvé sur la page ci-dessous, il est aussi question du "working directory" de XCode :
    http://www.gamedev.net/topic/561885-.../#entry4602151

    Est-ce qu'il n'y aurait pas une histoire de droits d'accès au fichier non plus ? (Pure supposition).

    Dans ton code, tu as deux fois SDL_Flip . En général ce n'est pas la peine de vérifier SDL_Flip ou SDL_BlitSurface. Ce qu'il faut absolument vérifier, ce sont les fonction d'init, celles qui font des allocations mémoire et celles qui accèdent à des ressources externes.

    Clément.

  5. #5
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    625
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 625
    Points : 1 564
    Points
    1 564
    Par défaut
    Hello,

    Je pense que si tu mets l'image dans le même répertoire que l'exécutable, tu n'auras plus de problème.

    Et en dehors des remarques de Clément, j'ajouterais que faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SDL_Rect positionImg;
    positionImg.x=0;
    positionImg.y=0;
    SDL_BlitSurface( imgSurface, NULL, ecran, &positionImg);
    revient à faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SDL_BlitSurface( imgSurface, NULL, ecran, NULL);
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

  6. #6
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    Alors j'ai testé ce que vous m'aviez dit ce weekend et rien ne fonctionnai, du coup j'ai installé la librairie SDL_image.framework et j'ai utilisé à la place la fonction SDL_LoadBMP() la fonction IMG_Load() et du coup ca fonctionne mais seulement avec les chemins absolu des images. Le chemin relatif ne fonctionne pas, j'ai essayé de changer la photo de répertoire, dans le projet, avec les .cpp, avant le projet mais rien n'y fait ca ne fonctionne pas...

    mon code ressemble a ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    void afficherImage(SDL_Surface * screen){
        SDL_Rect positionSurface;
        SDL_Surface* image = NULL;
        image = IMG_Load("/Users/flouck/projet/jeux/image.png");          
        positionSurface.x = 100;
        positionSurface.y = 100;
        SDL_BlitSurface(image, NULL, screen, &positionSurface);
    }
    J'ai donc essayé "/image.png" pour la localisation de l'image mais ca ne fonctionne pas.
    J'ai aussi essayé "/jeux/image.png" et "/projet/jeux/image.png" mais ca ne fonctionne pas non plus...

    Quelqu'un aurait une idée s'il vous plait?

    Merci.

  7. #7
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    Par défaut
    Citation Envoyé par flouck Voir le message
    J'ai donc essayé "/image.png" pour la localisation de l'image mais ca ne fonctionne pas.
    J'ai aussi essayé "/jeux/image.png" et "/projet/jeux/image.png" mais ca ne fonctionne pas non plus...

    Quelqu'un aurait une idée s'il vous plait?

    Merci.
    Pas idée sauf une , est que tu exécute ton programme avec code block ? (si oui peut être que code block exécute le programme dans un autre répertoire).

  8. #8
    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 064
    Points
    219 064
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Il faut essayer :
    ./image.png
    ou
    ./jeux/image.png
    Après, cela dépend si vous lancer l'exécutable à partir de l'EDI ou directement en double cliquant. En effet, quelques fois, l'EDI lance l'executable à partir d'un autre dossier (celui du projet généralement), ce qui fait que les fichiers de ressources peuvent ne pas être visibles.
    Sinon, avec les chemins que j'ai donné, il faut mettre les fichiers de ressources dans le même dossier que l'exécutable et après, ça marche (lorsqu'on lance l'exécutable à partir de son dossier).
    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.

  9. #9
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Kannagi Voir le message
    Pas idée sauf une , est que tu exécute ton programme avec code block ? (si oui peut être que code block exécute le programme dans un autre répertoire).
    Je code sous Xcode du coup je ne sais pas si une fois compilé le programme est exécuté dans un autre dossier (un dossier alloué pour les executions de Xcode). Comment je peux savoir ou mon programme est exécuté?

    Citation Envoyé par Kannagi Voir le message
    Il faut essayer :
    ./image.png
    ou
    ./jeux/image.png
    J'ai essayé mais ca ne fonctionne pas non plus...

    Citation Envoyé par LittleWhite Voir le message
    cela dépend si vous lancer l'exécutable à partir de l'EDI ou directement en double cliquant
    Qu'est ce que l'EDI?

    A passage je ne créé pas l'exécutable a chaque fois, le programme est en développement du coup je ne créé pas l'exécutable à chaque fois.

Discussions similaires

  1. Problème affichage image SDL
    Par lorderasmus dans le forum SDL
    Réponses: 7
    Dernier message: 05/02/2014, 18h59
  2. SDL conditions affichage image
    Par MattCand dans le forum SDL
    Réponses: 3
    Dernier message: 24/11/2009, 21h14
  3. Affichage Image
    Par greg_one dans le forum Composants
    Réponses: 5
    Dernier message: 22/06/2004, 16h10
  4. Problème de mémoire Affichage images
    Par Repti dans le forum C++Builder
    Réponses: 6
    Dernier message: 29/03/2004, 20h06
  5. [Kylix] pb Affichage image .jpg
    Par sioux dans le forum EDI
    Réponses: 4
    Dernier message: 18/01/2004, 19h20

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