Partage
  • Partager sur Facebook
  • Partager sur Twitter

[SDL]probleme Gestion des collisions

    25 octobre 2006 à 18:50:02

    alor voila j'ai essayé de faire en sorte que zozor un rectangle se trouvant dans ma fenêtre seulement pour le haut il ne veut pas monté au dessu et je ne sais pas comment arangé sa. Vous comprensderez mieux avec le code :

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

    int main(int argc, char *argv[])
    {
        SDL_Surface *ecran = NULL, *zozor = NULL, *rectangle = NULL;
        SDL_Rect positionZozor, positionRectangle;
        SDL_Event event;
        int continuer = 1;
        SDL_Init(SDL_INIT_VIDEO);
        ecran = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE | SDL_DOUBLEBUF); /* Double
        Buffering */

        rectangle = SDL_CreateRGBSurface(SDL_HWSURFACE, 150, 50, 32, 0, 0, 0, 0);
        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;
       
        positionRectangle.x = 0;
        positionRectangle.y = 0;
       
       
        SDL_EnableKeyRepeat(10, 10); /* Activation de la répétition des touches */
       
        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:
                    if (positionZozor.y -1 < rectangle->h)
                    {
                    break;
                    }
                    positionZozor.y--;
                    break;
                    case SDLK_DOWN:
                         
                    if (positionZozor.y + 1 > (ecran->h - zozor->h))
                         break;
                         
                    positionZozor.y++;
                    break;
                   
                    case SDLK_RIGHT:
                         
                    if (positionZozor.x + 1 > (ecran->w - zozor->w))
                        break;               
                       
                    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_BlitSurface(rectangle, NULL, ecran, &positionRectangle);
            SDL_Flip(ecran);
        }
        SDL_FreeSurface(zozor);
        SDL_Quit();
        return EXIT_SUCCESS;
    }



    Zanorio.
    • Partager sur Facebook
    • Partager sur Twitter
      25 octobre 2006 à 18:57:25

      Salut,

      Pourrais-tu reformuler ta question dans un français compréhensible ? Là c'est incompréhensible.
      Sinon c'est quoi tous ces break ? les instructions goto, continue et break ne doivent JAMAIS être utilisée sauf dans des cas spécifiques ( les break sont utilisés dans les switch, les goto quand on peut vraiment pas faire autrement ), or là tu a des break dont on pourrai se passer ( ceux qui sont dans les if ).
      • Partager sur Facebook
      • Partager sur Twitter
        25 octobre 2006 à 19:28:24

        Non les break sont obligatoire car si on les enléve sa continue par exemple d'allé sur la gauche or avec les break quand on veut depassé l'écran on ne peut pas. Désolé j'ai effectivement mal formulé ma question en faite sur mon ecran j'ai fait un rectangle noir (de 150*50px) le seul probléme c'est que j'ai voulu empéché que zozor ne rentre dans la boite donc grace a mon if il ne le fait pas, mais quand je veut monter en haut (et quand je suis a coté de mon rectangle) ben je ne peut pas.
        • Partager sur Facebook
        • Partager sur Twitter
          25 octobre 2006 à 19:52:12

          Bon, concernant les break, je maintiens qu'ils sont inutiles, il faut juste faire quelques modifications dans le code, par exemple pour le premier, au lieu de mettre :
                          case SDLK_UP:
                          if (positionZozor.y -1 < rectangle->h)
                          {
                          break;
                          }
                          positionZozor.y--;
                          break;

          tu pourrais mettre :
                          case SDLK_UP:
                          if (positionZozor.y -1 >= rectangle->h)
                            positionZozor.y--;
                          break;

          ça revient exactement au même et le code est plus propre. ( je te laisse arranger les autres )

          Concernant ta demande c'est ta méthode de collision qui est mal pensée : en effet si on essaye de monter, on va être bloqué à cause de la collision ... même si on est à coté du rectangle, tu dois donc introduire une condition supplémentaire pour bloquer le déplacement : il faut que les deux cotés de zozor soient en dehors des deux extrémités du rectangle.

          Je me suis pas très bien exprimé, mais cette méthode est celle des bounding boxes, ou boites englobantes, fait une recherche là dessus, ce sujet à déjà été traité maintes fois ;)
          • Partager sur Facebook
          • Partager sur Twitter
            25 octobre 2006 à 20:01:53

            pouquoi ce code marche pas :

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

            int main(int argc, char *argv[])
            {
                SDL_Surface *ecran = NULL, *zozor = NULL, *rectangle = NULL;
                SDL_Rect positionZozor, positionRectangle;
                SDL_Event event;
                int continuer = 1;
                SDL_Init(SDL_INIT_VIDEO);
                ecran = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE | SDL_DOUBLEBUF); /* Double
                Buffering */

                rectangle = SDL_CreateRGBSurface(SDL_HWSURFACE, 150, 50, 32, 0, 0, 0, 0);
                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;
               
                positionRectangle.x = 0;
                positionRectangle.y = 0;
               
               
                SDL_EnableKeyRepeat(10, 10); /* Activation de la répétition des touches */
               
                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:
                            if (positionZozor.y -1 >= rectangle->h && positionZozor.x != rectangle->w)
                              positionZozor.y--;
                            break;
                           
                            case SDLK_DOWN:
                            if (positionZozor.y + 1 <= (ecran->h - zozor->h))
                                positionZozor.y++;
                                break;
                           
                            case SDLK_RIGHT:
                            if (positionZozor.x + 1 <= (ecran->w - zozor->w))
                                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_BlitSurface(rectangle, NULL, ecran, &positionRectangle);
                    SDL_Flip(ecran);
                }
                SDL_FreeSurface(zozor);
                SDL_Quit();
                return EXIT_SUCCESS;
            }

            • Partager sur Facebook
            • Partager sur Twitter
              25 octobre 2006 à 20:39:22

              Peut-tu être plus précis que " ça marche pas " ?
              Si ça ne compile pas, le rapport d'erreur serait apprécié, sinon une description précise du problème.

              Syntaxiquement, ton programme m'a l'air correct, par contre l'algorithme me paraît être à revoir d'urgence.
              • Partager sur Facebook
              • Partager sur Twitter
                25 octobre 2006 à 20:43:00

                ben sa fait exactement comme tout a l'heure
                • Partager sur Facebook
                • Partager sur Twitter
                  25 octobre 2006 à 20:54:48

                  Hum, en effet ça vient de ta méthode de collision, qui est pour le moins étrange. ( donc de l'algorithme )

                  Je te conseille d'aller voir par ici et de lire le paragraphe "une première approche" ( surtout pas le reste c'est assez compliqué et inutile dans ton cas ).

                  Avant de te jeter sur ton clavier, je te conseille également d'écrire ton algorithme avec du pseudo-code, pour avoir les idées bien claires avant de commencer à programmer.

                  P.S. : le code que je t'ai mis ne visait en aucun cas à mettre en place une bonne détection de collision, mais uniquement à enlever le break, qui est considéré comme crade ( excepté dans un switch où il est indispensable bien sur ).
                  • Partager sur Facebook
                  • Partager sur Twitter

                  [SDL]probleme Gestion des collisions

                  × 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