Partage
  • Partager sur Facebook
  • Partager sur Twitter

Fonction pour faire bouger Zozor qui ne marche pas

Sujet résolu
    10 avril 2006 à 12:47:08

    Bonjour,

    Voilà j'ai essayé de faire une fonction pour faire bouger Zozor mais elle ne fonctionne pas : il n'y a pas zozor dans la fenêtre... :(
    Voilà mon code :

    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL/SDL.h>
    #include <SDL/SDL_image.h>
    void pause ();

    int main(int argc, char *argv[])
    {
            SDL_Surface *ecran = NULL, *zozor = NULL;
            SDL_Rect positionZozor;
            positionZozor.x = 0;
            positionZozor.y = 0;
           
            SDL_Init(SDL_INIT_VIDEO);
            SDL_WM_SetIcon (SDL_LoadBMP("sdl_icone.bmp"),NULL);
            ecran = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE);
            SDL_WM_SetCaption("Les évenements !", NULL);
            SDL_FillRect (ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
            zozor = SDL_LoadBMP("zozor.bmp"), NULL;
            SDL_BlitSurface(zozor, NULL, ecran, &positionZozor);
           
            pause();
            SDL_Quit();
    }
    void pause (SDL_Rect positionZozor, SDL_Surface *ecran, SDL_Surface *zozor )
    {
            int continuer = 1;
            SDL_Event event;
           
            while (continuer)
            {
                    SDL_WaitEvent(&event);
                   
                    switch (event.type)
                    {
                            case SDL_QUIT:
                                    continuer = 0;
                                    break;
                            case SDL_KEYDOWN:
                                    switch (event.key.keysym.sym)
                                    {
                                            case SDLK_ESCAPE:
                                                    continuer = 0;
                                                    break;
                                            case SDLK_DOWN:
                                                    positionZozor.y++;
                                                    break;
                                            case SDLK_UP:
                                                    positionZozor.y--;
                                                    break;
                                            case SDLK_RIGHT:
                                                    positionZozor.x++;
                                                    break;
                                            case SDLK_LEFT:
                                                    positionZozor.x--;
                                                    break;   
                                    }
                                    break
                    }
                    SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255)); /* On efface l'écran */
            SDL_BlitSurface(zozor, NULL, ecran, &positionZozor); /* On place zozor à sa nouvelle position */
            SDL_Flip(ecran); /* On met à jour l'affichage */
            }
                                   
    }


    Pouvez-vous m'aider à résoudre ce problème s'il vout plaît et à l'optimiser...
    Merci d'avance :)

    PS: Je pense qu'il y a de grosses erreurs mais pas taper >_< s'il vout plait ^^
    • Partager sur Facebook
    • Partager sur Twitter
      10 avril 2006 à 12:50:18


      pause();
      SDL_Quit();
      }
      void pause (SDL_Rect positionZozor, SDL_Surface *ecran, SDL_Surface *zozor )

      -> Tu ne lui passe pas d'argument, à ta fonction pause, donc elle foire... (ca compile, ton truc?)
      • Partager sur Facebook
      • Partager sur Twitter
        10 avril 2006 à 13:12:24

        T'es sûr que ca compile ton truc ?

        Faut pas de deuzième argument pour loader une BMP..

        SDL_LoadBMP("zozor.bmp");
        • Partager sur Facebook
        • Partager sur Twitter
          10 avril 2006 à 13:21:37

          Ouai ça compile :lol: , vive Dev-C++ :-°
          J'ai corrigé l'erreur de SDL_LoadBMPet de la fonction pause mais maintenant ça s'ouvre et se ferme à la vitesse de l'eclair...

          Voici le code :

          #include <stdlib.h>
          #include <stdio.h>
          #include <SDL/SDL.h>
          #include <SDL/SDL_image.h>
          void pause ();

          int main(int argc, char *argv[])
          {
                  SDL_Surface *ecran = NULL, *zozor = NULL;
                  SDL_Rect positionZozor;
                  positionZozor.x = 0;
                  positionZozor.y = 0;
                 
                  SDL_Init(SDL_INIT_VIDEO);
                  SDL_WM_SetIcon (SDL_LoadBMP("sdl_icone.bmp"),NULL);
                  ecran = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE);
                  SDL_WM_SetCaption("Les évenements !", NULL);
                  SDL_FillRect (ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
                  zozor = SDL_LoadBMP("zozor.bmp");
                  SDL_BlitSurface(zozor, NULL, ecran, &positionZozor);
                 
                  pause(positionZozor, *ecran, *zozor);
                  SDL_Quit();
          }
          void pause (SDL_Rect positionZozor, SDL_Surface *ecran, SDL_Surface *zozor )
          {
                  int continuer = 1;
                  SDL_Event event;
                 
                  while (continuer)
                  {
                          SDL_WaitEvent(&event);
                         
                          switch (event.type)
                          {
                                  case SDL_QUIT:
                                          continuer = 0;
                                          break;
                                  case SDL_KEYDOWN:
                                          switch (event.key.keysym.sym)
                                          {
                                                  case SDLK_ESCAPE:
                                                          continuer = 0;
                                                          break;
                                                  case SDLK_DOWN:
                                                          positionZozor.y++;
                                                          break;
                                                  case SDLK_UP:
                                                          positionZozor.y--;
                                                          break;
                                                  case SDLK_RIGHT:
                                                          positionZozor.x++;
                                                          break;
                                                  case SDLK_LEFT:
                                                          positionZozor.x--;
                                                          break;   
                                          }
                                          break
                          }
                          SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255)); /* On efface l'écran */
                  SDL_BlitSurface(zozor, NULL, ecran, &positionZozor); /* On place zozor à sa nouvelle position */
                  SDL_Flip(ecran); /* On met à jour l'affichage */
                  }
                                         
          }
          • Partager sur Facebook
          • Partager sur Twitter
            10 avril 2006 à 13:24:32

            Euh en passant je ne comprends rien à ta pause donc je vais laisser tomber... Tu pouvais pas faire un simple while comme tout le monde :p:p
            • Partager sur Facebook
            • Partager sur Twitter
              10 avril 2006 à 13:39:00

              Voilà ce que fait Matéo :

              Citation : M@téo21

              int main(int argc, char *argv[])
              {
                  SDL_Surface *ecran = NULL, *zozor = NULL;
                  SDL_Rect positionZozor;
                  SDL_Event event;
                  int continuer = 1;

                  SDL_Init(SDL_INIT_VIDEO);

                  ecran = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE);
                  SDL_WM_SetCaption("Gestion des évènements en SDL", NULL);

                  /* Chargement de Zozor */
                  zozor = SDL_LoadBMP("zozor.bmp");
                  SDL_SetColorKey(zozor, SDL_SRCCOLORKEY, SDL_MapRGB(zozor->format, 0, 0, 255));

                  /* On centre Zozor à l'écran */
                  positionZozor.x = ecran->w / 2 - zozor->w / 2;
                  positionZozor.y = ecran->h / 2 - zozor->h / 2;


                  while (continuer)
                  {
                      SDL_WaitEvent(&event);
                      switch(event.type)
                      {
                          case SDL_QUIT:
                              continuer = 0;
                              break;
                          case SDL_KEYDOWN:
                              switch(event.key.keysym.sym)
                              {
                                  case SDLK_UP: // Flèche haut
                                      positionZozor.y--;
                                      break;
                                  case SDLK_DOWN: // Flèche bas
                                      positionZozor.y++;
                                      break;
                                  case SDLK_RIGHT: // Flèche droite
                                      positionZozor.x++;
                                      break;
                                  case SDLK_LEFT: // Flèche gauche
                                      positionZozor.x--;
                                      break;
                              }
                              break;
                      }

                      SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255)); /* On efface l'écran */
                      SDL_BlitSurface(zozor, NULL, ecran, &positionZozor); /* On place zozor à sa nouvelle position */
                      SDL_Flip(ecran); /* On met à jour l'affichage */
                  }

                  SDL_FreeSurface(zozor);
                  SDL_Quit();

                  return EXIT_SUCCESS;
              }


              Et moi je voudrais reproduire le même code mais avec une fontion à pars qui gère les évenement :
              #include <stdlib.h>
              #include <stdio.h>
              #include <SDL/SDL.h>
              #include <SDL/SDL_image.h>
              void evenement;

              int main(int argc, char *argv[])
              {
                  SDL_Surface *ecran = NULL, *zozor = NULL;
                  SDL_Rect positionZozor;
                  SDL_Event event;
                  int continuer = 1;

                  SDL_Init(SDL_INIT_VIDEO);

                  ecran = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE);
                  SDL_WM_SetCaption("Gestion des évènements en SDL", NULL);

                  /* Chargement de Zozor */
                  zozor = SDL_LoadBMP("zozor.bmp");
                  SDL_SetColorKey(zozor, SDL_SRCCOLORKEY, SDL_MapRGB(zozor->format, 0, 0, 255));

                  /* On centre Zozor à l'écran */
                  positionZozor.x = ecran->w / 2 - zozor->w / 2;
                  positionZozor.y = ecran->h / 2 - zozor->h / 2;


                  fonctionGereEvenement();//Je voudrais faire cette fonction

                  SDL_FreeSurface(zozor);
                  SDL_Quit();

                  return EXIT_SUCCESS;
              }


              Seulement je n'y arrive pas alors que je sais que ça doit-être trés facile :( .
              • Partager sur Facebook
              • Partager sur Twitter
                10 avril 2006 à 13:43:11

                Je vois une grosse erreur : tu peux pas transmettre une structure comme ça à la fonction (je pense à positionZozor).
                Envoie plutôt l'adresse de positionZozor. Modifie ton prototype en conséquence. Change l'intérieur de la fonction pour positionZozor->x et non positionZozor.x vu que maintenant c'est un pointeur.

                Ca ira mieux tu verras :D
                • Partager sur Facebook
                • Partager sur Twitter

                If you'd like to join us, read "How do we work at OpenClassrooms"! :)

                  10 avril 2006 à 13:47:59

                  Ok merci je vais essayer... ;)

                  [Edit] Voilà ce que j'ai fait mais ça ne marche toujours pas :
                  #include <stdlib.h>
                  #include <stdio.h>
                  #include <SDL/SDL.h>
                  #include <SDL/SDL_image.h>
                  void gereEvenement ();

                   int main(int argc, char *argv[])
                  {
                      SDL_Surface *ecran = NULL, *zozor = NULL;
                      SDL_Rect positionZozor;

                      SDL_Init(SDL_INIT_VIDEO);

                      ecran = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE | SDL_DOUBLEBUF); /* Double Buffering */
                      SDL_WM_SetCaption("Gestion des évènements en SDL", NULL);

                      zozor = SDL_LoadBMP("zozor.bmp");
                      SDL_SetColorKey(zozor, SDL_SRCCOLORKEY, SDL_MapRGB(zozor->format, 0, 0, 255));

                      positionZozor.x = ecran->w / 2 - zozor->w / 2;
                      positionZozor.y = ecran->h / 2 - zozor->h / 2;

                      SDL_EnableKeyRepeat(10, 10); /* Activation de la répétition des touches */

                      gereEvenement(&positionZozor, *ecran, *zozor);

                      SDL_FreeSurface(zozor);
                      SDL_Quit();

                      return EXIT_SUCCESS;
                  }
                     
                  void gereEvenement (SDL_Rect *positionZozor, SDL_Surface *ecran, SDL_Surface *zozor)
                  {
                          int continuer = 1;
                          SDL_Event event;
                         
                          while (continuer)
                          {
                              SDL_WaitEvent(&event);
                              switch(event.type)
                              {
                                  case SDL_QUIT:
                                      continuer = 0;
                                      break;
                                  case SDL_KEYDOWN:
                                      switch(event.key.keysym.sym)
                                      {
                                          case SDLK_UP:
                                              positionZozor->y --;
                                              break;
                                          case SDLK_DOWN:
                                              positionZozor->y ++;
                                              break;
                                          case SDLK_RIGHT:
                                              positionZozor->x ++;
                                              break;
                                          case SDLK_LEFT:
                                              positionZozor->x --;
                                              break;
                                      }
                                   break;
                               }

                              SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
                              SDL_BlitSurface(zozor, NULL, ecran, &positionZozor);
                              SDL_Flip(ecran);
                          }
                  }
                  • Partager sur Facebook
                  • Partager sur Twitter
                    12 avril 2006 à 13:26:14

                    Up :D

                    PS: Je me permets d'upper mon post parceque j'ai édité mon post précédent et apparement c'est passé inaperçu ^^
                    • Partager sur Facebook
                    • Partager sur Twitter
                      12 avril 2006 à 13:47:39

                      Citation : Bladeee

                      gereEvenement(&positionZozor, *ecran, *zozor);

                      T'as rien compris aux pointeurs, toi, hein ? C'est quoi ces étoiles là ? Enlève-moi les tout de suite ! (je précise que ça devrait pas compiler).

                      Citation : Bladeee

                              while (continuer)
                          {
                              SDL_WaitEvent(&event);
                              switch(event.type)
                              {

                      C'est quoi cette indentation ? Ca pique les yeux...

                      Citation : Bladeee

                                      switch(event.key.keysym.sym)
                                      {
                                          case SDLK_UP:
                                              positionZozor->y --;
                                              break;
                                          case SDLK_DOWN:
                                              positionZozor->y ++;
                                              break;
                                          case SDLK_RIGHT:
                                              positionZozor->x ++;
                                              break;
                                          case SDLK_LEFT:
                                              positionZozor->x --;
                                              break;
                                      }
                                      break;

                      L'imbrication des switch, c'est violent... m'enfin tu fais comme tu veux ;-)
                      • Partager sur Facebook
                      • Partager sur Twitter
                        12 avril 2006 à 13:50:33

                        Tes remarques me seront utiles pour la suite (j'irais faire un petit tour du côté du chapitre sur les pointeurs et revoir mon indentation) mais sinon pour mon code tu ne m'aides pas beaucoup...

                        Edit :

                        Citation : remram44

                        L'imbrication des switch, c'est violent... m'enfin tu fais comme tu veux ;-)



                        J'ai pas trés bien compris, comment peut on faire autrement, peux tu me donner un exemple s'il te plaît ?
                        • Partager sur Facebook
                        • Partager sur Twitter
                          12 avril 2006 à 18:45:30

                          Pour l'indentation tu peux faire comme ca, mais je ne sais pas si c'est la meilleur mais c'est comme ca que je fais et je m'en sort
                          switch(bidul)
                            {
                            case 1:
                            //code
                            break;

                            case 2:
                            break;

                            //...
                            }
                          • Partager sur Facebook
                          • Partager sur Twitter

                          Fonction pour faire bouger Zozor qui ne marche pas

                          × 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