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 :

Obtenir la taille d'une texture


Sujet :

SDL

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 16
    Points : 7
    Points
    7
    Par défaut Obtenir la taille d'une texture
    Bonsoir !

    Je suis occupée à créer une fonction pour découper un sprite en plusieurs frame, mais il me faut la taille de l'image. Certes je pourrais l'indiquer moi même, mais je trouve plus pratique de pouvoir l'obtenir et donc de ne pas m'en soucier.

    Sous SDL 1.2 on faisait simplement surface.w ou surface.h. Mais avec les textures, il n'y a aucune info.

    Comment puis-je le faire ?
    Merci !

  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
    Pourtant il y a bel et bien w et h dans SDL_Texture.

    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
     
    /* Define the SDL texture structure */
    struct SDL_Texture
    {
        const void *magic;
        Uint32 format;              /**< The pixel format of the texture */
        int access;                 /**< SDL_TextureAccess */
        int w;                      /**< The width of the texture */
        int h;                      /**< The height of the texture */
        int modMode;                /**< The texture modulation mode */
        SDL_BlendMode blendMode;    /**< The texture blend mode */
        Uint8 r, g, b, a;           /**< Texture modulation values */
     
        SDL_Renderer *renderer;
     
        /* Support for formats not supported directly by the renderer */
        SDL_Texture *native;
        SDL_SW_YUVTexture *yuv;
        void *pixels;
        int pitch;
        SDL_Rect locked_rect;
     
        void *driverdata;           /**< Driver specific texture representation */
     
        SDL_Texture *prev;
        SDL_Texture *next;
    };

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    Ah zut, je me fiais uniquement à l'IDE, (code::blocks) qui d'habitude me liste tout ça.

    Merci !

    Néanmoins j'ai quand même un problème, si j'essaye d'accéder à texture->w par exemple il me marque ceci :

    error: dereferencing pointer to incomplete type

    Etrange... Je procédais ainsi avant.

  4. #4
    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
    Un bout de code me serait plus utile ,la je vais devoir supposé.

    Donc si tu ne met pas texture en pointeur c'est normal (cf revoir les pointeurs).

  5. #5
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    J'oubliais de préciser, je code en C.

    Voilà un début de fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    /* Découpe une image en frame */
    void cuttingTexture(SDL_Texture *texture)
    {
        int i = texture->w;
    }
    Elle ne fait pas encore son travail car je voulais juste tester pour le moment si je pouvais récupérer la taille.

    Texture est bien déclaré en pointeur. Et malgré tout j'ai cette erreur...

  6. #6
    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
    N'oublie pas de mettre les balise CODE.
    Ah effectivement , j'ai pas la SDL2 mais en regardant de plus prés en faite erreur dit grosso modo qu'il ne connait pas la structure externe de SDL_Texture , donc ne sait pas a quoi correspond w.
    Si tu veux connaitre w et h , il faut lui indiquer la structure donc :

    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
     
    struct SDL_Texture
    {
        const void *magic;
        Uint32 format;              /**< The pixel format of the texture */
        int access;                 /**< SDL_TextureAccess */
        int w;                      /**< The width of the texture */
        int h;                      /**< The height of the texture */
        int modMode;                /**< The texture modulation mode */
        SDL_BlendMode blendMode;    /**< The texture blend mode */
        Uint8 r, g, b, a;           /**< Texture modulation values */
     
        SDL_Renderer *renderer;
     
        /* Support for formats not supported directly by the renderer */
        SDL_Texture *native;
        void *yuv; // chez moiil connait pas la struture SDL_SW_YUVTexture 
        void *pixels;
        int pitch;
        SDL_Rect locked_rect;
     
        void *driverdata;           /**< Driver specific texture representation */
     
        SDL_Texture *prev;
        SDL_Texture *next;
    };
     
    /* Découpe une image en frame */
    void cuttingTexture(SDL_Texture *texture)
    {
    int i = texture->w;
    }

  7. #7
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    Pourquoi on ne devait pas faire ça avant ?
    En gros je peux l'intégrer avec un extern si je sais dans quel fichiers elle se trouve ?

    Du coup, me conseille-tu que je fasse de même pour toutes mes structures que je crée ?(les indiquer avec un extern si je les utilise ailleurs).

    Merci à toi !

  8. #8
    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 VampireGirl Voir le message
    Pourquoi on ne devait pas faire ça avant ?
    Avant quoi ?

    Citation Envoyé par VampireGirl Voir le message
    En gros je peux l'intégrer avec un extern si je sais dans quel fichiers elle se trouve ?

    Du coup, me conseille-tu que je fasse de même pour toutes mes structures que je crée ?(les indiquer avec un extern si je les utilise ailleurs).
    extern ? je sais c'est quoi extern , mais je vois pas pourquoi tu m'en parle , extern permet d'étendre une variable global a tout tes fichiers.

    Alors quand soit bien d'accord quand tu fais ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct SDL_Texture
    {
     //variable
    };
    Tu ne déclare aucune variable , tu dis juste au compilateur "hé ma Struture SDL_Texture et rangée comme je te indique".
    Pour le problème de texture->w , le compilo dis grosso modo " a quoi correspond w ?" , parce la lib SDL2 ne possède pas la définition de cette Structure (la structure de SDL_Texture je l'ai trouvé sur le code source de la SDL2 je précise).

    Maintenant ben le mieux c'est de créer peut être un SDL_texture.h par exemple et tu mettrais La structure SDL_Texture comme je te l'ai indiqué.

    PS: ah oui j'ai dis externe ou lieu de interne , une faute de ma part

  9. #9
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    Avant quoi ?
    Avec SDL 1.2 je n'avais pas ce problème.

    extern ? je sais c'est quoi extern mais je vois pas pourquoi tu m'en parle , extern permet de étendre une variable global a tout tes fichiers.
    extern ne sert que pour les variables globales ? Il me semblait que j'avais vu quelque part que l'on indique extern quand une fonction ou autre vient d'un autre fichier. Ce n'est pas le cas ?

    Tu ne déclare aucune variable , tu dis juste au compilateur "hé ma Struture SDL_Texture et rangée comme je te indique".
    Pour le problème de texture->w , le compilo dis grosso modo " a quoi correspond w ?" , parce la lib SDL2 ne possède la définition de cette Structure (la structure de SDL_Texture je l'ai trouvé sur le code source de la SDL2 je précise).
    Pour les structures je sais, mais je pensais que le structure SDL_Texture existait dans un header de SDL 2.0.

    Pourquoi n'est-ce pas le cas ? Je trouve ça vraiment étrange...

  10. #10
    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 extern tu peux l'indiquer pour une fonction mais c'est facultatif.

    Sinon pour répondre a des tes 2 questions , non il n'y est pas dans le header de la SDL2.0 , et donc ça répond pourquoi sur SDL1.2 il y 'était parce que justement SDL_Surface se trouvais dans le header de SDL1.2.

    Après pourquoi il n'y est pas aucune idée , c'est pas moi qui est créer la lib et vu que je compte pas utiliser SDL2.0 c'est pas trop mon souci .

  11. #11
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    Ok merci !

    Simple autre question, dans quel fichier as-tu trouvé la structure dans les sources de SDL ?

    EDIT : ça va j'ai trouvé Mais c'est super étrange... Je me demande vraiment pourquoi ils ne le mettent pas simplement dans un header de la lib

  12. #12
    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
    ok si t'as pu trouvé ou se trouve la structure, donc problème résolu ?

  13. #13
    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,

    @Kannagi : au lieu de lire les header, on commence par la documentation officielle , les headers, c'est bien lorsque l'on a pas de documentation.

    En fait, les w/h n'ont pas à être visible pour le programmeur. Le contenu de la structure de SDL_Texture doit être complètement opaque au programmeur et l'une des techniques pour ce faire, c'est simplement de ne pas inclure les fichiers définissant le contenu de la structure.

    J'avais un peu expliqué le principe ici : http://alexandre-laurent.developpez....fenetres/#LVII

    La bonne méthode pour récupérer la largeur et hauteur est d'utiliser :
    http://wiki.libsdl.org/SDL_QueryTexture
    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.

  14. #14
    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
    Ha ha j'avoue que j'aurais du lire la doc officiel et effectivement j'aurais du me douter qu'il faudrait passer par d'autre fonction pour pouvoir récupérer cs infos.

  15. #15
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    Bonsoir !

    Merci LittleWhite pour l'info !

    J'aurais quelques questions néanmoins.

    Voici ma fonction qui découpent des sprites :

    http://pastebin.com/cD4w8Jwr

    Si je n'alloue pas dynamiquement la mémoire pour src, j'ai accès aux images et ça marche, mais ça n'est pas logique car normalement il faut que j'ai autant de SDL_Rect que de sprites !

    En gros quand je blitte, tout ce que j'ai c'est un écran sans images...

    Voici le constructeur du joueur et sa structure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef struct
    {
        SDL_Texture *sprite;
        SDL_Rect *src;
        SDL_Rect dst;
    } Player;
    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
    /* Crée le joueur */
    Player* createPlayer(const char *sprite)
    {
        Player *player = NULL;
     
        if((player = SDL_malloc(sizeof(Player))) == NULL)
        {
            fprintf(stderr, "Erreur lors de l'allocation dynamique pour player.");
            cleanUp(renderer, window);
            exit(EXIT_FAILURE);
        }
     
        player->sprite = createTexture(sprite);
        cuttingTexture(player->sprite, player->src, 16, 16);
        initRect(&player->dst, 0, 0, 16, 16);
     
        return player;
    }
    Qu'est-ce qui ne va pas ?

    EDIT :

    Je viens de tester avec SDL 1.2 et je n'ai pas de problème. Voilà 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
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    /* Découpe une image en frames */
    SDL_Rect* cuttingSurface(SDL_Surface *surface, int wFrame, int hFrame)
    {
        int frameCounter = 0;
        int x, y;
        int frameNumber = ((surface->w * surface-> h)/(wFrame * hFrame));
        SDL_Rect *src = NULL;
     
        if((src = malloc(frameNumber * sizeof(SDL_Rect))) == NULL)
        {
            fprintf(stderr, "Erreur lors de l'allocation dynamique de src.");
            exit(EXIT_FAILURE);
        }
     
        for(y = 0; y < surface->h; y += hFrame)
        {
            for(x = 0; x < surface->w; x += wFrame)
            {
                src[frameCounter].x = x;
                src[frameCounter].y = y;
                src[frameCounter].w = wFrame;
                src[frameCounter].h = hFrame;
     
                frameCounter++;
            }
        }
     
        return src;
    }
    Pourquoi ça ne fonctionne pas avec SDL 2.0 ?

  16. #16
    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
    Pourquoi src est un pointeur dans votre structure, ça n'a pas de sens. En plus vous ne lui allouer pas de mémoire à ce pointeur.
    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.

  17. #17
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    LittleWhite, c'est un pointeur justement pour le faire pointer vers une mémoire allouée via la fonction cutting.

    Je l'ai fait en SDL 1.2 ça marche parfaitement.

  18. #18
    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
    Quel est le bogue précisément ?
    Un crash ? Un défaut d'affichage ?
    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.

Discussions similaires

  1. Obtenir la taille d'une vue matérialisée
    Par sissi_2012 dans le forum SQL
    Réponses: 0
    Dernier message: 23/01/2012, 23h12
  2. OpenGL calculer la taille d'une texture en memoire
    Par Pinokio3x7 dans le forum OpenGL
    Réponses: 3
    Dernier message: 03/04/2010, 09h28
  3. Obtenir la taille d'une variable
    Par devtroll dans le forum Langage
    Réponses: 6
    Dernier message: 04/08/2008, 15h55
  4. Obtenir la taille d'une image chargée
    Par Invité dans le forum Flash
    Réponses: 9
    Dernier message: 15/11/2006, 05h34
  5. select pour obtenir la taille de remplissage d'une bdd
    Par sqlakf76 dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 15/07/2005, 13h44

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