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 :

Struct de plusieurs SDL_Surface


Sujet :

SDL

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Juillet 2019
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juillet 2019
    Messages : 49
    Points : 26
    Points
    26
    Par défaut Struct de plusieurs SDL_Surface
    Bonjour,
    Je vous écris pour vous demander un petit conseil sur le chargement de plusieurs images avec SDL_loadBMP.
    Dans mon jeu (de morpion), j'ai une vingtaine d'images.
    J'ai défini une struct de SDL_Surface (dans laquelle j'ai tous mes Jeton), une fonction ChargementImages (qui initialise toute les images et met la couleur blanche en transparent) et une fonction LiberationImages (qui libère les images)

    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
    typedef struct Images Images;
    struct Images
    {
        SDL_Surface *x;
        SDL_Surface *o;
       ...
    };
     
    int ChargementImages(Images *Jeton)
    {
        if(Jeton->o!=NULL)//Vérification de l'allocation des surfaces
        {
            SDL_FreeSurface(Jeton->o);
            Jeton->o = NULL;
        }
        Jeton->o = SDL_LoadBMP("image-o.bmp");//Chargement de toutes les images dans les surfaces associées
    if(Jeton->o==NULL)
    {
            printf("Probleme de chargement d'une ou plusieurs images");
            return faux;
        }//On a testé le retour du chargement
     
        if(Jeton->x!=NULL)
        {
            SDL_FreeSurface(Jeton->x);
            Jeton->x = NULL;
        }
        Jeton->x = SDL_LoadBMP("image-x.bmp");
    if(Jeton->x==NULL)
             {
            printf("Probleme de chargement d'une ou plusieurs images");
            return faux;
        }//On a testé le retour du chargement
     
       ...
    }
     
    void LiberationImages(Images *Jeton)//Libération des images
    {
        SDL_FreeSurface(Jeton->o);
        SDL_FreeSurface(Jeton->x);
        ...
     
    }
    Comme le code de la fonction ChargementImages est long et répétitif , j'ai modifié la fonction ChargementImages et introduis une fonction Chargement :
    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 ChargementImages(Images *Jeton)//reorganisé
    {
        int erreur=faux;
     
        erreur=Chargement(&Jeton->o,"image-o.bmp");
        erreur=Chargement(&Jeton->x,"image-x.bmp");
       ...
        return erreur;
    }
     
    int Chargement(SDL_Surface **surface, char texte[])
    {
        if(*surface!=NULL)//Si la surface a allouée n'est pas vide
        {
            SDL_FreeSurface(*surface);//alosr on la vide
            surface = NULL;
        }
        *surface = SDL_LoadBMP(texte);//Chargement de l'image dans la surface associée
     
        if(surface==NULL)//Vérification de l'allocation de la surface
        {
            fprintf(stderr, "Problème de chargement de l'image %s\n", texte);//Test du retour du chargement
            return faux;
        }
        else fprintf(stderr, "Bon chargement de l'image %s\n", texte); //Test du retour du chargement
     
        if(SDL_SetColorKey(*surface, SDL_SRCCOLORKEY, SDL_MapRGB((*surface)->format, coulBlanc))==-1)//Transparence de coulBlanc
        {
            fprintf(stderr, "Problème de chargement de la transparence totale de l'image %s\n", texte);
            return faux;
        }
     
        return vrai;
    }
    Ce code fonctionne parfaitement mais j'aimerais l'améliorer car :
    1. Je suis obligé de fournir &Jeton->o et "image-o.bmp" pour chaque image. N'y a t il pas moyen de mettre un seul paramètre ? (ils sont toujours du style &Jeton->truc et "image-truc.bmp"
    2. Pour libérer toutes les images, n'y a-t-il pas moyen de faire ça avec une boucle for du style for(image 1 à image finale) free(...), plutôt que d'écrire le nom de chaque image
    3. Lorsque je crée ou supprime image, je dois modifier une ligne dans mon struct, dans mon chargerImage, sans oublier le LiberationImage, (au risque d'oublier une modification)

    Je pense que si j'avais créé un tableau Image[i] cela serait facile avec une boucle for.
    Mais je trouve plus pratique de travailler avec des noms explicites comme &Jeton->o et &Jeton->x, plutôt que Image[0] et Image[1].
    A moins que l'on puisse définir que &Jeton->o et Image[0] comme étant le même objet et que l'on puisse utiliser l'un comme l'autre sans problème (le SDL_LoadBMP et free sur l'un modifierait l'autre).

    Je n'ai pas réussi à trouver quelque chose qui puisse vraiment m'aider sur les sites que j'ai trouvé, c'est pour cela que je me permets de vous demander conseil.
    Je vous remercie de l'aide que vous pourrez m'apporter.
    Cordialement
    Ludovic

  2. #2
    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
    Alors :
    1) Non , même si ça a le même nom , les deux sont deux type totalement différent ...
    La différence est de taille quand même , si on connaît un minimun le langage C , la demande est un peu étrange , ici tu demande au compilo de réunir 2 argument en un et de récupérer le nom de la variable , le mettre dans un string et changer le nom , ouais tu t'es trompé de langage ^^
    2)Non plus
    3)Pas compris.

    Ben oui tu dois faire un tableau d'image , sinon tu peux très bien utiliser un pointeur pour changer de nom.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Images **images
    Images *Jeton;
    Jeton = images[0];
    Par contre moi j'ai quelque conseils à te donner :
    -on ne donne pas la même syntaxe pour les struc et variables , en gros pour les variable souvent c'est minuscule ,et pour les struct Majuscule+minuscule , mais ce n'est pas ce que tu fait avec jeton qui est bel et bien une variable
    -Les nom des variables et fonction en français on évite

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Juillet 2019
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juillet 2019
    Messages : 49
    Points : 26
    Points
    26
    Par défaut
    Merci d'avoir répondu.
    Ce que je demandais dans ma 3eme question, c’était que si j'ai déjà une liste de 5 images (par exemple, jetonBleu, jetonO, JetonX, CoupeVerte et BolPetit) et que je décide d'en rajouter une 6eme (Fourchette), alors je dois modifier mon struct en ajoutant SDL_Surface *Fourchette (qui contenait déjà les 5 définitions), modifier chargerImage et modifier LiberationImage.
    En fait, je me demandais si je pouvais désigner le même objet de deux manières différentes. Par exemple, si je veux afficher mon image Fourchette, j'affiche la surface Fourchette (assez explicite) ou TableauImage[5] (moins explicite). Et par contre pour libérer les images utiliser TableauImage[5].

    Je vais essayer la méthode que tu m'a conseillée.

  4. #4
    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 379
    Points
    20 379
    Par défaut
    bonjour ça fait depuis belle lurette que l"on ne programme plus en C pour programmer un jeu vidéo.
    Il faut utiliser des conteneurs C++ ce n'est pas si difficile que ça et vous aurez moins de problèmes

Discussions similaires

  1. Réponses: 2
    Dernier message: 04/07/2017, 00h10
  2. partager une struct entre plusieurs fils
    Par romainromain dans le forum Réseau
    Réponses: 8
    Dernier message: 22/11/2006, 20h22
  3. Réponses: 6
    Dernier message: 31/08/2005, 13h25
  4. Génerer automatiquement plusieurs fichier .doc
    Par brunovitch dans le forum QuickReport
    Réponses: 3
    Dernier message: 09/07/2002, 08h19
  5. Shortcut avec plusieurs touches
    Par scorpiwolf dans le forum C++Builder
    Réponses: 4
    Dernier message: 06/07/2002, 15h57

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