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 :

Transparence de pixel


Sujet :

SDL

  1. #1
    Futur Membre du Club
    Inscrit en
    Avril 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 12
    Points : 5
    Points
    5
    Par défaut Transparence de pixel
    Salut à tous,

    Je suis en train de faire un système de playfield et de reconstruction en ligne et en colonne, bla bla, on s'en fout.

    J'ai un problème avec la transparence des pixels (d'où le titre).
    Pour construire mon playfield, j'utilise des tiles. Ces tiles proviennent d'une SDL_Surface appelé tileset. Jusque là tout va bien.
    J'ai mis une couleur de transparence à mon tileset (le rose).
    Je construis mon playfield à l'aide du tileset, et je l'affiche sans problème. De plus les tiles qui possèdent du rose sont bien transparente.

    Le problème survient quand je redessine un tile sur un tile existant. Ils se superposent au lieu de se substituer.
    En gros, j'ai un tile avec le dessin d'un plus qui doit se transformer en croix, malheureusement, ils se superposent pour donner une étoile à 8 branches.

    Bref, ma question est : Comment supprimer un pixel (ou le rendre transparent)?

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Pourquoi ne pas par exemple effacer ton playfield à chaque frame ?
    Ou encore coller tes tiles sans transparence, et n'appliquer celle-ci que lorsque tu colles ton playfield sur la surface principale ?

  3. #3
    Futur Membre du Club
    Inscrit en
    Avril 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    En fait ce que je cherche à faire, c'est de remplacer simplement une bande de tiles (par exemple une colonne) lorsque le playfield se déplace.
    L'intérêt, c'est d'améliorer les perfomances en ne mettant à jour que ce qui est nouveau à l'écran.
    Si je redessine tout, j'ai plus qu'à mettre mon algo aux toilettes .

  4. #4
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    Tu peux redessiner que la partie qui t'intéresse.
    Mais actuellement les cartes graphiques sont assez puissantes pour ne pas s'occuper de ce genre de détail.
    La méthode à Laurent fonctionne très bien.

  5. #5
    Futur Membre du Club
    Inscrit en
    Avril 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Je me doute bien que ce n'est pas le fait de redessiner entièrement mon playfield au lieu d'une petite partie qui va foutre en l'air mon nombre d'images par seconde.
    Mais mon moteur n'est pas destiné à tourner sur un PC mais sur Nintendo DS. Comme les émulateurs de NDS ne sont pas très performant, je code en SDL/C++ avant de transposer tout pour la NDS. Pour les tests et le débuggage, c'est plus simple sur PC.

  6. #6
    mat.M
    Invité(e)
    Par défaut
    Citation Envoyé par Selkione
    Salut à tous,

    Je suis en train de faire un système de playfield et de reconstruction en ligne et en colonne, bla bla, on s'en fout.
    Est-ce que tu peux utiliser une terminologie en bon français merci ?
    Parce que "playfield" cela ne me dit rien.

    La méthode de Laurent encore une fois est la bonne ;
    Sinon il faut 2 tableaux de tuiles j'ai été confronté à ce problème pour mon projet.
    IL faut un tableau des tuiles courantes de l'images et un autre,constant, qui lors du rafraichissement écrasera les anciennes

    Citation Envoyé par Selkione
    En fait ce que je cherche à faire, c'est de remplacer simplement une bande de tiles (par exemple une colonne) lorsque le playfield se déplace.
    L'intérêt, c'est d'améliorer les perfomances en ne mettant à jour que ce qui est nouveau à l'écran.
    Si je redessine tout, j'ai plus qu'à mettre mon algo aux toilettes .
    Ce n'est pas jouable sinon tu vas avoir des problèmes d'affichage.
    Il faut remettre à jour tout l'écran

  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 : 43
    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 Selkione
    En fait ce que je cherche à faire, c'est de remplacer simplement une bande de tiles (par exemple une colonne) lorsque le playfield se déplace.
    L'intérêt, c'est d'améliorer les perfomances en ne mettant à jour que ce qui est nouveau à l'écran.
    Si je redessine tout, j'ai plus qu'à mettre mon algo aux toilettes .
    Si tu cherches à ne redessiner pas le tout en principe ce que tu devrais faire est travailler avec un tampon supplémentaire.

    - Tu effaces le tampon.
    Lorsque tu bouges, tu fais une copie de la portion de l'écran que tu souhaites garder en décalant bien sûr comme tu veux (vers la gauche si le joueur va vers la droite, etc.).
    - Ensuite tu dessines sur le tampon les tuiles manquantes.
    - Tu fais le blit sur l'écran

    Remarque que ceci demande de mettre à zéro le tampon (donc on aurait pu mettre l'écran à zéro), faire une copie surface écran vers surface tampon et après dans l'autre sens.

    Ceci n'est que valable si :
    - Ton affichage se fait avec des multipasses
    - Le fait de chercher les tuiles et les copier prend beaucoup de temps

    Sinon la méthode de Laurent semble être la mieux.

    Il faut se dire que dans ton cas, la méthode naïve n'est pas forcément mauvaise et est plus ou moins indépendante au reste du programme. Si cela posera vraiment un problème, alors tu pourras modifier l'affichage plus tard.

    Jc

  8. #8
    Futur Membre du Club
    Inscrit en
    Avril 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Merci à tous pour vos réponses. Je crois qu'effectivement la méthode de laurent est la bonne.

    Citation Envoyé par Laurent Gomila
    Ou encore coller tes tiles sans transparence, et n'appliquer celle-ci que lorsque tu colles ton playfield sur la surface principale ?
    J'avais mis ma transparence sur le tileset et non sur le playfield. C'est pouquoi j'avais ce chevauchement.
    J'ai corrigé ça. Mais le playfield ne devient pas transparent. Pourtant je lui ai appliqué la même couleur de transparence (c'est à dire toujours le rose (0xff,0x00,0xff)) mais lors du blit de ce playfield sur la surface principal, j'ai des gros patés rose partout.

    J'ai fait des tests de comparaison entre les valeurs de pixels et la couleur de transparence, elles ont exactement la même valeur...

  9. #9
    Futur Membre du Club
    Inscrit en
    Avril 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Ca y est le problème est résolu.

    Je n'avais pas le même format entre mon tileset et mon playfield.
    Il suffisait donc de transformer le playfield dans le même format que le format d'affichage (DisplayFormat):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    //The image that's loaded
    SDL_Surface* loadedImage = NULL;
     
    //Load the image
    loadedImage = SDL_CreateRGBSurface( SDL_SWSURFACE, nbTileW * tileWidth, nbTileH * tileHeight, 32, 0xff000000, 0x00ff0000, 0x0000ff00, 0x000000ff );
     
    //Create an optimized surface
    this->monPlayfield = SDL_DisplayFormat( loadedImage );
     
    //Free the old surface
    SDL_FreeSurface( loadedImage );
    Donc ma transparence est uniquement sur mon playfield et plus du tout sur mon tileset.

    Merci à tous!

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

Discussions similaires

  1. Vérifier la transparence d'un pixel
    Par maxous77 dans le forum XNA/Monogame
    Réponses: 8
    Dernier message: 22/12/2010, 22h19
  2. Transparence de pixels
    Par soeursourire dans le forum Images
    Réponses: 3
    Dernier message: 18/03/2010, 10h46
  3. Pixels transparents d'une image
    Par lisco dans le forum Qt
    Réponses: 5
    Dernier message: 03/06/2009, 14h59
  4. Rendre transparent des pixels
    Par rambc dans le forum Calcul scientifique
    Réponses: 2
    Dernier message: 29/04/2009, 23h49
  5. Rendre un pixel semi-transparent
    Par Electroniktor dans le forum OpenCV
    Réponses: 4
    Dernier message: 11/07/2008, 10h23

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