Partage
  • Partager sur Facebook
  • Partager sur Twitter

[SDL] Effacer une surface ?

Comment faire disparaître une surface ?

    24 avril 2006 à 14:02:19

    Salut !

    J'ai le problème suivant dans la création d'un éditeur :

    J'ai un fond d'herbe, sur lequel je rajoute des sprites. Jusque là pas de problème.
    Seulement je souhaite crer un menu qui s'affiche à gauche quand on appuie sur une touche (b) et qui s'efface lorsque l'on réappuie sur la touche (b).

    Pour l'affichage, pas de problème, mais pour effacer ce menu, ça se corse pour mon petit esprit de débutant. Comment faire ? Je ne peux pas réafficher le fond, sinon que deviendront mes sprites précédemment blittés ? J'ai aussi tenté de remplir la surface du menu de noir, et de mettre le noir en transparence totale, snas grand succès ^^


    Alors je vous pose la question, ... comment faire ?



    Merci d'avance !
    • Partager sur Facebook
    • Partager sur Twitter
      24 avril 2006 à 14:11:14

      Si on appuie sur la touche b, la(les) surface(s) du menu est(sont) "blittée(s)"
      Si on appuie encore une fois sur la touche b, la(les) surface(s) du menu arrete d'être "blittée(s)" sur la surface principale et donc ne sont plus afficher
      Utilise un boolean du genre "int bBlitMenu = 0" ; si bBlitMenu est égal a 1 tu "blit" sinon tu fais rien.
      • Partager sur Facebook
      • Partager sur Twitter
        24 avril 2006 à 14:11:42

        tu as essayé de mettre la transparence à 0 (pour ton menu) quand tu appuie sur "b" et au max (pour le faire disparaitre) quand la touche est relaché ?
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          24 avril 2006 à 14:16:27

          Tu peux aussi bliter ton menu hors de l'écran pour le faire disparaitre :p
          • Partager sur Facebook
          • Partager sur Twitter
            24 avril 2006 à 14:42:56

            alors alors ....

            Yondaime > Comment ? Une fois que l'on a blitté une fois le menu sur l'ecran, si je le reblitte en dehors de l'écran, ça ne va pas effacer l'ancien o_O

            hayden > Oui j'ai essayé, mais ça ne fonctionne pas ^^ ...

            tif-tof > Je ne comprends pas ce que tu veux dire ....

            Voilà mon code :


            // On souhaite afficher la liste des sprites disponibles ?
            case SDLK_b :

            //---- Création de la fenêtre listant les sprites --------------
            allsprite = SDL_CreateRGBSurface(SDL_HWSURFACE, 200, 400, 32, 0, 0, 0, 0);

            positionallsprite.x = (LARGEUR_ECRAN - 200);
            positionallsprite.y = (0);
            //--------------------------------------------------------------

            if (!fenetre_activee)
            {
                //---- Paramètres de la fenêtre ----------------------------
                SDL_SetAlpha(allsprite, SDL_SRCALPHA, 128);
                SDL_FillRect(allsprite, NULL, SDL_MapRGB(ecran->format,202, 236, 83));
                //----------------------------------------------------------
                fenetre_activee = 1;
            }
            else if(fenetre_activee)
            {
                //---- On efface la fenêtre --------------------------------
                SDL_FillRect(allsprite, NULL, 0);
                SDL_SetColorKey(allsprite, SDL_SRCCOLORKEY, 0);
                //----------------------------------------------------------
                fenetre_activee = 0;
            }

            //---- On l'affiche à la position voulue -----------------------
            SDL_BlitSurface(allsprite, NULL, ecran, &positionallsprite);
            SDL_Flip(ecran);
            //--------------------------------------------------------------

            break;



            Je ne vois vraiment pas la solution :oo_O .


            • Partager sur Facebook
            • Partager sur Twitter
              24 avril 2006 à 17:46:00

              bah la première fois que tu appuye sur b, tu a un bolleen qui passe a 1 et quand tu réappuie, ça passe à 0

              ça peut donner quelque choe comme ça :

              /*debut de ta fonction, declaration, initialisation,
              début de la boucle des evenements*/


              switch(event.type)
              {
                  case SDL_KEYDOWN:
                      if (event.key.keysym.sym == SDLK_b)
                      {
                          if(!toucheBActive)
                              toucheBActive = 1;
                          else if(touBActive)
                              toucheBActive = 0;
                       }
                       break;
              }

              /*au moment de bliter, on verifie si toucheBActive = 1
              si oui, on blite le menu */

              if(toucheBActive)
                  SDL_BlitSurface(menu, NULL, ecran, &positionMenu);


              je ne l'ai pas tester mais ça devrai marcher.
              • Partager sur Facebook
              • Partager sur Twitter
                24 avril 2006 à 20:09:05

                Mais non !!

                Puisque ça, ça ne permet pas d'enlever ce qui a déjà été mis !!

                Si je suis ton code, j'appuie une première fois sur b, ça blit la surface, j'appuie une deuxième fois, ça ne la blit pas ok, mais ça n'enlève pas celle qui a été blittée !!

                Vous comprenez ce que je veux ?

                J'ai une surface qui apparaît quand j'appuie sur b, et je veux la faire DISPARAITRE quand je réappuie sur b.
                • Partager sur Facebook
                • Partager sur Twitter
                  24 avril 2006 à 20:14:38

                  bah il suffit de faire un SDL_Flip(ecran)
                  puisque la deuxième fois, l'image n'est pas blittée, elle n'apparaitra pas .

                  EDIT: arf, esasye de blitter tes surfaces après le switch des evenements.

                  Citation : m@téo

                  Ce schéma est à connaître par coeur. Le voici :

                  while (continuer)
                  {
                      SDL_WaitEvent(&event);
                      switch(event.type)
                      {
                          case SDL_TRUC: /* Gestion des évènements de type TRUC */
                          case SDL_BIDULE: /* Gestion des évènements de type BIDULE */
                      }

                      SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255)); /* On efface l'écran (ici fond blanc) */
                      /* On fait tous les SDL_BlitSurface nécessaires pour coller les surfaces à l'écran */
                      SDL_Flip(ecran); /* On met à jour l'affichage */
                  }
                  • Partager sur Facebook
                  • Partager sur Twitter
                    24 avril 2006 à 20:19:05

                    Justement si ! Elle est blittée, mais je ne reblitte pas le fond à chaque tour de la boucle (comme ce c'est un éditeur, si je blittais à chaque fois le background, les sprites déjà en position disparaîtraient ...)

                    Donc tout e problème est là

                    PS : merci de t'intéresser à mon cas c'est gentil !

                    EDIT : pour ton EDIT, ça ne fonctionne pas étant donné que ça ne tient qu'une petite partie de l'écran total ... si j'essaie avec seulement le menu, ça ne fonctionne pas mieux ^^ ... problème pas embêtant lol

                    Si tu veux plus de code, n'hésite pas à demander !
                    • Partager sur Facebook
                    • Partager sur Twitter
                      24 avril 2006 à 20:24:06

                      est-ce que tu as quelque chose en dessous de ta surface (que tu voudrai récupérer en faisant disparaitre le menu ) ??
                      si oui, je vois pas trop,
                      si non, colle une surface blache (ou le fond normal) par dessus. c'est un peu barbare mais je vois pas trop comment faire (j'ai que le niveau des cours hein :p )
                      • Partager sur Facebook
                      • Partager sur Twitter
                        24 avril 2006 à 20:28:30

                        C'est un éditeur de map, donc en dessous, j'ai un background en herbe .... et peut-être des sprites, ça dépend si l'utilisateur en a mis à cet endroit ou pas !
                        • Partager sur Facebook
                        • Partager sur Twitter
                          24 avril 2006 à 20:33:38

                          pour l'effacer tu reblit tout sauf le menu a l'endroit ou ils étaient avant (donc toutes tes sprites reviennent a leur place :) et tu as plus de menu :) )
                          • Partager sur Facebook
                          • Partager sur Twitter
                            24 avril 2006 à 20:38:36

                            Alcor > Et tu peux me dire comment tout reblitter ^^ ? A part employer la méthde lourde -> enregistrement des coordonnées des sprites, Blit du background puis lecture du fichier où sont inscrites les coordonnées et blit des sprites sur le background, et ce à chaque fois qu'on veut avoir le menu ^^ je vois pas ... ^^

                            Plz help me !
                            • Partager sur Facebook
                            • Partager sur Twitter
                              24 avril 2006 à 20:47:29

                              bah tu decoupe ta map en un tableau a deux entrées XD.
                              tu perd de la précision (a moins de découper en pixel mais là c'est extrement lourd XD) mais au moins ça fonctionne parfaitement.

                              ou alors, tu blitte un menu permanant, une sorte d'inteface sur le coté ;)
                              • Partager sur Facebook
                              • Partager sur Twitter
                                24 avril 2006 à 20:50:57

                                Hum non je souhaiterais avoir un menu comme celui-ci, .... de toute façon c'est possible ce que je demande, c'est juste que je bloque ....

                                Non je ne veux pas une map en tableau bidimensionnel .... je fais actuellement un éditeur ou il n'y a pas de "cases", c'est "au pixel près" .... enfin vous voyez ce que je veux dire ? c'est une zone libre où l'on place ses sprites comme o veut !

                                Donc dsl d'être aussi chipotant, mais je ne veux pas changer mon éditeur juste pour un (petit ?) problème de menu !
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  28 avril 2006 à 22:13:35


                                  Pas bessoin de tout reblitter !!
                                  Il suffit de creer un booleen qui contient le status du menu(0:caché // 1:montré)
                                  Ensuite, en fonction de ce status, tu cache ou montre le menu en modifiant sa transparence d'une extreme à l'autre...
                                  Vachement facile ^^ Je m'en suit pas mal servi...

                                  case SDLK_space:
                                       if(menu == 0) // le menu est caché, on le montre
                                       {
                                           ALPHA du menu = 255;
                                           menu = 1;
                                       }
                                       else if(menu == 1) // le menu est montré, on le cache
                                       {
                                           ALPHA du menu = 0;
                                           menu = 0;
                                       }
                                       SDL_Flip(ecran);
                                       break;

                                  C'estdu faux C, ça se voit ! ;)
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    28 avril 2006 à 22:23:52

                                    Citation : guimers8

                                    Pas bessoin de tout reblitter !!


                                    case SDLK_space:
                                         if(menu == 0) // le menu est caché, on le montre
                                         {
                                             ALPHA du menu = 255;
                                             menu = 1;
                                         }
                                         else if(menu == 1) // le menu est montré, on le cache
                                         {
                                             ALPHA du menu = 0;
                                             menu = 0;
                                         }
                                         SDL_Flip(ecran);
                                         break;

                                    On t'a déjà dit que tu racontais n'importe quoi ?
                                    De l'alpha avec SDL pour cacher un menu ? T'es fou ?

                                    Pour ton problème, il faut bien reblitter les sprites que tu as déjà affiché avec ou sans le menu, c'est la solution la plus simple et la plus rapide. Si tu veux coder un système de blit pour SDL avec canal alpha, qui ne sera pas accéléré en matériel, ne te gènes pas, mais le résultat sera décevant.
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      29 avril 2006 à 0:15:24

                                      Enfin.. sa dépend comment est fait son menu..J'en sais rien moi !

                                      Moi j'avais fais un menu contenu dans une surface et je modifiais l'alpha de la surface pour le cacher ou le montrer.
                                      J'ai pas bien compris comment etait fais son menu alors..on sait jamais, ce n'est pas n'importe quoi !

                                      Sinon tu peut toujours faire un ScreenShoot de l'ecran lors de l'appui sur la touche,
                                      puis on affiche le menu,
                                      puis on réaffiche le screenshoot par dessus lors du relachement ! Ensuite, tu supprime le fichier du screenShoot.

                                      Ces deux façon marchent si ton menu (et tous ses elements) son contenus dans une seule surface.

                                      PS: pour le screenshoot, utilise
                                      int SDL_SaveBMP(SDL_Surface *surface, const char *file);

                                      ex:
                                      int SDL_SaveBMP(SurfaceDeDessin, "fichierTemporaire.bmp");


                                      • Partager sur Facebook
                                      • Partager sur Twitter

                                      [SDL] Effacer une surface ?

                                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                      • Editeur
                                      • Markdown