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 :

Sprite sur fond multicolore


Sujet :

SDL

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 90
    Points : 52
    Points
    52
    Par défaut Sprite sur fond multicolore
    Bonjour,
    J'ai un écran affiché, cet écran est une image multicolore.
    Comment puis-je récupérer sous forme d'une surface un petit rectangle situé à l'intérieur de cet écran?
    Mon but est de pouvoir afficher momentanément à l'emplacement de ce petit rectangle une autre image que je pourrais par la suite remplacer par le fond d'écran qu'elle occultait.
    C'est un peu le cas des sprites sauf que ceux dont j'ai trouvé des exemples se déplacent sur un fond uni.
    Ma demande reviendrait donc à pouvoir déplacer un sprite sur une image de fond multicolore.
    Si quelqu'un a une idée, merci d'avance...

  2. #2
    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 : 44
    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 Henri Voir le message
    Bonjour,
    J'ai un écran affiché, cet écran est une image multicolore.
    Comment puis-je récupérer sous forme d'une surface un petit rectangle situé à l'intérieur de cet écran?
    Mon but est de pouvoir afficher momentanément à l'emplacement de ce petit rectangle une autre image que je pourrais par la suite remplacer par le fond d'écran qu'elle occultait.
    C'est un peu le cas des sprites sauf que ceux dont j'ai trouvé des exemples se déplacent sur un fond uni.
    Ma demande reviendrait donc à pouvoir déplacer un sprite sur une image de fond multicolore.
    Si quelqu'un a une idée, merci d'avance...
    Je ne comprends pas vraiment le problème. Tu utilises la couleur de transparence pour afficher un sprite sur un fond, que ce fond soit uni ou non.

    Ensuite, dans le code du rendu, tu affiches le fond puis le sprite. Donc si tu veux ne plus afficher le sprite tu ne le fais pas. Et le fond restera seul afficher...

    Jc

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 58
    Points : 63
    Points
    63
    Par défaut
    La solution proposée au-dessus est sans doute la plus simple.
    Cela dit si tu veux vraiment faire ce que tu as expliqué, tu peux essayer d'effectuer un blit d'un partie de l'écran vers une autre surface.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 90
    Points : 52
    Points
    52
    Par défaut
    Je m'explique, prenons un rectangle-sprite qui occupe la totalité d'un petit rectangle et qui est affiché "par dessus" un écran de fond multicolore. Il y a plusieurs rectangles-sprite de ce genre affichés sur l'écran de fond.
    A un certain moment, je ne veux effacer qu'un seul de ces rectangles-sprite.
    Il n'existe, semble-t-il, à priori qu'une seule façon d'opérer:

    -- Afficher l'écran de fond.
    -- Afficher, par dessus le fond, successivement tous les nouveaux rectangles-sprite à leurs emplacements respectifs.
    Et pour ne supprimer qu'un seul rectangle-sprite, il faut:
    -- Ré-afficher dans sa totalité l'écran de fond.
    -- Ré-afficher les uns après les autres les rectangles-sprites qui doivent rester.

    Et cela ne pose aucun problème...Une seconde solution est cependant envisageable:

    -- Initialement afficher l'écran de fond.
    -- Récupérer, les uns après les autres, dans des "surfaces" les différents rectangles susceptibles d'être recouverts par les rectangles-sprite ainsi que leurs emplacements.
    -- Afficher, par dessus le fond, successivement tous les nouveaux rectangles à leurs emplacements respectifs.
    -- Plus tard, pour le rectangle devant disparaitre, afficher purement et simplement, à son emplacement, le rectangle de fond sauvegardé initialement.

    Cette seconde façon d'opérer semble plus performante surtout dans le cas où le nombre de rectangle est important. Mais, il y a un mais, comment sauvegarder les rectangles de fond dans des "surfaces"?
    J'espère avoir été plus clair...

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Août 2007
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 98
    Points : 87
    Points
    87
    Par défaut
    Je sais pas si je vais bien expliquer mais tu peux utiliser le 2ème paramètre de la fonction blit.

    SDL_BlitSurface(SDL_surface *src, SDL_rect *srcrect,SDL_surface *dest,SDL_rect *dstrect)


    Tu le mets à NULL lorsque tu souhaite bliter toute la surface, en revanche tu peux passer un pointeur vers un SDL_rect de la taille de ton sprite si tu ne veux blitter qu'une partie de ton fond.

    Du coup :

    Tu blittes les portions de fond à la position précédente de tes sprites (effacement des sprites mais sans réafficher tout le fond) qui doivent bouger

    Tu affiches uniquement tes sprites qui doivent bouger.

    Si cela peut aider une portion de code qui j'espere montre l'utilisation du param 2 :
    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
     
     
    /***************************************************************************************/
    /* Efface une piece dont le centre de rotation a pour coordonées piece.positionCentre  */
    /* en blitant par dessus le fond passé en paramètre                                    */
    /*                                                                                     */
    /* Paramètres :                                                                        */
    /*                                                                                     */
    /*      *fond   : image de fond                                                        */
    /*      *piece  : la piece et toutes ses informations                                  */
    /*      *ecran  : fenetre principale dans laquelle on blit                             */
    /*                                                                                     */
    /***************************************************************************************/
     
    void effacerPiece(TypePiece *piece, SDL_Surface *ecran,SDL_Surface *fond){
    	SDL_Rect position;
     
    	int i=0;
     
    	position.w=TAILLE_BLOC;
    	position.h=TAILLE_BLOC;
     
    	for (i=0;i<4;i++) {
    		position.x=(piece->positionCentre.x+piece->piece[i].x)*TAILLE_BLOC+ABSCISSE_FENETRE_JEU;
    		position.y=piece->positionCentre.y+(piece->piece[i].y*TAILLE_BLOC);
     
    		SDL_BlitSurface(fond,&position, ecran, &position);
    	}
    }
    position.w=TAILLE_BLOC et position.h=TAILLE_BLOC définissent la taille de la surface du fond que tu vas blitter (pour toi la taille du sprite).

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 90
    Points : 52
    Points
    52
    Par défaut
    Oui, je pense que vous m'avez mis tous les deux sur la bonne voie. En effet avec SDL_BlitSurface il y a moyen de recopier une portion d'image. Effectivement, je viens d'essayer mais, il y a toujours un mais, j'ai un problème concernant la recopie des couleurs, le dessin de fond, par lui-même, est correcte mais les couleurs sont catastrophiques. Je pense qu'il va falloir que je me penche sur les couleurs d'origine.
    Je vais voir ça. Merci pour vos conseils.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 90
    Points : 52
    Points
    52
    Par défaut
    Bonjour,
    Et maintenant, ça tourne rond.
    Merci

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Août 2007
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 98
    Points : 87
    Points
    87
    Par défaut
    D'ou venait le problème de couleur ?

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 90
    Points : 52
    Points
    52
    Par défaut
    Je ne sais pas trop, je n'arrive même pas à reproduire le phénomène. Si j'y arrive, je vous mettrai un mot d'explication.

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

Discussions similaires

  1. [SDL 2.0] Déplacement de sprites sur une image de fond
    Par vega95 dans le forum SDL
    Réponses: 2
    Dernier message: 10/01/2015, 21h06
  2. Réponses: 2
    Dernier message: 26/07/2006, 00h33
  3. animation 3D sur fond transparent
    Par addicts dans le forum DirectX
    Réponses: 12
    Dernier message: 24/05/2006, 20h42
  4. Création d'un cercle plein blanc sur fond noir
    Par Rafoo dans le forum Traitement d'images
    Réponses: 10
    Dernier message: 11/04/2006, 14h53
  5. [2D] Gestion des sprites sur un moteur 2d
    Par drcd dans le forum Développement 2D, 3D et Jeux
    Réponses: 9
    Dernier message: 27/03/2006, 16h17

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