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 :

Precision sur les methode de transparence


Sujet :

SDL

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

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 084
    Par défaut Precision sur les methode de transparence
    Bonjour,

    Alors voila, j'explique mon problème.
    Je me suis mis à la sge et je teste pour l'instant les rotation.
    Je vais donc voir la doc et les exemple.

    Je trouve mon bonheur avec sge_transforme ( et avec une autre sge_transforme_surface. cependant, je veux n'utiliser que la première).

    Je commence les test et tout va bien, je comprend ce que je fait jusqu'à ce que j'arrive a la gestion de transparence.
    Lorsque j'utilise la fonction, la transparence n'est plus gerer ( la transparence est correctement défini au chargement avec SDL_SetColorKey ).

    Voici le code :

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
     
    int main(int argc, char** argv)
    {
    	SDL_Init(SDL_INIT_VIDEO);
     
        SDL_Surface *ecran = SDL_SetVideoMode(300, 300, 32, SDL_SWSURFACE);
        SDL_Surface *tux = SDL_LoadBMP("tux.bmp");
        SDL_SetColorKey(tux, SDL_SRCCOLORKEY, SDL_MapRGB(tux->format, 0, 0, 255));
     
    	Uint32 couleurBlanc = SDL_MapRGB(ecran->format,255,255,255);
     
    	SDL_Event event;
     
    	int angle=1;
     
    	do{
     
    		angle+=2;
    		if(angle>=360)
    			angle=1;
     
            // On sort de la boucle
    		if (SDL_PollEvent(&event)==1 && event.type==SDL_QUIT)
                break;
     
    		SDL_FillRect(ecran, 0, couleurBlanc);
     
            // La transparence est gerer.
            SDL_BlitSurface(tux,NULL,ecran,NULL);
     
     
    // Voici le prototype, il renvoie un SDL_Rect.
    //SDL_Rect sge_transform(SDL_Surface *src, SDL_Surface *dst,float angle, float xscale
    //                        , float yscale ,Uint16 px, Uint16 py, Uint16 qx, Uint16 qy, Uint8 flags);
     
            // La transparence n'est plus gerer...
    		sge_transform(tux, ecran, angle, 1, 1, tux->w/2,tux->h/2, 150,150, SGE_TTMAP);
     
            SDL_Flip(ecran);
     
    	}while(true);
     
     
    	SDL_FreeSurface(tux);
    	SDL_Quit();
     
    	return 0;
    }




    En cherchant un post traitant du même cas que le miens , j'ai lu qu'il y avait trois manière de définir une transparence ( colorkey, pixel par pixel et global ). Je voudrais savoir qu'elles sont ces trois méthode, comment les emploies t'ont ? quelle sont leur différence et effet sur le code ... bref un peu tout ...

    merci d'avoir lu mon post.

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    Salut,

    le colorkey consiste à dire qu'une couleur est transparente pour une surface.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SDL_SetColorKey(surface,SDL_SRCCOLORKEY,color)
    l'alpha sert à dire qu'une surface a un 'tel' degré de transparence

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SDL_SetAlpha(surface, SDL_SRCALPHA,alpha)
    La transparence pixel par pixel, c'est accéder à un pixel de la surface et lui donner un certain degré de transparence. (un pixel est sur 32 bits, 8 bits pour chaque couleur et 8 bits pour la transparence)

    J'ai regardé le source de sge, il ne s'occupe pas du tout du colorkey.
    Et il ne s'occupe pas de la transparence générale.

    Ce qu'il faut faire, dans ton cas, c'est créer une surface de destination qui a le même colorkey que ta surface source, et effectuer la transformation sge de ta source vers la destination, puis blitter la surface de destination sur l'écran (ça vaut le coup de tenter).

    Sinon, à mon avis, utiliser SDL_gfx sera plus simple et plus performant...
    Tu peux aussi essayer de faire une fonction qui convertit ta transparence par colorkey en transparence pixel par pixel, et l'appliquer sur la surface source.

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

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 084
    Par défaut
    Merci de ces précisions.

    En fait, ce que tu mas dit peut fonctionner avec sge_transform_texture qui lui retourne une surface. A partir de la surface recuperer, on peut definir SDL_colorkey puis blitter.
    cependant, contrairement a la fonction sge_transforme, sge_transforme_texture ne demande pas le point de pivot et ne retourne pas la position en x et en y. C'est pourquoi je voulais absolument sge_transforme.

    Bref, je pense qu'il va falloir soit que je bidouille sge_transforme soit que je fasse plein de petit calcul pour retrouver ce que je veux.

    Encore merci pour tes réponses ^^

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    Tu peux créer une nouvelle surface via SDL_CreateRGBSurface,
    la remplir avec la couleur du colorkey,
    lui appliquer SDL_SetColorkey,
    faire sge_transform vers cette surface,
    puis la blitter sur l'écran?

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

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 084
    Par défaut
    Non, ce n'est pas possible car sge_transforme blit de lui même directement l'image. sge_transforme ne retourne qu'un SDL_Rect.
    J'ai abandonne car j'ai l'impression que ce que je veux est impossible pour mon niveau.

    J'avais penser a soit modifier la fonction sge_transforme directement ( mais je crois avoir été trop présomptueux de mes capacité, soit utiliser la transparence pixel par pixel mais apparemment elle ne s'utilise pas comme je le pensais ... ).

    Je suis donc passer a OpenGl car apprendre la sfml serai trop pour moi. Je pense qu'opengl va pouvoir m'aider sur ce plan la.

    Merci pour tes réponse et ton attention, mais a moins qu'on m'indique comment modifier sge_transforme ou me donne d'autre piste, ce sujet et clos pour moi.

  6. #6
    Membre Expert
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 582
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 582
    Par défaut
    Citation Envoyé par SofEvans Voir le message
    apprendre la sfml serai trop pour moi.
    deux heures c'est trop ?
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  7. #7
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    Citation Envoyé par SofEvans Voir le message
    Non, ce n'est pas possible car sge_transforme blit de lui même directement l'image. sge_transforme ne retourne qu'un SDL_Rect.
    Je suis conscient que sge_transform blitte directement l'image.

    Mais ce que je ne comprends pas, c'est pourquoi tu ne peux pas créer une nouvelle surface, et blitter en transformant ton ancienne surface vers ta nouvelle surface, et blitter la surface transformée sur l'écran ensuite?

    Ca donnerait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        SDL_Surface *ecran = SDL_SetVideoMode(300, 300, 32, SDL_SWSURFACE);
        SDL_Surface *tux = SDL_LoadBMP("tux.bmp");
        Uint32 bleu = SDL_MapRGB(ecran->format,0,0,255);
        SDL_SetColorKey(tux, SDL_SRCCOLORKEY, bleu);
        //On cree la nouvelle surface
        SDL_Surface *nouvelle_surface =  SDL_CreateRGBSurface(SDL_SWSURFACE, 300,300,32,0,0,0,0);
        SDL_FillRect(nouvelle_surface, NULL, bleu);
        SDL_SetColorKey(nouvelle_surface, SDL_SRCCOLORKEY, bleu);
        //et sge_transform!
        sge_transform(tux, nouvelle_surface, angle, 1, 1, tux->w/2,tux->h/2, 150,150, SGE_TTMAP);
        //Puis le blit!
        SDL_BlitSurface(nouvelle_surface, NULL, ecran);
        SDL_Flip(ecran);
        //Ne pas oublier de liberer nouvelle_surface plus tard...
    Le code ci-dessus marche-t-il ou pas?

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

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 084
    Par défaut
    Bonsoir,

    Apparement, certaine personne ont était pique au vif. désolé, mais apprendre le C++, opengl, finir la sdl, comprendre la POO, le VBA, le Pascal, ben ça fait beaucoup, alors la SFML attendra ... un certain temps ( Je verrais plus tard, promis ).

    Bref, en fait :

    Ta méthode marche parfaitement coyotte507 ( en fait, c'est celle que j'utilise ^^) , le seul problème et que l'on ne sait pas ou la blitter.
    Alors, on peut mettre des astuces : calculer la hauteur et la largeur de la surface puis faire en sorte que la nouvelle surface soit centrer et fasse les même dimension que celle d'origine.
    Problème : le sprite doit absolument être carrée et le point de rotation sera forcement au milieu ... ( Tout du moins, je n'arrive pas a faire en sorte de faire autrement ). Or, l'image que je charge n'est qu'un bras avec une arme pour faire un mini "metal-slug". Donc avec sge_transforme_surface, le sprite doit être de dimension énorme par rapport a ce qu'il faut ( par exemple : 64x64 au lieu de 20x36 ).

    Je sais pas si je suis bien clair mais voila pourquoi je voulais vraiment blitter en transparence avec sge_transforme car celle-ci résout tout les problème.

    Merci d'avoir lu.
    A bientôt.

  9. #9
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    Désolé si j'ai pu paraître piqué au vif

    Dans mon exemple j'ai du faire nouvelle_surface de la même taille que l'écran pour pas que l'on ait besoin de s'embêter à calculer les nouvelles coordonnées (vu que la position de l'image transformée dans nouvelle_surface sera alors la même que si l'on avait directement transformé dans l'écran, il suffit de faire un blit simple...). Mais utiliser une surface de si grande taille n'est pas idéal au final.

    Sinon, es-tu sûr que dans le contexte où tu travailles, tu ne peux pas plutôt faire des animations "préprogrammées", parce que c'est beaucoup plus léger pour l'ordinateur que de faire des rotations et des zoom à répétition?

    Bref, bonne chance avec opengl!

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

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 084
    Par défaut
    Salut ^^

    Ce n'était pas de toi que je parlais coyotee507 ( en plus c'était une boutade ) mais de l'administrateur qui me dit que 2 heure me suffiront pour SFML ( je suis pas con mais j'ai pas 210 de Q.I quand meme ).

    En fait, comme tout les débutant ( enfin je pense ), je vois les chose en grand.
    C'est pour ça que je veux juste un sprite d'un seul bras afin de l'orienter dans toutes les directions (pour faire plus réaliste).
    Enfin, cette idee va rester en suspens pendant quelque temps. Peut etre qu'avec plus d'experience, je trouverai une solution plus simple ou tout simplement je pourrais faire des calcul afin de faire comme sge_transform.
    Bref, merci du soutien, j'ai beaucoup apprecier.

    edit : erroné ! Désolé ... la suite est plus bas ...

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

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 084
    Par défaut
    OH MY GOD !!!!!!!!!

    Merdeuh, j'ai raconter que de la merde !!!!!
    Désole coyotte507, ton code fonctionne nickel ( j'ai pas encore compris ni comment, ni pourquoi mais je vais m'attabler dessus maintenant).
    J'avais fais une faute idiote en copiant ton code .

    Merci beaucoup !!!!!!!!

    Je mets ce post en résolue !

    Encore merci

    z'etes des dieu ( pour moi, pauvre novice que je suis ^^ )

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 20/10/2006, 15h07
  2. Precision sur les transformations
    Par jcloupgarou dans le forum Développement 2D, 3D et Jeux
    Réponses: 7
    Dernier message: 12/07/2006, 09h02
  3. Précision sur les ListBox
    Par SebRs dans le forum Windows
    Réponses: 5
    Dernier message: 04/05/2006, 16h38
  4. precision sur les fichiers
    Par ghostdog dans le forum C
    Réponses: 3
    Dernier message: 20/12/2005, 11h23
  5. [VBA-E]Demande de précision sur les menus
    Par geffdenimes dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 25/06/2003, 10h46

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