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 également avec IMG_Load


Sujet :

SDL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 91
    Points : 67
    Points
    67
    Par défaut Problème également avec IMG_Load
    Bonsoir,

    Et oui moi aussi j'ai un problème avec IMG_Load.
    J'essaie de faire mon premier vrai jeu, un snake.

    Il m'arrive un truc de base (sa ne m'étais jamais arrivé avant), je n'arrive pas à charger une image.

    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SDL_Surface *ecran = NULL, *imageSerpent = NULL;
    //Je vous passe la suite
    imageSerpent = IMG_Load("images/corp_serpent.gif");
        if(imageSerpent == NULL)
        {
            fprintf(stderr,"Impossible de charger le corp du serpent");
            exit(EXIT_FAILURE);
        }
    Voila, et la fenetre s'ouvre et se referme rapidement.
    Je n'ai rien d'écrit dans mon stderr, et quand j'enlève cette ligne de code (quand j'ouvre mon image) ma fenetre s'ouvre !

    Si vous avez besoin de tout mon code, dites le moi

    A+

  2. #2
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Vu que le code je suppose que SDL_Init est appelé après avoir appelé IMG_Load...

    Si c'est le cas, c'est une erreur. Il faut appelé SDL_Init avant toutes les fonctions SDL.

    Jc

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 91
    Points : 67
    Points
    67
    Par défaut
    Bonjour,

    SDL_Init est bien appelé avant IMG_Load.

    Je vous mes tout le début de mon code :

    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
     
    int continuer = 1, i = 0, j = 0, nombreDeCorp = 8, direction = BAS;
        const int largeurSprite = 15;
        const int hauteurSprite = 15;
        SDL_Event event;
        SDL_Surface *ecran = NULL, *imageSerpent = NULL;
        Position *serpent[1000] = {NULL};
        int tempsActuel = 0, tempsPrecedent = 0, vitesse = 500;
     
        //Initialisation de la SDL
        if(SDL_Init(SDL_INIT_VIDEO) < 0)
        {
            fprintf(stderr,"Impossible d'initialiser la SDL");
            exit(EXIT_FAILURE);
        }
     
        ecran = SDL_SetVideoMode(LARGEUR_ECRAN,HAUTEUR_ECRAN,NBRE_DE_BIT,SDL_HWSURFACE | SDL_DOUBLEBUF);
        if(ecran < 0)
        {
            fprintf(stderr,"Impossible d'ouvrir la fenetre");
            exit(EXIT_FAILURE);
        }
     
        //On donne un titre à la fenetre
        SDL_WM_SetCaption("Serpent en SDL",NULL);
     
        //Chargement des images
        //Le corps du serpent
        imageSerpent = IMG_Load("images/corp_serpent.gif");
        if(imageSerpent == NULL)
        {
            fprintf(stderr,"Impossible de charger le corp du serpent");
            exit(EXIT_FAILURE);
        }
    Voila, donc en théorie sa devrait bien fonctionner non ?

    A+

  4. #4
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    C'est :

    Ensuite, il faudrait un code minimum qui est compilable et qui provoque cette erreur avec l'image que tu tentes de charger. Ce sera plus simple pour comprendre le problème.

    Jc

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 91
    Points : 67
    Points
    67
    Par défaut
    Je viens de refaire un projet en racourcissant mon code, et la fenetre s'ouvre bien (je ne comprend pas pourquoi, j'ai fais un copier/coller).

    Ce code la fonctionne bien :

    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
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL/SDL.h>
    #include <SDL/SDL_image.h>
     
    int main(int argc, char *argv[])
    {
        int continuer = 1;
        SDL_Event event;
        SDL_Surface *ecran = NULL, *imageSerpent = NULL;
     
        //Initialisation de la SDL
        if(SDL_Init(SDL_INIT_VIDEO) < 0)
        {
            fprintf(stderr,"Impossible d'initialiser la SDL");
            exit(EXIT_FAILURE);
        }
     
        ecran = SDL_SetVideoMode(600,400,32,SDL_HWSURFACE | SDL_DOUBLEBUF);
        if(ecran == NULL)
        {
            fprintf(stderr,"Impossible d'ouvrir la fenetre");
            exit(EXIT_FAILURE);
        }
     
        //On donne un titre à la fenetre
        SDL_WM_SetCaption("Test image",NULL);
     
        //Chargement des images
        //Le corps du serpent
        imageSerpent = IMG_Load("images/corp_serpent.gif");
        if(imageSerpent == NULL)
        {
            fprintf(stderr,"Impossible de charger le corp du serpent");
            exit(EXIT_FAILURE);
        }
     
        while(continuer)
        {
            while(SDL_PollEvent(&event))
            {
                switch(event.type)
                {
                    case SDL_QUIT:
                        continuer = 0; //On quitte le programme
                        break;
                }//Fin du switch (event.type)
     
            }//Fin du while(SDL_PollEvent(event.type))
     
        }//Fin du while(continuer)
     
        SDL_Quit();
     
        return EXIT_SUCCESS;
    }
    Je me suis permit d'uploader mon code source (du serpent) qui ne marche pas. Vous pouvez télécharger le zip ici (comme sa vous pourrez voir le code dans son ensemble )

    A+

  6. #6
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Voici un warning intéressant :

    main.c:80: warning: passing argument 4 of ‘SDL_UpperBlit’ from incompatible pointer type
    Le 4ème paramètre de la fonction SDL_BlitSurface doit être de type SDL_Rect*...

    Jc

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 91
    Points : 67
    Points
    67
    Par défaut
    Merci, la fenetre s'ouvre enfin :p

    Je re-répondrais sur ce topic si j'ai encore des problèmes

    A+

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 91
    Points : 67
    Points
    67
    Par défaut
    Désolé du double post, à peine 30 minutes plus tard j'ai déja un soucis^^

    En faite je veux que tout les 500 millisecondes mon serpent se déplace de 15 pixel (vers le bas).

    Or il ne bouge pas ^^

    Voila comment je m'y suis pris :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    direction = BAS;
    /* GESTION DU TEMPS */
            tempsActuel = SDL_GetTicks();
            if((tempsActuel - tempsPrecedent) > vitesse)
            {
                //On appelle une fonction pour déplacer le serpent
                deplacerSerpent(direction,positionSerpent[0]);
     
                tempsPrecedent = tempsActuel; //On remet tempsPrecedent à 0
            }
    Et la fonction deplacerSerpent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    void deplacerSerpent(int direction, SDL_Rect positionTeteSerpent)
    {
        if(direction == BAS) //Si le serpent va vers le bas
        {
            positionTeteSerpent.y =+ HAUTEUR_SPRITE;
            if(positionTeteSerpent.y >= HAUTEUR_ECRAN)
            {
                positionTeteSerpent.y = 0;
            }
        }
    }
    Voila et mon serpent (tout du moins la tete) ne bouge pas !

    Voici mon code en entier si vous le souhaitez : Cliquez ici

    A+

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 104
    Points : 113
    Points
    113
    Par défaut
    SDL_Flip(ecran) ?

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 91
    Points : 67
    Points
    67
    Par défaut
    Heu oui je l'ai mis

    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
    /* GESTION DU TEMPS */
            tempsActuel = SDL_GetTicks();
            if((tempsActuel - tempsPrecedent) > vitesse)
            {
                //On appelle une fonction pour déplacer le serpent
                deplacerSerpent(direction,positionSerpent[0]);
     
                tempsPrecedent = tempsActuel; //On remet tempsPrecedent à 0
            }
     
            //On efface l'ecran
            SDL_FillRect(ecran,NULL,SDL_MapRGB(ecran->format,0,185,231));
     
            //On blit (boucle)
            for(i=0;i <= nombreDeCorp;i++)
            {
                SDL_BlitSurface(imageSerpent,NULL,ecran,&positionSerpent[i]);
            }
     
            //On actualise l'ecran
            SDL_Flip(ecran);
    Par contre comment je fais pour que le corp du serpent suive la tete après ?

    A+

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 104
    Points : 113
    Points
    113
    Par défaut
    tu connais toujours la position de là tête donc tu peu afficher le corps en utilisant les coordonnées de celle-ci.

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 91
    Points : 67
    Points
    67
    Par défaut
    Ok donc après ma fonction deplacerSerpent, je récupère les coordonnées de la tête (qui ont été modifiées par la fonction) et je modifie en conséquence les coordonnées du corp ! (ok j'ai compris :p).

    Par contre as-tu une idée de pourquoi la tête de mon serpent ne bouge pas (j'ai modifié ces coordonnées donc elle devrait avancer non) ?

    A+

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 104
    Points : 113
    Points
    113
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
          //On blit (boucle)
            for(i=0;i <= nombreDeCorp;i++)
            {
                SDL_BlitSurface(imageSerpent,NULL,ecran,&positionSerpent[i]);
            }
    dans le Blit de ta surface il faudrais faire plutot
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SDL_BlitSurface(imageSerpent,NULL,ecran,&positionSerpent);
    car positionSerpent pointe vers une structure contenant les coordonnées x et y donc pas besoin de passer un tableau.

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 91
    Points : 67
    Points
    67
    Par défaut
    Oui mais la sa me blit juste la tete.
    Pour l'instant je voudrais qu'il y ai juste la tete qui bouge, mais que tout le serpent soit affiché (c'est le cas).

    Donc je suis obligé de garder la boucle for pour blitter tout le serpent

    A+

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 104
    Points : 113
    Points
    113
    Par défaut
    ha, oui d'accord pour le tableau de position des differentes parties du corps pourrais tu me faire voir ta fonction deplacerSerpent en entier.

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 91
    Points : 67
    Points
    67
    Par défaut
    Ma fonction deplacerSerpent c'est juste sa :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void deplacerSerpent(int direction, SDL_Rect positionTeteSerpent)
    {
        if(direction == BAS) //Si le serpent va vers le bas
        {
            positionTeteSerpent.y =+ HAUTEUR_SPRITE;
            if(positionTeteSerpent.y >= HAUTEUR_ECRAN)
            {
                positionTeteSerpent.y = 0;
            }
        }
    }
    Pour l'instant je veux juste que ma tête aille vers le bas (donc j'ai pas encore coder pour qu'il aille vers le haut ou autre).

    J'ai rajouté ce code pour que le corp suive la tête (dites moi si c'est bien ce que j'ai fais ou si c'est .... pas bon :p)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    //On modifie les coordonnées des autres parties du corp
                for(i=1;i <= nombreDeCorp;i++)
                {
                    positionSerpent[i].x = positionSerpent[i - 1].x;
                    positionSerpent[i].y = positionSerpent[i - 1].y;
                }
    Donc voila je vous remet mon code :

    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
    /* GESTION DU TEMPS */
            tempsActuel = SDL_GetTicks();
            if((tempsActuel - tempsPrecedent) > vitesse)
            {
                //On appelle une fonction pour déplacer le serpent
                deplacerSerpent(direction,positionSerpent[0]);
     
                tempsPrecedent = tempsActuel; //On remet tempsPrecedent à 0
     
                //On modifie les coordonnées des autres parties du corp
                for(i=1;i <= nombreDeCorp;i++)
                {
                    positionSerpent[i].x = positionSerpent[i - 1].x;
                    positionSerpent[i].y = positionSerpent[i - 1].y;
                }
     
            }//Fin du if((tempsActuel - tempsPrecedent) > vitesse)
     
            //On efface l'ecran
            SDL_FillRect(ecran,NULL,SDL_MapRGB(ecran->format,0,185,231));
     
            //On blit (boucle)
            for(i=0;i <= nombreDeCorp;i++)
            {
                SDL_BlitSurface(imageSerpent,NULL,ecran,&positionSerpent[i]);
            }
     
            //On actualise l'ecran
            SDL_Flip(ecran);
    Et ma fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    /* LES FONCTIONS */
     
    void deplacerSerpent(int direction, SDL_Rect positionTeteSerpent)
    {
        if(direction == BAS) //Si le serpent va vers le bas
        {
            positionTeteSerpent.y =+ HAUTEUR_SPRITE;
            if(positionTeteSerpent.y >= HAUTEUR_ECRAN)
            {
                positionTeteSerpent.y = 0;
            }
        }
    }
    Voila, donc pourquoi mon serpent ne bouge pas ?

    A+

  17. #17
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 104
    Points : 113
    Points
    113
    Par défaut
    il faut que tu crée dans ta fonction deplacerSerpent un pointeur vers tes coordonnées car là tu crée une structure coordonnées dans la fonctions ce qui ne modifie pas les coordonnées du serpent.

    prototype de la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void deplacerSerpent(int direction, SDL_Rect *positionTeteSerpent);
    appel de la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    deplacerSerpent(direction, &positionSerpent);

  18. #18
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par LeTsIrGoD
    il faut que tu crée dans ta fonction deplacerSerpent un pointeur vers tes coordonnées car là tu crée une structure coordonnées dans la fonctions ce qui ne modifie pas les coordonnées du serpent.
    Oui, une autre facon de le dire est que tu copies la position de la tête en local, du coup toute modification de cette structure se fait en local.

    Il faut passer un pointeur vers cette structure pour que les modifications soient prises en compte.

    Jc

  19. #19
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 104
    Points : 113
    Points
    113
    Par défaut
    exact. (j'avais peu être un peu mal formulé).

  20. #20
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 91
    Points : 67
    Points
    67
    Par défaut
    Merci de vos réponses, sa marche !

    Par contre le corp du serpent ne suit pas !

    Il disparait (je n'ai pas compris pourquoi).

    Je pense que l'erreur vient d'ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    //On modifie les coordonnées des autres parties du corp
            for(i=1;i <= nombreDeCorp;i++)
            {
                positionSerpent[i].x = positionSerpent[i - 1].x;
                positionSerpent[i].y = positionSerpent[i - 1].y;
            }
    En gros mon corp disparait au bout d'une seconde :s

    A+

Discussions similaires

  1. Problème avec IMG_load
    Par erreipnaej dans le forum SDL
    Réponses: 11
    Dernier message: 16/11/2008, 10h41
  2. Problème mémoire avec une dll par chargement dynamique
    Par widze19 dans le forum C++Builder
    Réponses: 6
    Dernier message: 15/12/2003, 13h20
  3. problèmes bizarres avec jdbc
    Par jaimepasteevy dans le forum PostgreSQL
    Réponses: 8
    Dernier message: 12/12/2003, 12h00
  4. Problème requête avec UNION et ORDER BY
    Par Yann21 dans le forum Langage SQL
    Réponses: 12
    Dernier message: 12/12/2003, 11h02
  5. problème JSP avec JBuilder et Weblogic 7
    Par viny dans le forum JBuilder
    Réponses: 2
    Dernier message: 24/04/2003, 08h07

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