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_gfx rotozoom : modifier couleur d'une surface [Autre]


Sujet :

SDL

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2013
    Messages : 33
    Points : 38
    Points
    38
    Par défaut SDL_gfx rotozoom : modifier couleur d'une surface
    Salut !

    Je m'explique. J'ai une image avec fond blanc que je tourne de 90° et que je colle sur une fenêtre de couleur blanche. Le problème c'est qu'après la rotation apparait quelques petits traits noirs. Je me demandais donc s'il était possible de corriger ceci ?

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 371
    Points : 23 626
    Points
    23 626
    Par défaut
    Bonjour,

    On peut voir ton code ?

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2013
    Messages : 33
    Points : 38
    Points
    38
    Par défaut
    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
     
    void Window::determinatePos(Window::Position p, SDL_Surface** s, SDL_Rect* r) {
      SDL_Surface* tmp;
      switch (p) {
        case NORTH:
          r->x = WIDTH / 2 - (*s)->w / 2;
          r->y = 0;
          break;
        case EAST:
          r->x = WIDTH - Card::HEIGHT - SHIFT_SEL_CARD;
          r->y = HEIGHT / 2 - (*s)->w  / 2;
          tmp = rotozoomSurface(*s, -90.0, 1.0, 0);
          SDL_FreeSurface(*s);
          *s = tmp;
          break;
        case SOUTH:
          r->x = WIDTH / 2 - (*s)->w / 2;
          r->y = HEIGHT - Card::HEIGHT - 2 * SHIFT_SEL_CARD;
          break;
        case WEST:
          r->x = 0;
          r->y = HEIGHT / 2 - (*s)->w  / 2;
          tmp = rotozoomSurface(*s, 90.0, 1.0, 0);
          SDL_FreeSurface(*s);
          *s = tmp;
          break;
      }
    }
    s étant déclaré de la sorte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SDL_Surface* s = SDL_CreateRGBSurface(SDL_HWSURFACE, w, h, BPP, 0, 0, 0, 0);
    SDL_FillRect(s, NULL, SDL_MapRGB(s->format, 255, 255, 255));

  4. #4
    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 : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

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

    Essaie en mettant le dernier paramètre de la fonction à 1:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mp = rotozoomSurface(*s, 90.0, 1.0, 1);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    /* SDL_rotozoom.h:
    
    Rotates and zoomes a 32bit or 8bit 'src' surface to newly created 'dst' surface.
     'angle' is the rotation in degrees. 'zoom' a scaling factor. If 'smooth' is 1
     then the destination 32bit surface is anti-aliased. If the surface is not 8bit
     or 32bit RGBA/ABGR it will be converted into a 32bit RGBA format on the fly.
    
    */
    
        DLLINTERFACE SDL_Surface *rotozoomSurface(SDL_Surface * src, double angle, double zoom, int smooth);
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2013
    Messages : 33
    Points : 38
    Points
    38
    Par défaut
    Si je met le paramètre à 1, l'image devient floue et les traits noirs sont toujours présents...

  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
    moi il y a quelque chose qui m'intrigue tu fais
    s c'est un tableau image ?

    Après tu fais un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    (*s)->w
    //...
    rotozoomSurface(*s, 90.0, 1.0, 0);
    plus simple de faire un s[0]->w et s[0] non ?

    Apres je vois un danger la :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void Window::determinatePos(Window::Position p, SDL_Surface** s, SDL_Rect* r) 
    {
      SDL_Surface* tmp;
      switch (p) {
     
        //...
          tmp = rotozoomSurface(*s, 90.0, 1.0, 0);
          SDL_FreeSurface(*s);
          *s = tmp;
          break;
      }
    }
    alors tu libère *s ????
    tu recharge un tableau image a chaque fois ou une image ou quoi ?
    Apres tu fais *s = tmp qui sert a rien.
    C'est plus logique de libérer tmp , d’ailleurs oui il faut le libérer vu que tu ne libère pas.

    bref tu joue avec les pointeurs et j'ai pas impression que tu sais ce que tu fais avec .
    Ah oui je viens de voir que s est un truk tous simple pour quoi alors utiliser un double pointeur et après libère les bonnes SDL_Surface.

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2013
    Messages : 33
    Points : 38
    Points
    38
    Par défaut
    s est un pointeur sur un pointeur de SDL_Surface. C'est pour modifier la valeur du pointeur, sans avoir à le retourner par la fonction, tout simplement.

    s[0] fonctionnerait très bien, certes, mais comme ce n'est pas un tableau, je préfère rester avec ma notation

    Oui *s est libéré (puisque la surface initiale ne me sert plus à rien) et prend la valeur de tmp (la surface modifié). Ce dernier est libéré par la suite, mais c'est plus loin dans le code et je ne l'ai pas posté

  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
    Oh ok peut t'on voir un peu le résultat ?
    Parce que je ne suis jamais tombé sur ce problème.

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2013
    Messages : 33
    Points : 38
    Points
    38
    Par défaut
    Voilà
    Images attachées Images attachées  

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

    Essayez avec une taille de sprite en puissance de 2 (par exemple 32x64, ou autre, mais, donc les deux membres sont des puissances de deux)

    La transformation que fait SDL_gfx_rotozoom fonctionnera mieux, car il pourra matcher tous les pixels.
    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.

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2013
    Messages : 33
    Points : 38
    Points
    38
    Par défaut
    J'ai redimensionné les sprites en 84*122 mais pas de changement

  12. #12
    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 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut
    Lorsque je dis des puissances de 2, c'est 2² / 2³ / 2⁴ / 2⁵ ... , soit 16,32,64,128,256.
    Soit, une taille du genre 64x128
    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.

  13. #13
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2013
    Messages : 33
    Points : 38
    Points
    38
    Par défaut
    Ah oui, excuse moi j'avais lu multiple

    Mais ça va être particulièrement moche si je fais ça... Je pense que je vais plutôt tourner l'image manuellement, l'enregistrer sous un nouveau nom et bliter cette image au lieu d'effectuer des rotozoom

  14. #14
    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 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut
    Oui, avoir les sprites tout prêt dans les quatre rotations, c'est mieux, sachant que les algos de Gimp ou Photoshop sont plus avancés (donc, meilleur ).
    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.

  15. #15
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2013
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2013
    Messages : 33
    Points : 38
    Points
    38
    Par défaut
    Et bien finalement, j'ai trouvé une solution : retourner le sprite, puis le coller sur la surface et non l'inverse. Ainsi, je n'ai plus de bandes noirs !

    Merci pour tout en tout cas !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Couleur pour une surface polygonale
    Par melreg dans le forum Scilab
    Réponses: 2
    Dernier message: 24/03/2009, 17h06
  2. Modifier les couleurs d'une surface
    Par nejm59 dans le forum Scilab
    Réponses: 4
    Dernier message: 22/01/2009, 15h15
  3. Paramétrer la couleur d'une surface 3D
    Par AC88mm dans le forum MATLAB
    Réponses: 2
    Dernier message: 25/04/2008, 00h11
  4. JXTable - Modifier couleur d'une ligne
    Par Lebas dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 05/03/2008, 19h51
  5. Réponses: 2
    Dernier message: 28/08/2007, 16h03

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