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 :

copie d'image et perte de transparence.


Sujet :

SDL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Septembre 2003
    Messages
    391
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 391
    Par défaut copie d'image et perte de transparence.
    Bonjour,
    je suis confronté a un probleme, j'utilisait jusqu'a maintenant le noir comme couleur de transparence, seulement j'ai decidé de changer pour le rose (255,0,255).
    Mon code semblait bien marcher (le noir etait bien transparent)
    mais plus maintenant. (mon rose apparait noir au lieu de transparent)
    Je vous explique ce que fait mon code : je charge 4 fichiers bmp dans une surface.
    avant tout il faut que je precise que si je charge un seul fichier ca marche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	item_tile=load_image( "data/IT.bmp" ); // items
    	return;
    mais si je fais :
    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
    //	item_tile=load_image( "data/IT.bmp" ); // items
    //	return;
     
    	tmp_tile=SDL_CreateRGBSurface(SDL_HWSURFACE, 274 , 1088, 32, 0, 0, 0, 0);
    	SDL_SetColorKey( tmp_tile, SDL_RLEACCEL | SDL_SRCCOLORKEY, SDL_MapRGB( screen->format, 255, 0, 255) );
    	item_tile = SDL_DisplayFormat( tmp_tile ); // optimise
    	//Si la surface a bien été optimisée
    	if( item_tile != NULL )
            {	//Libération de l'ancienne image
    			SDL_FreeSurface( tmp_tile );		
    		}
    		else
    		{	item_tile=tmp_tile; // si pas optimisé, pas grave on prend l'image comme ca...
    		}
     
    	loadbloc(item_tile,"IT.bmp",0); // basic blocs
    	loadbloc(item_tile,"IT1.bmp",1); // ext blocs
    	loadbloc(item_tile,"IT2.bmp",2); // les ennemies commencent a 128!
    avec la fonction loadbloc qui s'occupe de copier mon fichier dans mon image :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    bool level::loadbloc(SDL_Surface* dest,std::string fichier,Uint8 pos)
    {
     
    	SDL_Surface*tmp_tile= load_image( "data/"+fichier );
    	if (tmp_tile==NULL) return false;
    	apply_surface(0,pos*272,tmp_tile,dest,NULL);
    	SDL_FreeSurface(tmp_tile);
    	return true;
    }
    LA fonction load_image est la classique fonction (j'en ai essayé des plus ou moins optimisé mais ca ne change rien, de toute maniere elle n'est pas en cause car ca marche quand on charge sans copier), j'ai pas oublié de definir la couleur de transp dans cette fonction.

    J'en arrive a ma question : pourquoi quand je copie (apply_surface) ca ne copie pas ma couleur de transparence ? => pire même... mon rose apparait NOIR a l'ecran !

    note :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void apply_surface( int x, int y, SDL_Surface* source, SDL_Surface* destination, SDL_Rect* clip = NULL )
    {
        SDL_Rect offset;
     
        offset.x = x;
        offset.y = y;
     
        //On blitte la surface
        SDL_BlitSurface( source, clip, destination, &offset );
    }
    Merci de votre aide. montrez-moi comment copier une image...

  2. #2
    Membre éclairé
    Inscrit en
    Septembre 2003
    Messages
    391
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 391
    Par défaut
    il transforme mon rose en noir !!
    en effet, j'ai ajouter la ligne suivante avec mes appel "loadbloc"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SDL_SetColorKey( item_tile, SDL_RLEACCEL | SDL_SRCCOLORKEY, SDL_MapRGB( screen->format, 255, 0, 255) );
    pour bien lui redire de prendre le rose en tant que transparent... rien a faire,
    mais par contre si je change 255,0,255 en 0,0,0 alors j'ai bien du transparent. mais ca ne me va pas, car il rend tout le noir transparent (j'ai des objet avec du noir c'est justement pour celà que j'ai pris le rose).
    Merci de votre aide, c'est trop pour moi

  3. #3
    Expert confirmé

    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 : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par hpfx Voir le message
    J'en arrive a ma question : pourquoi quand je copie (apply_surface) ca ne copie pas ma couleur de transparence ? => pire même... mon rose apparait NOIR a l'ecran !
    Ceci est tout à fait logique.

    tmp_tile=SDL_CreateRGBSurface(SDL_HWSURFACE, 274 , 1088, 32, 0, 0, 0,
    Attention comment tu initialise les masques RGB, normalement on fait ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #if SDL_BYTEORDER == SDL_BIG_ENDIAN
        rmask = 0xff000000;
        gmask = 0x00ff0000;
        bmask = 0x0000ff00;
        amask = 0x000000ff;
    #else
        rmask = 0x000000ff;
        gmask = 0x0000ff00;
        bmask = 0x00ff0000;
        amask = 0xff000000;
    #endif
    Ensuite, l'image est en noir par défaut.

    Du coup lorsque tu fais ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	apply_surface(0,pos*272,tmp_tile,dest,NULL);
    Les pixels transparents prennent la couleur de la surface destination donc noir.

    Par contre, tu perds la transparence... La facon pour t'en sortir serait d'ajouter un appel SDL_FillRect sur la surface après l'appel SDL_CreateRGBSurface.

    Par contre, je ne comprends pas pourquoi tu te prends tellement la tête... Pourquoi ne pas juste retourner la surface donner par IMG_Load ?
    Ensuite tu utilises à chaque fois l'image source item_title, cela ne me semble pas logique ?

    Jc

  4. #4
    Membre éclairé
    Inscrit en
    Septembre 2003
    Messages
    391
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 391
    Par défaut
    Bonsoir,
    merci pour tes réponses,
    maintenant j'ai compris pourquoi ca ne marchais pas, j'ai remplie ma surface "receptrice" avec du rose, avant d'y copier mes images, comme ca c'est ok.

    par contre j'ai pas compris ces histoires de mask... j'avoue que j'avais pas internet le jour ou j'ai eut besoi nde créer une surface à la main. il ne faut pas metre zero ? mais a quoi ca sert en fait ?

    Pourquoi ne pas juste retourner la surface donner par IMG_Load ?
    Parceque IMG_load va me renvoyer que ce qu'il y a dans le fichier.
    en fait j'ai 4 fichiers (de 8 par 8 sprites) que je veux avoir dans une seule surface. donc je suis bien obligé de faire en 2 etapes : loader puis copier (au bon endroit pour ne pas ecranser les autres sprites).

    pourquoi ? : parceque je veux pouvoir combiner des tileset (le 1er est celui de base, plus 3 optionels, pour varier les environements, l'un d'entre eux sera dedié à l'eau par exemple....) et dans le jeu je les assemble dans une seule surface de 256 sprites (tiles).

Discussions similaires

  1. Réponses: 6
    Dernier message: 28/02/2006, 21h21
  2. [Sécurité] Bloquer la copie d'images
    Par Pascal Lob dans le forum Langage
    Réponses: 6
    Dernier message: 14/10/2005, 22h29
  3. [IMAGE][RESIZE] perte de qualité
    Par jlbinfo dans le forum 2D
    Réponses: 4
    Dernier message: 06/08/2005, 11h13
  4. Image GIF a fond transparent dans un formulaire ?
    Par Coquelicot dans le forum IHM
    Réponses: 4
    Dernier message: 25/10/2004, 12h08
  5. Traitements d'image sur PNG avec transparence
    Par Ingham dans le forum Langage
    Réponses: 16
    Dernier message: 02/08/2004, 16h42

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