Partage
  • Partager sur Facebook
  • Partager sur Twitter

SDL: probleme collision

aidez moi :( sil vous plait

Sujet résolu
Anonyme
    18 avril 2006 à 23:13:09

    Bonjour, :(

    Ben voilas tout est dans le titre si vous pouvez m'aidez
    car je n'arrive pas a empêché mon entiter de traverser une autre entiter
    dans mon programme alors si vous pouvez me faire un petit code, parceque la
    je ne comprent vraiment rien aux collisions. :(

    lien de telechargement du petit jeux> http://charlyia.ifrance.com/
    • Partager sur Facebook
    • Partager sur Twitter
      18 avril 2006 à 23:22:15

      Fait une matrice puis remplis la de 0 aux endroits où ton perso peut passer et de 1 où les obstacles sont positionnés, puis fais un test qui fera en sorte que le bonhomme bouge uniquement si l'endroit correspond à un 0.
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        18 avril 2006 à 23:28:23

        mais ta pas un exemple? :euh:
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          18 avril 2006 à 23:38:29

          Tu cadrille ton jeu, si la case vaut 1, il avance, si elle vaut 0, il avance pas.
          L'idéal ça serait du pixel par pixel pour des collision "parfaite" mais ça risques de devenir lourd. A toi de définir la taille de tes cases.

          Voilà @+
          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            18 avril 2006 à 23:45:23

            oui maiss comment cadriller :( .. parceque je vois pas la moi je sais placer mes textures cadriller je vois pas comment faire le tp de mateo jai pas trop comprit j'ai juste vu quil fallait utiliser un tableau 2d mais je sais pas comment "cadriller" ma fenetre :(:( vous pouvez pas me faire un mini code avec un mini cadrillage ? svp ou vous pouvez pas m'introduire une 'collision' dans mon code
            pour que après je vois comment vous avez fait que je puisse comprendre le truc et le refaire de diverses façon. :(

            Merci d'avance
            • Partager sur Facebook
            • Partager sur Twitter
              19 avril 2006 à 1:22:37

              C'est une fonction de collision que j'utilise dans un jeu que je fais :




              enum {HAUT,HAUT1, BAS,BAS1, GAUCHE,GAUCHE1, DROITE,DROITE1};

              enum {GAZON,LGAZON,PUIT,ECHELLE,PONT,ARBRE,COLLINE};

              int carte[32][32];


              int collision(int carte[32][32],SDL_Rect positionFond,int move)

              {
                  int condition=0;


                  if(move==HAUT)
                  {
                  if(carte[-((positionFond.y+TAILLE_BLOC-DECALAGE)/TAILLE_BLOC)]
                          [(-((positionFond.x-DECALAGE)/TAILLE_BLOC))]==PUIT)
                          {condition=1;}
                   if(carte[-((positionFond.y+TAILLE_BLOC-DECALAGE)/TAILLE_BLOC)]
                           [(-((positionFond.x-DECALAGE)/TAILLE_BLOC))]==ARBRE)

                 {condition=1;}

                  if(carte[-((positionFond.y+TAILLE_BLOC-DECALAGE)/TAILLE_BLOC)]

                          [(-((positionFond.x-DECALAGE)/TAILLE_BLOC))]==COLLINE)
                  {condition=1;}

                  if((positionFond.y+MOUVEMENT_CHAR*4)>=0)
                  {condition=1;}
                  return condition;
                  }


                  if(move==BAS)
                  {
                  if(carte[-((positionFond.y-TAILLE_BLOC-DECALAGE)/TAILLE_BLOC)]
                          [(-((positionFond.x-DECALAGE)/TAILLE_BLOC))]
                          ==PUIT)
                     {condition=1;}

                  if(carte[-((positionFond.y-TAILLE_BLOC-DECALAGE)/TAILLE_BLOC)]
                          [(-((positionFond.x-DECALAGE)/TAILLE_BLOC))]
                          ==ARBRE)
                        {condition=1;}

                  if(carte[-((positionFond.y-TAILLE_BLOC-DECALAGE)/TAILLE_BLOC)]
                          [(-((positionFond.x-DECALAGE)/TAILLE_BLOC))]
                          ==COLLINE)
                          {condition=1;}

                  if((positionFond.y-MOUVEMENT_CHAR*4)<=(-732))
                     {condition=1;}
                  return condition;
                  }

                 if(move==DROITE)
                  {
                  if(carte[-((positionFond.y-DECALAGE)/TAILLE_BLOC)]
                          [(-((positionFond.x-TAILLE_BLOC-DECALAGE)/TAILLE_BLOC))]
              ==PUIT)
                     {condition=1;}

                  if(carte[-((positionFond.y-DECALAGE)/TAILLE_BLOC)]
              [(-((positionFond.x-TAILLE_BLOC-DECALAGE)/TAILLE_BLOC))]
              ==ARBRE)
                     {condition=1;}
                  if(carte[-((positionFond.y-DECALAGE)/TAILLE_BLOC)]
              [(-((positionFond.x-TAILLE_BLOC-DECALAGE)/TAILLE_BLOC))]
              ==COLLINE)
                     {condition=1;}

                  if((positionFond.x-MOUVEMENT_CHAR*4)<=(-732))
                     {condition=1;}
                  return condition;
                  }


                 if(move==GAUCHE)
                  {
                   if(carte[-((positionFond.y-DECALAGE)/TAILLE_BLOC)]
              [(-((positionFond.x+TAILLE_BLOC-DECALAGE)/TAILLE_BLOC))]
              ==PUIT)
                    {condition=1;}
                  if(carte[-((positionFond.y-DECALAGE)/TAILLE_BLOC)]
              [(-((positionFond.x+TAILLE_BLOC-DECALAGE)/TAILLE_BLOC))]
              ==ARBRE)
                    {condition=1;}
                   if(carte[-((positionFond.y-DECALAGE)/TAILLE_BLOC)]
              [(-((positionFond.x+TAILLE_BLOC-DECALAGE)/TAILLE_BLOC))]
              ==COLLINE)
                    {condition=1;}

                   if((positionFond.x+MOUVEMENT_CHAR*4)>=0)

                     {condition=1;}

                  return condition;
                  }



              if(condition==1)
                /* le personnage n'avance pas/*
               


              En fin de compte mon personnage bouge et gère les collisions dans le fichier .txt ( fait juste de chiffre[les enums]), pas sur l'image.

              Petit diagramme :

              Fichier.txt de ma carte
              -->1-Gestion du mouvement
              -->2-"Display" sur l'écran.
              • Partager sur Facebook
              • Partager sur Twitter
              Anonyme
                19 avril 2006 à 9:59:14

                aa ouaiiii je comprend la! tu fait un calcul pour savoir quel case du tableau
                aura telle valeur de maniere a dire si c'est un arbre ou pas non?

                et une question comment tu fait pour coller tes surface après tu utilise le tableau non?

                et une derniere question:
                mais moi je comprend pas ce que veut dire decalage sa symbolise koi? o_O
                le decalage oui mais de quoi?

                et une derniere demande:
                tu peux regarder mon code pour integrer une collision parceque la je croit pas que j'ai cadriller pourtant le personnage ne depasse pas les cadre.
                #include <stdio.h>
                #include <stdlib.h>
                #include <SDL/SDL.h>
                #include <SDL/SDL_image.h>
                #define BLOC 10
                void deplacement(SDL_Surface *ecran)
                {
                    SDL_Surface *personnager = NULL;
                    SDL_Surface *personnager2 = NULL;
                    SDL_Surface *personnager3 = NULL;
                    SDL_Surface *personnager4 = NULL;
                    SDL_Surface *caisse = NULL;
                    personnager = SDL_LoadBMP("bonhomme.bmp");
                    personnager2 = SDL_LoadBMP("bonhomme2.bmp");
                    personnager3 = SDL_LoadBMP("bonhomme3.bmp");
                    personnager4 = SDL_LoadBMP("bonhomme4.bmp");
                    caisse = SDL_LoadBMP("caisse.bmp");
                    SDL_SetColorKey(personnager,SDL_SRCCOLORKEY,SDL_MapRGB(ecran->format,255,0,255));
                    SDL_SetColorKey(personnager2,SDL_SRCCOLORKEY,SDL_MapRGB(ecran->format,255,0,255));
                    SDL_SetColorKey(personnager3,SDL_SRCCOLORKEY,SDL_MapRGB(ecran->format,255,0,255));
                    SDL_SetColorKey(personnager4,SDL_SRCCOLORKEY,SDL_MapRGB(ecran->format,255,0,255));
                    SDL_Rect POS;
                    POS.x = 0;
                    POS.y = 0;
                    SDL_Rect CAISSE;
                    CAISSE.x = 150;
                    CAISSE.y = 150;
                    SDL_Event personnage;
                    int continuer = 1;
                    SDL_BlitSurface(personnager,NULL,ecran,&POS);
                    SDL_BlitSurface(caisse,NULL,ecran,&CAISSE);
                    SDL_Flip(ecran);
                    SDL_EnableKeyRepeat(25,25);
                    while(continuer)
                    {
                    SDL_WaitEvent(&personnage);
                    if(personnage.type == SDL_QUIT)
                    {
                    continuer = 0;
                    }
                    else if(personnage.type == SDL_KEYDOWN)
                    {
                        if(personnage.key.keysym.sym == SDLK_ESCAPE)
                        {
                        continuer = 0;
                        }
                        if(personnage.key.keysym.sym == SDLK_UP)
                        {
                        if(collision2(&POS) == EXIT_SUCCESS)
                        {
                        POS.y = POS.y - BLOC;
                        SDL_FillRect(ecran,NULL,SDL_MapRGB(ecran->format,21,210,210));
                        SDL_BlitSurface(personnager4,NULL,ecran,&POS);
                        SDL_BlitSurface(caisse,NULL,ecran,&CAISSE);
                        SDL_Flip(ecran);
                        }
                        }
                        else if(personnage.key.keysym.sym == SDLK_DOWN)
                        {
                        if(collision4(&POS) == EXIT_SUCCESS)
                        {
                        POS.y = POS.y + BLOC;
                        SDL_FillRect(ecran,NULL,SDL_MapRGB(ecran->format,21,210,210));
                        SDL_BlitSurface(personnager,NULL,ecran,&POS);
                        SDL_BlitSurface(caisse,NULL,ecran,&CAISSE);
                        SDL_Flip(ecran);
                        }
                        }
                        else if(personnage.key.keysym.sym == SDLK_RIGHT)
                        {
                        if(collision3(&POS) == EXIT_SUCCESS)
                        {
                        POS.x = POS.x + BLOC;
                        SDL_FillRect(ecran,NULL,SDL_MapRGB(ecran->format,21,210,210));
                        SDL_BlitSurface(personnager2,NULL,ecran,&POS);
                        SDL_BlitSurface(caisse,NULL,ecran,&CAISSE);
                        SDL_Flip(ecran);
                        }
                        }
                        else if(personnage.key.keysym.sym == SDLK_LEFT)
                        {
                        if(collision(&POS) == EXIT_SUCCESS)
                        {
                        POS.x = POS.x - BLOC;
                        SDL_FillRect(ecran,NULL,SDL_MapRGB(ecran->format,21,210,210));
                        SDL_BlitSurface(personnager3,NULL,ecran,&POS);
                        SDL_BlitSurface(caisse,NULL,ecran,&CAISSE);
                        SDL_Flip(ecran);
                        }
                        }
                    }
                    }
                    SDL_FreeSurface(personnager);
                }

                int collision(SDL_Rect *POS)
                {
                 if(POS->x == 0)
                 {
                  return EXIT_FAILURE;
                 }
                 return EXIT_SUCCESS;
                }

                int collision2(SDL_Rect *POS)
                {
                 if(POS->y == 0)
                 {
                  return EXIT_FAILURE;
                 }
                 return EXIT_SUCCESS;
                }

                int collision3(SDL_Rect *POS)
                {
                 if(POS->x >= 450)
                 {
                  return EXIT_FAILURE;
                 }
                 return EXIT_SUCCESS;
                }

                int collision4(SDL_Rect *POS)
                {
                 if(POS->y >= 450)
                 {
                  return EXIT_FAILURE;
                 }
                 return EXIT_SUCCESS;
                }


                voilas sa c'est la partie "jouer" en quelque sorte
                • Partager sur Facebook
                • Partager sur Twitter
                  19 avril 2006 à 17:18:41

                  Je vais sûrement poster mon jeu bientôt alors tu vas voir comment j'ai fait pour coller les surfaces.

                  Je vais regarder ton code plus tard car la je suis à l'école
                  et je peux pas compiler :D.

                  Mon code de collision c'est pour un jeu à la Final Fantasy IV-VI.

                  1-Je fais une carte avec mon éditeur de carte( vraiment simple)
                  2-Je l'enregister sous un fichier.txt.

                  3- Lorsque je charge mon jeu, je charge ma carte avec le .txt, mais je sauvegarde le tout( le SDL_Surface *fond) en Bitmap.
                  4- Dans le jeu, c'est le bitmap qui bouge et non mon personnage.
                  ( et c'est pourquoi il y a des valeurs négatives dans ma position de fond)

                  5- Le décalage ici est une constante égale à par exemple 128( je ne suis pas sûr je n'ai pas mon code sous la main) car mon écran est de 288x288 et si je veux center mon personnage sur l'écran et pouvoir gérer les collisions avec je dois ajouter un décalage.
                  Au sinon , par exemple si je ne mets pas mon décalage et s'il y a un puit dans la prochaine position par en haut, le personnage va passer au travers et va entrer en collision 128 pixels avant.

                  if(HAUT)
                  {
                  if(carte[-((positionFond.y+TAILLE_BLOC-DECALAGE)/TAILLE_BLOC)]
                          [(-((positionFond.x-DECALAGE)/TAILLE_BLOC))]==COLLINE)
                  }

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Anonyme
                    19 avril 2006 à 18:04:47

                    a oki sa serai vraiment cool merci
                    mais.
                    moi ce que je comprend pas c'est comment dire a l'ordi de cadriller et de faire empecher une entiter de taverser une autre (collision) je comprend pas la je bloque completement... j'ai pas la 'notion' je pense...enfin voilas koi...
                    • Partager sur Facebook
                    • Partager sur Twitter
                      19 avril 2006 à 21:16:27

                      Par exemple pour mon éditeur de map avec des titles de 32x32,

                      1- La position est donné avec la position de la souris.

                      2- J'ai juste a faire une division avec des int(integer) pour que cela done des entier.

                      ex : si ma position de la souris est a 74,24, je divise en int : 74/32 = 2
                      et 24/32= 0 , donc la position sera :(2,0). Comme chaque title font 32x32, on multiplie par 32 des deux cotés :

                      2x32= 64, 2x0=0, donc position finales des titles (64,0)
                      • Partager sur Facebook
                      • Partager sur Twitter

                      SDL: probleme collision

                      × 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