Partage
  • Partager sur Facebook
  • Partager sur Twitter

problème de colision SDL2

Sujet résolu
    4 juillet 2023 à 7:02:47

    Bonjour, j'ai essayer plusieurs chose pour résoudre mon problème mais les collisions de mes deux texture, que j'ai nommé rect et rectP1 ne fonctionne pas correctement, ou pour être plus précis, je n'arrive à faire fonctionner que un coté à la fois, sa dépend quel "if" je mais en premier.

    Si je mais en premier le "if" qui détecte si le coté droit de mon personnage (rect) à toucher le coté gauche de l'obstacle (rectP1) et en deuxième un "else if" qui fait l'inverse, donc qui détecte si le coté gauche de mon personnage à toucher le coté droit de l'obstacle, quand le coté droit de mon personnage va toucher le coté gauche de l'obstacle, sa va me téléporter le personnage juste à coté du coté gauche de l'obstacle, donc pour l'instant tous fonctionne bien, mais si le coté gauche du personnage touche le coté droit de l'obstacle, au lieu de me le téléporter à coté du coté droit de l'obstacle, sa va le téléporter à coté du coté gauche de l'obstacle, et si j'inverse le if et le else if, sa va me faire l'inverse (je sais pas si j'ai très bien expliquer).

    Voici la partie du code qui fait fonctionner les collisions, je pense pas qu'il y est besoin du reste du code : 

    if(SDL_HasIntersection(&rect, &rectP1) == SDL_TRUE)
            {
                int rectP1G = rectP1.x;
                int rectP1D = rectP1.x + rectP1.w;
                int rectG = rect.x;
                int rectD = rect.x + rect.w;
    
                if(rectD = rectP1G)
                {
                    rect.x = rectP1G - rect.w;
                }
                else if(rectG == rectP1D)
                {
                    rect.x = rectP1D;
                }
            }
    • Partager sur Facebook
    • Partager sur Twitter
      4 juillet 2023 à 9:23:43

                  if(rectD = rectP1G)
      Ceci est une affectation  !
      • Partager sur Facebook
      • Partager sur Twitter
      ...
        4 juillet 2023 à 10:39:08

        je crois que quand c'est dans un if se n'est pas une affectation (si j'ai bien compris ce que sa voulait dire).

        et faut pas faire attention au == qu'il y a dans le else if, j'ai oublier de remettre juste un = quand j'ai copier coller le code.

        -
        Edité par MorgadPrudhon 4 juillet 2023 à 10:41:38

        • Partager sur Facebook
        • Partager sur Twitter
          4 juillet 2023 à 11:26:35

          Dans un if ou pas, c'est une affectation ! 

          MorgadPrudhon a écrit:

          et faut pas faire attention au == qu'il y a dans le else if, j'ai oublier de remettre juste un = quand j'ai copier coller le code. 

          Et que voulais-tu donc mettre à la place ?

          Il va falloir revoir tes base avant de t'attaquer à SDL !

          Fais un vrai copier-coller au lieu de retaper le texte à la main !

          Bon du coup, on ne sait plus ce qui est bon et pas dans ton code ?

          • Partager sur Facebook
          • Partager sur Twitter
          ...
            4 juillet 2023 à 11:38:12

            Salut

            rectD = rectP1G;

            Ce code affecte le contenu de la variable rectP1G à rectD.

            if(rectD = rectP1G)

            Ce code affecte le contenu de la variable rectP1G à rectD, et évalue ce contenu dans le cadre du test if, et si ce contenu est différent de 0, le test passe (0 signifie "faux" et toute autre valeur signifie "vrai").

            Donc, si rectP1G contient autre chose que 0, ce test sera toujours évalué à "vrai" et le code qui suit entre les accolades sera exécuté.

            Ce n'est sans doutes pas ce que tu veux faire.

            L'opérateur de comparaison est ==.

            • Partager sur Facebook
            • Partager sur Twitter
              4 juillet 2023 à 11:42:53

              Bonjour,

              Si tu veux tester si rectD est égal à rectP1G, il faut écrire

              if(rectD == rectP1G)

              Dans l'instruction

              if(rectD = rectP1G)

              tu affectes rectP1G à rectD, et donc elle renvoie TRUE, donc on va toujours dans le bloc qui suit

              Regarde ce code, il affiche toujours "ok" :

              #include<stdio.h>
              
              int main(void)
              {
                  int a=1;
                  int b=2;
              
                  if(a=b)
                  {
                      printf("ok");
                  }
                  return(0);
              }




              • Partager sur Facebook
              • Partager sur Twitter
                4 juillet 2023 à 11:59:51

                oui je sais que normalement il faut mettre == mais quand je fais sa mon personnage passe à travers l'obstacle.

                -
                Edité par MorgadPrudhon 4 juillet 2023 à 12:00:23

                • Partager sur Facebook
                • Partager sur Twitter
                  4 juillet 2023 à 13:26:58

                  Au début, l'un est à la gauche de l'autre. On peut dire qu'il est "avant" l'autre.


                  Peut-être que le test est '<=' au lieu de '==' ?

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Le Tout est souvent plus grand que la somme de ses parties.

                    4 juillet 2023 à 13:37:47

                    "oui je sais que normalement il faut mettre == mais quand je fais ça mon personnage passe à travers l'obstacle."

                    ... et donc, à tout hasard, tu met un simple = !

                    Pas de hasard là-dedans, ce sont les bases de la programmation

                    Par contre Pierrot a surement raison ...

                    • Partager sur Facebook
                    • Partager sur Twitter
                      4 juillet 2023 à 16:27:36

                      Problème résolu, enfaite le problème venais que avant je m'était = au lieu de ==, mais aussi le problème venais surtout du fait que je créais mes variable dans la condition 
                      if(SDL_HasIntersection(&rect, &rectP1) == SDL_TRUE)

                      ce qui faisais que, pour une raison que j'ignore, mon personnage traversais l'obstacle.

                      Merci pour votre aide et est ce que quelqu'un peut m'expliquer pourquoi crée des variable dans cette condition faisait que les autres condition contenant == qui était à l'intérieur de cette condition ne fonctionnais pas mais que celle contenant = fonctionnait?

                      • Partager sur Facebook
                      • Partager sur Twitter
                        4 juillet 2023 à 17:33:55

                        C'est pas je m'étais =

                        c'est je mettais = (du verbe mettre)

                        La différence, on te l'a déjà expliquée plus haut

                        • Partager sur Facebook
                        • Partager sur Twitter
                          4 juillet 2023 à 19:49:30

                          rouIoude a écrit:

                          Il va falloir revoir tes base avant de t'attaquer à SDL !

                          Déjà dit, mais manifestement ça n'a servi à rien :-°

                          • Partager sur Facebook
                          • Partager sur Twitter

                          On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                            4 juillet 2023 à 20:35:53

                            je demandais pas quel était la différence entre = et == je demandais pourquoi crée des variables dans la condition 
                            if(SDL_HasIntersection(&rect, &rectP1) == SDL_TRUE)

                            faisait que mon personnage traversais l'obstacle. La différence entre = et == je la connais, si au début je mettais = au lieu de == c'étais car == me faisais traverser l'obstacle alors que = bloquais bien mon personnage, donc même si c'était pas logique vu que sa bloquais mon personnage j'y avais laisser comme sa, mais j'avoue que j'avais oublier que 0 signifiait faux et 1 vrai en informatique. Et désoler pour les fautes d'orthographes.

                            • Partager sur Facebook
                            • Partager sur Twitter
                              4 juillet 2023 à 20:46:30

                              Les variables que tu as créée dans le bloc de la condition que tu présentes, qu'elles soient déclarées en dehors ou à l’intérieur du bloc ne change rien ! Tu as du modifier autre chose dans tes expérimentations. Mais comme on ne voit pas le code, on ne peut t'en dire plus.

                              • Partager sur Facebook
                              • Partager sur Twitter
                              ...
                                4 juillet 2023 à 20:48:06

                                MorgadPrudhon a écrit:

                                ....si au début je mettais = au lieu de == c'étais car == me faisais traverser l'obstacle alors que = bloquais bien mon personnage, donc même si c'était pas logique vu que sa bloquais mon personnage ....


                                Quand je lis ça (et d'autres commentaires dans ton post précédent), je me dis que tu ne sais absolument pas ce que tu fais.

                                -
                                Edité par edgarjacobs 4 juillet 2023 à 20:49:25

                                • Partager sur Facebook
                                • Partager sur Twitter

                                On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                                  4 juillet 2023 à 21:11:35

                                  En ayant regardé ton code d'un peu plus prés les actions que tu apportes dans tes conditions affecte la même la valeur que le personnage a déjà. Donc ne change rien. Si chez toi elle change c'est dans une partie du code que tu ne montre pas !

                                  J'ai intégré ton code dans un fichier source pour vérifier : (j'ai un peu renommé les variables pour m'y retrouver)

                                  #include <stdio.h>
                                  
                                  typedef struct
                                  {
                                      int x;
                                      int w;
                                  } Rect;
                                  
                                  int main(void)
                                  {
                                      Rect obstacle = {20, 10};
                                      Rect personnage = {10, 10};    
                                  
                                      if(1) //  if(SDL_HasIntersection(&rect, &rectP1) == SDL_TRUE)
                                      {
                                          int obstacleG = obstacle.x;
                                          int obstacleD = obstacle.x + obstacle.w;
                                  
                                          int personnageG = personnage.x;
                                          int personnageD = personnage.x + personnage.w;
                                  
                                          if(personnageD == obstacleG)
                                          {
                                              personnage.x = obstacleG - personnage.w;
                                              puts("Personnage touche a droite");
                                          }
                                          else if(personnageG == obstacleD)
                                          {
                                              personnage.x = obstacleD;
                                              puts("Personnage touche a gauche");
                                          }
                                          printf("Personnage x : %d", personnage.x);
                                      }
                                  
                                      return 0;
                                  }



                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                  ...
                                    4 juillet 2023 à 22:53:51

                                    voici mon code en entier (juste la fonction main) 
                                    #include <exception>
                                    #include <string>
                                    #include <iostream>
                                    #include <SDL.h>
                                    #include <stdio.h>
                                    #include <stdlib.h>
                                    #include "fonctions.h"
                                    
                                    int main(int argc, char* argv[])
                                    {
                                       SDL_Window *window = NULL;
                                       SDL_Renderer *renderer = NULL;
                                       SDL_Event event;
                                       SDL_Texture *texture, *textureCopy = NULL;
                                       SDL_bool quit = SDL_FALSE;
                                       SDL_Surface *surface = NULL;
                                       int statue = EXIT_FAILURE;
                                       SDL_Rect rect = {0, 0, 80, 80};
                                       int wWindow = 0;
                                       int hWindow = 0;
                                       SDL_Color bleuCiel = {0, 222, 255, 255};
                                       int AdiTailleFenetre = 0;
                                       SDL_Texture *textureE1 = NULL;
                                       SDL_Texture *textureE1Copy = NULL;
                                       SDL_Surface *surfaceE1 = NULL;
                                       SDL_Rect rectE1 = {500, 220, 60, 60};
                                       SDL_Texture *plateforme1 = NULL;
                                       SDL_Texture *plateforme1Copy = NULL;
                                       SDL_Surface *surfacePlateforme;
                                       SDL_Rect rectP1 = {200, 0, 60, 60};
                                    
                                       if(0 != SDL_Init(SDL_INIT_VIDEO))
                                       {
                                           fprintf(stderr, "Erreur SDL_Init() : %s", SDL_GetError());
                                           goto Quit;
                                       }
                                    
                                       window = SDL_CreateWindow("TEST", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 640, 480, SDL_WINDOW_RESIZABLE);
                                       if(NULL == window)
                                       {
                                           fprintf(stderr, "Erreur SDL_CreateWindow() : %s", SDL_GetError());
                                           goto Quit;
                                       }
                                    
                                       renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
                                       if(NULL == renderer)
                                       {
                                           fprintf(stderr, "Erreur SDL_CreateRenderer() : %s", SDL_GetError());
                                           goto Quit;
                                       }
                                    
                                       surface = SDL_LoadBMP("Test1.bmp");
                                       if(NULL == surface)
                                       {
                                           fprintf(stderr, "Erreur SDL_LoadBMP() : %s", SDL_GetError());
                                           goto Quit;
                                       }
                                       surfacePlateforme = SDL_LoadBMP("test2.bmp");
                                    
                                       surfaceE1 = SDL_LoadBMP("test3.bmp");
                                    
                                       SDL_RenderClear(renderer);
                                    
                                       texture = SDL_CreateTextureFromSurface(renderer, surface);
                                       if(texture == NULL)
                                       {
                                           fprintf(stderr, "Erreur SDL_CreateTextureFromSurface() : %s", SDL_GetError());
                                           goto Quit;
                                       }
                                       plateforme1 = SDL_CreateTextureFromSurface(renderer, surfacePlateforme);
                                    
                                       textureE1 = SDL_CreateTextureFromSurface(renderer, surfaceE1);
                                    
                                       textureCopy = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_TARGET, surface->w, surface->h);
                                       if(NULL == textureCopy)
                                       {
                                           fprintf(stderr, "Erreur SDL_CreateTexture() : %s", SDL_GetError());
                                           goto Quit;
                                       }
                                       plateforme1Copy = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_TARGET, surfacePlateforme->w, surfacePlateforme->h);
                                    
                                       textureE1Copy = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_TARGET, surfaceE1->w, surfaceE1->h);
                                    
                                                SDL_SetRenderTarget(renderer, textureCopy);
                                                SDL_RenderCopy(renderer, texture, NULL, NULL);
                                                SDL_SetRenderTarget(renderer, NULL);
                                                SDL_RenderCopy(renderer, texture, NULL, &rect);
                                                SDL_SetRenderTarget(renderer, textureE1Copy);
                                                SDL_RenderCopy(renderer, textureE1, NULL, NULL);
                                                SDL_SetRenderTarget(renderer, NULL);
                                                SDL_RenderCopy(renderer, textureE1, NULL, &rectE1);
                                                SDL_SetRenderTarget(renderer, plateforme1Copy);
                                                SDL_RenderCopy(renderer, plateforme1, NULL, NULL);
                                                SDL_SetRenderTarget(renderer, NULL);
                                                SDL_RenderCopy(renderer, plateforme1, NULL, &rectP1);
                                                SDL_RenderPresent(renderer);
                                                SDL_FreeSurface(surface);
                                                SDL_FreeSurface(surfaceE1);
                                    
                                       while(!quit)
                                       {
                                            SDL_RenderClear(renderer);
                                            SDL_SetRenderDrawColor(renderer, bleuCiel.r, bleuCiel.g, bleuCiel.b, bleuCiel.a);
                                            SDL_GetWindowSize(window, &wWindow, &hWindow);
                                                    AdiTailleFenetre = wWindow+hWindow;
                                                    rect.w = AdiTailleFenetre/2/8;
                                                    rect.h = AdiTailleFenetre/2/8;
                                                    rect.y = hWindow-rect.h;
                                            SDL_RenderCopy(renderer, texture, NULL, &rect);
                                                        SDL_SetRenderTarget(renderer, textureE1Copy);
                                                SDL_RenderCopy(renderer, textureE1, NULL, NULL);
                                                SDL_SetRenderTarget(renderer, NULL);
                                                SDL_RenderCopy(renderer, textureE1, NULL, &rectE1);
                                                SDL_RenderCopy(renderer, plateforme1, NULL, &rectP1);
                                                rectP1.y = rect.y + rect.h - rectP1.h;
                                    
                                                int rectP1G = rectP1.x;
                                                int rectP1D = rectP1.x + rectP1.w;
                                                int rectP1H = rectP1.y;
                                                int rectP1B = rectP1.y - rectP1.h;
                                                int rectG = rect.x;
                                                int rectD = rect.x + rect.w;
                                                int rectH = rect.y;
                                                int rectB = rect.y - rect.h;
                                    
                                            SDL_RenderPresent(renderer);
                                    
                                           SDL_WaitEvent(&event);
                                           if(event.type == SDL_QUIT)
                                            quit = SDL_TRUE;
                                            else
                                            {
                                                if(event.type == SDL_KEYDOWN)
                                            {
                                                if(event.key.keysym.sym == SDLK_d)
                                                {
                                                rect.x = rect.x + 2;
                                                MiseAJSprite(rect, renderer, texture);
                                                }
                                    
                                                if(event.key.keysym.sym == SDLK_q)
                                                {
                                                    rect.x = rect.x - 2;
                                                    SDL_RenderClear(renderer);
                                                    SDL_RenderCopy(renderer, texture, NULL, &rect);
                                                    SDL_RenderPresent(renderer);
                                                }
                                                if(event.key.keysym.sym == SDLK_SPACE)
                                                {
                                                 saut(rect, renderer, texture, event);
                                                }
                                            }
                                            if(event.type == SDL_WINDOWEVENT)
                                            {
                                                if(event.window.event == SDL_WINDOWEVENT_RESIZED)
                                                {
                                                    SDL_GetWindowSize(window, &wWindow, &hWindow);
                                                    AdiTailleFenetre = wWindow+hWindow;
                                                    rect.w = AdiTailleFenetre/2/8;
                                                    rect.h = AdiTailleFenetre/2/8;
                                                    rect.y = hWindow-rect.h;
                                                    rectP1.w = AdiTailleFenetre/2/8;
                                                    rectP1.h = AdiTailleFenetre/2/8;
                                                    rectP1.y = hWindow-rectP1.h;
                                                    SDL_RenderClear(renderer);
                                                    SDL_RenderCopy(renderer, texture, NULL, &rect);
                                                    SDL_RenderPresent(renderer);
                                    
                                                }
                                            }
                                            if(SDL_HasIntersection(&rect, &rectP1) == SDL_TRUE)
                                            {
                                                if(rectD == rectP1G)
                                                {
                                                    rect.x = rectP1G - rect.w;
                                                }
                                                if(rectG == rectP1D)
                                                {
                                                    rect.x = rectP1D;
                                                }
                                                if(rectB == rectP1H)
                                                {
                                                    rect.y = rectP1H + rect.h;
                                                }
                                            }
                                            }
                                       }
                                    
                                    
                                    
                                       statue = EXIT_SUCCESS;
                                    
                                       Quit:
                                    
                                           if(NULL != textureCopy)
                                            SDL_DestroyTexture(textureCopy);
                                           if(NULL != texture)
                                            SDL_DestroyTexture(texture);
                                           if(NULL != renderer)
                                            SDL_DestroyRenderer(renderer);
                                           if(NULL != window)
                                            SDL_DestroyWindow(window);
                                           SDL_Quit;
                                    }
                                    Et pour dans la condition 
                                    if(SDL_HasIntersection(&rect, &rectP1) == SDL_TRUE)

                                    J'ai vérifier plusieurs fois et quand je crée les variables dans cette condition mon personnage traverse l'obstacle mais quand je crée juste les variables autre par dans le code et que je ne change rien d'autre, les collision fonctionne bien.

                                    Et est ce que, au passage, quelqu'un peut me dire pourquoi 

                                    if(rectB == rectP1H)

                                    ne fonctionne pas car je ne vois pas pourquoi sa ne fonctionne pas.

                                    Et je sais que c'est le bazar dans mon code mais je créerais d'autre fonctions pour que le code sois plus propre quand j'aurais réussi à faire fonctionner certaine chose dont je veux m'occuper d'abord dans mon programme (les collisions en font partie). 

                                    edit : j'ai réussi à faire fonctionner la condition 

                                    if(rectB == rectP1H)

                                    en modifiant le == en <= mais maintenant c'est le résultat de la condition, 

                                    rect.y = rectP1H + rect.h;

                                    qui ne veut pas fonctionner

                                    -
                                    Edité par MorgadPrudhon 5 juillet 2023 à 0:07:01

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      5 juillet 2023 à 0:24:10

                                      MorgadPrudhon a écrit:

                                      J'ai vérifier plusieurs fois et quand je crée les variables dans cette condition mon personnage traverse l'obstacle mais quand je crée juste les variables autre par dans le code et que je ne change rien d'autre, les collision fonctionne bien.

                                      Et est ce que, au passage, quelqu'un peut me dire pourquoi 

                                      Et bien quand tu les définies là où on les voit dans ton code et ou tu les utilises dans ton bloc if(SDL_HasIntersection... le personnage c'est déplacé entre temps.

                                      Si tu peine à suivre le déroulement de ton code tu peux utiliser un débogueur.

                                      Aussi, active les Warnings, ça te donneras des indices sur les erreurs que tu as pu faire. (il y en a quelques une). 

                                      Que font ces includes de fichiers entête C++ dans ton code ? Tu compiles en C++ ?

                                      -
                                      Edité par rouIoude 5 juillet 2023 à 0:26:02

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                      ...
                                        5 juillet 2023 à 0:57:59

                                        d'accord je pense avoir compris.

                                        Comment on active les warnings? 

                                        Non je ne compile pas en C++ mais à chaque fois j'oubli les quel ils faut enlever et comme sa na pas l'air de causer de problème je prend pas le temps d'aller regarder les quels il faut enlever.

                                        edit : Pour la condition 

                                        if(rectB <= rectP1H)

                                        qui avant était 

                                        if(rectB == rectP1H)

                                        c'est bon j'ai réussi à tous faire fonctionner correctement, maintenant mon personnage peut aller sur l'obstacle.


                                        -
                                        Edité par MorgadPrudhon 5 juillet 2023 à 1:13:18

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          5 juillet 2023 à 10:36:47

                                          MorgadPrudhon a écrit:

                                          Comment on active les warnings? 

                                          Ça dépend des compilateurs, sur gcc, il faut mettre au minimum les options de compilation -Wall et -Wextra

                                          MorgadPrudhon a écrit:

                                          Non je ne compile pas en C++ mais à chaque fois j'oubli les quel ils faut enlever et comme sa na pas l'air de causer de problème je prend pas le temps d'aller regarder les quels il faut enlever.

                                          Et si, sinon ça poserait problème, la compilation échouerait !

                                          -
                                          Edité par rouIoude 5 juillet 2023 à 10:37:52

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                          ...

                                          problème de colision SDL2

                                          × 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