Partage
  • Partager sur Facebook
  • Partager sur Twitter

Probleme avec l'exo3 dans Evenements (1/2)

Le Tampon

Sujet résolu
    16 octobre 2006 à 6:44:48

    Salut les zeros :D!

    Voila j'ai fais tout seul sans trop grande difficultée les exos SDL jusqu'à cet exo 3 dans la partie sur La Gestion des évènements.

    Vu que le SDZ était down, j'ai fais avec des images a moi (tux le joyeux petit manchot :D ).

    Voila mon code :


    #include <stdio.h>
    #include <stdlib.h>
    #include <SDL.h>

    int main ( int argc, char** argv )
    {
        //Declaration de variables
        SDL_Surface *ecran, *tux;
        SDL_Rect positionTux[10];
        SDL_Event event;
        int continuer = 1, i;

        //Initalisation de la SDL
        SDL_Init(SDL_INIT_VIDEO);
        //Nom de la fenetre + Icone de la fenetre
        SDL_WM_SetIcon(SDL_LoadBMP("icone.bmp"), NULL);
        SDL_WM_SetCaption("Le tampon", NULL);
        //Choix du mode video, creation de la surface ecran
        ecran = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);

        //chargement de l'image tux.bmp et transparence de la couleur bleu pur
        tux = SDL_LoadBMP("tux.bmp");
        SDL_SetColorKey(tux,SDL_SRCCOLORKEY, SDL_MapRGB(tux->format, 0, 0, 255));

        //boucle du programme
        while (continuer)
        {
            SDL_WaitEvent(&event);

            //evenements
            switch (event.type)
            {
            case SDL_QUIT :
                continuer = 0;
                break;

            case SDL_MOUSEBUTTONUP :
                for (i = 0; i < 10; i++)
                {
                    positionTux[i].x = event.motion.x;
                    positionTux[i].y = event.motion.y;

                    //if (i == 9)
                    //{
                    //    SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
                    //}

                    SDL_BlitSurface(tux, NULL, ecran, &positionTux[i]);
                    SDL_Flip(ecran);
                }
                break;

            case SDL_KEYDOWN :
                switch (event.key.keysym.sym)
                {
                case SDLK_ESCAPE :
                    continuer = 0;
                    break;

                case SDLK_DELETE :
                    SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
                    SDL_Flip(ecran);
                    break;
                }
                break;
            }
        }

        //liberation de la memoire allouee a la surface
        SDL_FreeSurface(tux);

        //quitte SDL
        SDL_Quit();

        return EXIT_SUCCESS;
    }


    Vous remarquerez que j'ai commenter ma condition if.
    Je suis conscient qu'il y a possibilité d'optimisation (j'ai taper 2 SDL_Flip par exemple).
    Toute suggestions serait a bienvenue :D .
    Merci

    Kurapix

    P.S.:
    - Es-ce encore nécessaire d'inclure les librairies standard vu qu'on a plus de console?
    • Partager sur Facebook
    • Partager sur Twitter
      16 octobre 2006 à 12:34:37

      Citation :

      Es-ce encore nécessaire d'inclure les librairies standard vu qu'on a plus de console?


      dans ton programme non parceque tu ne travail pas avec les chaînes, tu ne manipules pas de fichier etc.. mais si ça t'arrive tu devras les inclure. c'est indépendant du fait que tu sois en consol ou non.
      • Partager sur Facebook
      • Partager sur Twitter
        16 octobre 2006 à 12:55:54

        Salut,

        Citation : freecircus

        dans ton programme non parceque tu ne travail pas avec les chaînes, tu ne manipules pas de fichier etc.. mais si ça t'arrive tu devras les inclure. c'est indépendant du fait que tu sois en consol ou non.



        Il utilise la macro EXIT_SUCCESS, défini dans stdlib.h ( je viens de vérifier ), donc oui il doit inclure les libraires standards.

        De toute façon ça coute rien de les inclure donc autant le faire.
        • Partager sur Facebook
        • Partager sur Twitter
          16 octobre 2006 à 15:00:03

          Citation

          De toute façon ça coute rien de les inclure donc autant le faire.



          Ca te coûte de la mémoire...sinon elles seraient toutes inclues par défaut...
          • Partager sur Facebook
          • Partager sur Twitter
            17 octobre 2006 à 6:34:31

            Aaaarf j'ai oublié de dire quel était le problème, grave xD. Ca devait être la fatigie lol.

            Bon voila en fait le problème c'est que j'arrive pas à mettre un max de 10 tampon puis ça efface l'écran automatiquement l'écran si on met un 11 ème tampon.

            J'ai plus toucher à mon code depuis que je l'ai poster. Bon je vais retaffer dessus, je viens d'avoir une idée : faudrait pas que je re-initialise les différentes position des tampons puis que j'efface l'écran? Bon je vais essayer de trouver une solution. Je vous tiens au courant.

            Kurapix
            • Partager sur Facebook
            • Partager sur Twitter
              17 octobre 2006 à 11:09:30

              Citation : Blorki

              Citation

              De toute façon ça coute rien de les inclure donc autant le faire.



              Ca te coûte de la mémoire...sinon elles seraient toutes inclues par défaut...


              Ah bon ? Quelle genre de mémoire ? Tu ne confondrais pas fichier d'entête et bibliothèque, par hasard ?
              • Partager sur Facebook
              • Partager sur Twitter
              Music only !
                17 octobre 2006 à 14:56:52

                Euh, si tu le dis, explique moi alors ^^ , sinon je ne vois pas pourquoi ca ne te couterait pas de la mémoire vive ou disque dur, quand tu compiles, que d'inclure une bibliothèque ?
                non :euh: ?
                • Partager sur Facebook
                • Partager sur Twitter
                  17 octobre 2006 à 15:46:29

                  Citation : Blorki

                  Euh, si tu le dis, explique moi alors ^^ , sinon je ne vois pas pourquoi ca ne te couterait pas de la mémoire vive ou disque dur, quand tu compiles, que d'inclure une bibliothèque ?
                  non :euh: ?


                  Ta terminololgie est floue. Si on respecte les Bonnes Pratiques, ce qu'on inclue, ce sont des fichiers d'en-tête (headers), et ça, ça ne coûte rien en mémoire.

                  Par contre, si on lie une ou des bibliothèques au projet, oui, ca le fait grossir. Solution pour éviter ça, les bibliothèques partagées (SO, DLL ...)
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Music only !
                    19 octobre 2006 à 11:41:52

                    Une solution a mon probleme svp.
                    >< je trouve vraiment pas, ca doit etre un truc bete (justement c'est pour ca je vois pas lol).

                    merci

                    Kurapix
                    • Partager sur Facebook
                    • Partager sur Twitter
                      19 octobre 2006 à 12:29:22

                                  for (i = 0; i < 10; i++)
                                  {
                                      positionTux[i].x = event.motion.x;
                                      positionTux[i].y = event.motion.y;

                                      //if (i == 9)
                                      //{
                                      //    SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
                                      //}

                                      SDL_BlitSurface(tux, NULL, ecran, &positionTux[i]);
                                      SDL_Flip(ecran);
                                  }

                      Les commentaires //, c'est valide C99 pas C90. :)

                      Debordement, ton tableau positionTux comporte 10 éléments : 0 1 2 3 4 5 6 7 8 9 pas 11, ta boucle doit s'arreter à 9 pas à 10.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        19 octobre 2006 à 12:55:08

                        Citation : Kr00pS

                                    for (i = 0; i < 10; i++)
                                    {
                                    }


                        Debordement, ton tableau positionTux comporte 10 éléments : 0 1 2 3 4 5 6 7 8 9 pas 11, ta boucle doit s'arreter à 9 pas à 10.


                        C'est exactement ce qui se passe avec un test '< 10'. Ne pas confondre avec '<= 10'.
                        • Partager sur Facebook
                        • Partager sur Twitter
                        Music only !
                          19 octobre 2006 à 18:50:15

                          Comment je peux avoir un debordement d'entier vu que c'est STRICTEMENT inferieur a 10 et i est incremente de 1 en 1 donc ne peux pas etre superieur a 9. Mais bon je vais modifier ma condition et mettre celle-la a la place :


                          for (i = 0; i <= 9; i++)
                          {
                          }


                          Kurapix
                          • Partager sur Facebook
                          • Partager sur Twitter
                            19 octobre 2006 à 18:55:32

                            Citation : Kurapix

                            Comment je peux avoir un debordement d'entier vu que c'est STRICTEMENT inferieur a 10 et i est incremente de 1 en 1 donc ne peux pas etre superieur a 9. Mais bon je vais modifier ma condition et mettre celle-la a la place :


                            Inutile. Déjà expliqué au dessus. (Kr00pS c'est trompé c'est tout, ça nous arrive à tous...).
                            • Partager sur Facebook
                            • Partager sur Twitter
                            Music only !
                              3 novembre 2006 à 1:45:34

                              Je viens juste de penser a re-regarder mon code.
                              C'est un truc tout bete,j'ai trouver la solution en 2 minutes xD.
                              En fait dans le premier code chaque fois que l'on appuyait puis lachait un boutton de la souris on faisait le for et donc on continuait a blitter des tux autant que l'on voulait.
                              Donc suffisait de virer le for et de balancer une condition avec une incrementation.


                              #include <stdio.h>
                              #include <stdlib.h>
                              #include <SDL.h>

                              int main ( int argc, char** argv )
                              {
                                  //Declaration des variables
                                  SDL_Surface *ecran, *tux;
                                  SDL_Rect positionTux[10];
                                  SDL_Event event;
                                  int continuer = 1, i = 0;

                                  //Initalisation de la SDL
                                  SDL_Init(SDL_INIT_VIDEO);
                                  //Nom de la fenetre + Icone de la fenetre
                                  SDL_WM_SetIcon(SDL_LoadBMP("icone.bmp"), NULL);
                                  SDL_WM_SetCaption("Le tampon", NULL);
                                  //Choix du mode video, creation de la surface ecran
                                  ecran = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);

                                  //chargement de l'image tux.bmp et transparence de la couleur bleu pur
                                  tux = SDL_LoadBMP("tux.bmp");
                                  SDL_SetColorKey(tux,SDL_SRCCOLORKEY, SDL_MapRGB(tux->format, 0, 0, 255));

                                  //boucle du programme
                                  while (continuer)
                                  {
                                      //attente d'un evenement
                                      SDL_WaitEvent(&event);

                                      //evenements
                                      switch (event.type)
                                      {
                                      //On quitte la SDL alors on quitte la boucle
                                      case SDL_QUIT :
                                          continuer = 0;
                                          break;

                                      case SDL_MOUSEBUTTONUP :
                                          //si i est inferieur a 10 alors on blitte un nouveau tux a l'endroit
                                          //ou on lache le boutton de la souris et on rafraichit l'ecran
                                          if (i < 10)
                                          {
                                              positionTux[i].x = event.motion.x;
                                              positionTux[i].y = event.motion.y;

                                              SDL_BlitSurface(tux, NULL, ecran, &positionTux[i]);
                                              SDL_Flip(ecran);
                                          }
                                          i++;
                                          break;

                                      case SDL_KEYDOWN :
                                          switch (event.key.keysym.sym)
                                          {
                                          case SDLK_ESCAPE :
                                              continuer = 0; //pour quitter la boucle et donc le programme
                                              break;

                                          //effacement de l'ecran et re-initialisation de i a 0.
                                          case SDLK_DELETE :
                                              i = 0;
                                              SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
                                              SDL_Flip(ecran);
                                              break;
                                          }
                                          break;
                                      }
                                  }

                                  //liberation de la memoire allouee a la surface tux
                                  SDL_FreeSurface(tux);

                                  //quitte SDL
                                  SDL_Quit();

                                  return EXIT_SUCCESS;
                              }


                              Et hop la ca marche niquel.
                              On ne peut plus blitter de tux si on a 10 tux et qu'on appuis pas sur delete ;).

                              Kurapix
                              • Partager sur Facebook
                              • Partager sur Twitter

                              Probleme avec l'exo3 dans Evenements (1/2)

                              × 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