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 :

La lecture de chaîne de caractère empêche l'affichage d'images


Sujet :

SDL

  1. #1
    Membre du Club Avatar de Jordinateur
    Profil pro
    Inscrit en
    Février 2007
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 119
    Points : 51
    Points
    51
    Par défaut La lecture de chaîne de caractère empêche l'affichage d'images
    Bonjour à tous

    J'ai un petit problème qui me surprend.
    D'abord la partie de 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
    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
     
    SDL_Surface *randomMap (s_tileset *s_village, s_map *s_m_randomMap)
    {
        char caracter = 0;
        srand((unsigned)time(NULL));
        int i, j;
     
        /*Ouverture du fichier*/
        FILE *f_map = NULL;
        f_map = fopen("MAP/1.map", "r");
        if (f_map == NULL)
        {
            fprintf(stderr, "Erreur lors de la création du fichier 1.map");
            exit(EXIT_FAILURE);
        }
     
        /*Coordonnée de la tuile qui va être blitée sur la map*/
        SDL_Rect tileCoordMap;
        tileCoordMap.x = 0;
        tileCoordMap.x = 0;
        tileCoordMap.w = TILE;
        tileCoordMap.h = TILE;
     
        /*Coordonnée de la tuile du tileset qui va être utilisée*/
        SDL_Rect tileCoordTileset;
        tileCoordTileset.x = randomNumber(0, s_village->numberTileX)*TILE;
        tileCoordTileset.y = randomNumber(0, s_village->numberTileY)*TILE;
        tileCoordTileset.w = TILE;
        tileCoordTileset.h = TILE;
     
        /*Initialisation de la map*/
        s_m_randomMap->coord.x = 0;
        s_m_randomMap->coord.y = 0;
        s_m_randomMap->picture->h = W_HEIGHT;
        s_m_randomMap->picture->w = W_WIDTH;
        fscanf(f_map, "%d %d", &(s_m_randomMap->picture->w), &(s_m_randomMap->picture->h));//On lit la résolution de la map dans le fichier
        s_m_randomMap->picture = SDL_CreateRGBSurface(SDL_HWSURFACE, s_m_randomMap->picture->w, s_m_randomMap->picture->h, 32, 0, 0, 0, 0);
     
        /*Blitage des images les unes à la suite des autres*/
        for(i=0; i<(s_m_randomMap->picture->h/TILE); i++)
        {
            for(j=0; j<(s_m_randomMap->picture->w/TILE); j++)
            {
                //fscanf(f_map, "%d %d", &(tileCoordTileset.x), &(tileCoordTileset.y));
                tileCoordTileset.x = TILE*tileCoordTileset.x;
                tileCoordTileset.y = TILE*tileCoordTileset.y;
                //fprintf(stdout, "%ld %ld\n", tileCoordTileset.x, tileCoordTileset.y);
                //tileCoordTileset.x = randomNumber(0, s_village->numberTileX)*TILE;
                //tileCoordTileset.y = randomNumber(0, s_village->numberTileY)*TILE;
                SDL_BlitSurface(s_village->picture, &tileCoordTileset, s_m_randomMap->picture, &tileCoordMap);
                tileCoordMap.x += 32;
            }
            SDL_BlitSurface(s_village->picture, &tileCoordTileset, s_m_randomMap->picture, &tileCoordMap);
            tileCoordMap.x = 0;
            tileCoordMap.y += 32;
        }
        tileCoordMap.y = 0;
        tileCoordMap.x = 0;
     
        /*Fermeture du fichier*/
        fclose(f_map);
     
        return (s_m_randomMap->picture);
    }
    C'est une fonction qui "marche très bien" si jpuis dire ; elle affiche des tiles aléatoire de 32*32 , sur la surface qu'elle retourne, à partir d'un tileset. Simplement voilà, j'ai essayé de modifié ma fonction pour qu'au lieu que les tiles soient aléatoirent, leurs coordonnées sur le tileset soient inscritent dans un fichier 1.map. en fait dès que j'enlève les // devant la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //fscanf(f_map, "%d %d", &(tileCoordTileset.x), &(tileCoordTileset.y));
    Eh bien il n'y a aucun résultat à l'écran ! Pourtant quand je fais un fprintf dans stdout, là sa me réécris corectement les coordonnées qui sont inscrite dans 1.map !! J'en déduis que ce n'est pas un problème de coordonnées et donc d'image qui sont affichée hors de la fenêtre...Et donc je ne comprends absolument pas pourquoi rien qu'en ajoutant une ligne, il n'y a pas de résultat ! Pourtant sans cette ligne, justement, tout marche corectement

    Merci à tout ceux qui voudront bien essayer de m'aider

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 58
    Points : 63
    Points
    63
    Par défaut
    Ton problème est un peu délicat, là je vois pas d'erreur, je peux juste te donner un conseil (ou deux) :

    - La fonction scanf/fscanf a parfois un comportement un peu étrange tu peux essayer d'utiliser fgets à la place. Par curiosité tu peux lire également (http://xrenault.developpez.com/tutoriels/c/scanf/)

    - isoler ton code d'écriture/lecture sur fichier, pour vérifier que ton code fonctionne, indépendamment de la partie graphique & SDL.

  3. #3
    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 : 44
    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
    Il faut commencer par faire ce que dis Bibicy.

    Ensuite :

    Eh bien il n'y a aucun résultat à l'écran ! Pourtant quand je fais un fprintf dans stdout, là sa me réécris corectement les coordonnées qui sont inscrite dans 1.map !! J'en déduis que ce n'est pas un problème de coordonnées et donc d'image qui sont affichée hors de la fenêtre...Et donc je ne comprends absolument pas pourquoi rien qu'en ajoutant une ligne, il n'y a pas de résultat ! Pourtant sans cette ligne, justement, tout marche corectement
    Est-ce les mêmes valeurs que ce que tu as lorsque tu n'utilises pas 1.map ? Je vois que tu as un random mais est-ce que tu peux enlever le random juste pour tester ?

    Jc

  4. #4
    Membre du Club Avatar de Jordinateur
    Profil pro
    Inscrit en
    Février 2007
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 119
    Points : 51
    Points
    51
    Par défaut
    Ba en fait, j'ai réussi à contourner le problème : j'ai remplacé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    fscanf(f_map, "%d %d", &(tileCoordTileset.x), &(tileCoordTileset.y));
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    fscanf(f_map, ",%d %d", &number1, &number2);
    tileCoordTileset.x = number1; 
    tileCoordTileset.y = number2;
    ET là tout ce passes comme je le veux, ce qui prouve bien que mon code fonctionne correctement (j'ai d'ailleurs entièrement terminé mon programme entre temps )
    Néanmoins je vais essayer de voir quel est le problème en allant sur le lien tout de même

    Est-ce les mêmes valeurs que ce que tu as lorsque tu n'utilises pas 1.map ?
    Ba non puisque ce sont des nombres aléatoires

    e vois que tu as un random mais est-ce que tu peux enlever le random juste pour tester ?
    Il n'y a aucun soucis avec mon randomNumber, je l'ai crée indépendemment de ce projet, en console et tous les nombres son parfaitement aléatoires ;p

    - La fonction scanf/fscanf a parfois un comportement un peu étrange tu peux essayer d'utiliser fgets à la place.
    Sa fonctionne pareil et fait la même chose ?

  5. #5
    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 : 44
    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
    Sa fonctionne pareil et fait la même chose ?
    Pas exactement mais cela est plus fiable...

    Par contre, visiblement tu mets des virgules dans ton fichier 1.map vu que ton fscanf qui fonctionne en contient.

    Effectivement, avec un virgule, cela rend la chose plus difficile...

    Jc

  6. #6
    Membre du Club Avatar de Jordinateur
    Profil pro
    Inscrit en
    Février 2007
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 119
    Points : 51
    Points
    51
    Par défaut
    Ba la virgule sa sert en fait à ce que le fichier 1.map soit plus lisible (histoire qu'on différence les coordonnées d'un tile) j'aurais très bien pu mettre des espaces mais j'ai préféré une séparation en fait.
    Mais bon pour cette fois je vais laisser le scanf, mais la prochaine fois j'utiliserais fgetc (fgets n'est pas adapté à cette situation je pense... Nan ?)

  7. #7
    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 : 44
    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 Jordinateur Voir le message
    Mais bon pour cette fois je vais laisser le scanf, mais la prochaine fois j'utiliserais fgetc (fgets n'est pas adapté à cette situation je pense... Nan ?)
    Si toujours, il suffit de savoir ce qu'on fait... Mais fgets marcherait très bien !

    Jc

  8. #8
    Membre du Club Avatar de Jordinateur
    Profil pro
    Inscrit en
    Février 2007
    Messages
    119
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 119
    Points : 51
    Points
    51
    Par défaut
    Ba fgets ne permet que de lire une chaine de caractères, pas de récupérer des valeurs dans u fichier nan ?!

Discussions similaires

  1. Réponses: 5
    Dernier message: 10/09/2009, 12h37
  2. Réponses: 2
    Dernier message: 16/07/2007, 14h46
  3. Lecture de chaîne de caractères et affichage en pyramide
    Par beriocha dans le forum Assembleur
    Réponses: 5
    Dernier message: 04/06/2007, 21h35
  4. Réponses: 3
    Dernier message: 16/03/2007, 23h22
  5. Réponses: 3
    Dernier message: 14/04/2006, 10h57

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