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_Surface - Problème de transparence


Sujet :

SDL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 8
    Points : 7
    Points
    7
    Par défaut SDL_Surface - Problème de transparence
    Salut, je voudrais copier un bout de surface dans une autre surface.
    Je fais des sprites donc je charge mon image dans _img.

    Citation
    SDL_Surface *_img;
    _img = IMG_Load("imgs/cerebes.png");


    Plus tard, je découpe mon image et je l'affiche à l'écran.

    Citation
    SDL_BlitSurface(temp, &sprite[REPOS][k], ecran, &pos);


    Le problème c'est que je dois faire des modifications sur mon image et je voudrais la copier dans une SDL_Surface mais je veux que l'image découpé.


    Voici ce que j'ai fait :
    Citation
    SDL_Surface *temp;
    temp = SDL_CreateRGBSurface(_img->flags, sprite[REPOS][k].w,
    sprite[REPOS][k].h _img->format->BitsPerPixel,
    _img->format->Rmask, _img->format->Gmask,
    _img->format->Bmask,
    _img->format->Amask);

    SDL_BlitSurface(_img, &sprite[REPOS][k], temp, &topLeft);
    flipH(temp);
    SDL_BlitSurface(temp, &sprite[REPOS][k], ecran, &pos);


    Le bout de code plus haut fonctionne mais la transparence est perdu.
    Avec IMG_LOAD(); de SDL_Image, la transparence est automatiquement géré. Je crer ma surface temp puis je crer ma surface rgb en lui assignant les propriétés de mon _img. Ma surface temp devient invisible et lorsque j'enlève les masques (_img->format->Amask) alors le fond de mon image est noir au lieu d'être transparent.

    Aidez moi plz - Problème de transparence

  2. #2
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Salut.

    Tout d'abord utilise les balises [code ] et [/code ] (sans l'espace) pour entourer ton code.

    Ensuite:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    temp = SDL_CreateRGBSurface(_img->flags, sprite[REPOS][k].w,
    sprite[REPOS][k].h _img->format->BitsPerPixel,
    _img->format->Rmask, _img->format->Gmask,
    _img->format->Bmask,
    _img->format->Amask);
    Avec SDL_CreateRGBSurface on a souvent des problèmes et donc c'est toujours mieux de faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    temp = SDL_CreateRGBSurface(_img->flags, sprite[REPOS][k].w,
    sprite[REPOS][k].h _img->format->BitsPerPixel,
    0, 0,
    0,0);
    Enfin pour la transparence il suffit d'utiliser SDL_SetAlpha (voir la doc SDL sur www.libsdl.org), si tu veux la mettre dans SDL_CreateRGBSurface je croit qu'il faut rajouter un flag, enfin bref c'est plus compliqué.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    Je ne comprend pas la but de SDL_SetAlpha...
    et j'aimerais savoir comment faire pour connaître la couleur ou les couleurs de transparence je mon fichier loadé avec IMG_LOAD() de SDL_Image et appliquer ce mask transparent à ma surface.

    Merci de vos réponses

  4. #4
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    SDL_SetAlpha permet de définir le niveau de transparence de toute ta surface.

    En fait tu copie ta surface sur temp, mais il faudait que les pixels de temp soient totalement transparents avant de faire ce copiage, comme ça tu auras exactement l'image que tu veux à la fin.

    Sinon tu ne peux pas récupérer les couleurs de transparence de ta surface chargée avec IMG_Load: la transparence est gérée pixel par pixel, pas couleur par couleur.

    En bref ton code devrait être de cette forme-ci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SDL_Surface *temp;
    temp = SDL_CreateRGBSurface(_img->flags, sprite[REPOS][k].w,
    sprite[REPOS][k].h _img->format->BitsPerPixel,0,0,0,0);
     
    SDL_SetAlpha(temp, SDL_SRCALPHA, SDL_ALPHA_TRANSPARENT);
     
    SDL_BlitSurface(_img, &sprite[REPOS][k], temp, &topLeft);
    flipH(temp);
    SDL_BlitSurface(temp, &sprite[REPOS][k], ecran, &pos);

  5. #5
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 076
    Points : 2 328
    Points
    2 328
    Par défaut
    SDL_SetAlpha te permet de rendre transparente toute ta surface.

    Si tu veux ne supprimer qu'une seule couleur, il faut utiliser SDL_SetColorKey

    Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        SDL_Surface *Test1 = SDL_LoadBMP("./Ressources/Asteroid/0.bmp");
        SDL_SetColorKey(Test1, SDL_SRCCOLORKEY , 0xFF00FF);
    Les parametre :

    Test1 : Surface sur laquel on veut appliquer de la transparence
    SDL_SRCCOLORKEY : flag permettant de dire que l'on veut de la transparence
    0xFF00FF : Couleur que l'on souhaite mettre en transparence (ici, elle est en hexadecimal)

Discussions similaires

  1. [ImageList] problème de transparence
    Par Rayek dans le forum Delphi
    Réponses: 7
    Dernier message: 19/05/2006, 11h12
  2. Réponses: 13
    Dernier message: 01/12/2005, 05h34
  3. Réponses: 5
    Dernier message: 18/03/2005, 20h10
  4. [DX9] [Debutant] Problème de transparence :(
    Par SekYo dans le forum DirectX
    Réponses: 5
    Dernier message: 10/09/2004, 14h19
  5. Réponses: 8
    Dernier message: 06/07/2004, 18h30

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