Collision dans sdl

Bonjour a tous,

je débute dans la sdl et j'ai de gros (énorme)problème pour la collision, je voudrais savoir comment faire pour que quand zozor rencontre b il y aille une collision:

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

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

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

b = SDL_LoadBMP("icon.bmp");
zozor = SDL_LoadBMP("cb.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;

positionb.x = 0;
positionb.y = 0;
SDL_EnableKeyRepeat(10, 10);
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);
SDL_BlitSurface(b, NULL, ecran, &positionb);
SDL_Flip(ecran); /* On met à jour l'affichage */
}

SDL_FreeSurface(zozor);
SDL_Quit();

return EXIT_SUCCESS;
}

SVP répondez je suis vraiment a cour d'idée la...

5 réponses

  • Votes
  • Date
  • Date décroissante
  1. déclare ta structure AABB avant le main

    a+

    N'attribuez jamais à la malveillance ce qui s'explique très bien par l'incompétence.Le logiciel, c'est comme le sexe, c'est meilleur quand c'est libre/gratuit
    1. ne saute pas des étape si tu poursuit les cours sur le site du zerro, il vont te montrer comment faire un mini jeux avec mario et la tu a tout dedans pour la gestion de colision
      1. Oui c'est justement la que je ne comprend plus la collision.
        1. bon j'ai un peut avancer depuis maintenant j'ai sa :

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

          #define true 1
          #define false 0

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

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

          box2 = SDL_LoadBMP("icon.bmp");
          box1 = SDL_LoadBMP("cb.bmp");
          SDL_SetColorKey(box1, SDL_SRCCOLORKEY, SDL_MapRGB(box1->format, 0, 0, 255));

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

          positionb.x = 0;
          positionb.y = 0;
          SDL_EnableKeyRepeat(10, 10);

          struct AABB
          {
          int x;
          int y;
          int w;
          int h;
          };

          struct AABB box;

          box.x = 50;
          box.y = 500;
          box.w = 800;
          box.h = 101;

          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(box1, NULL, ecran, &positionZozor);
          SDL_BlitSurface(box2, NULL, ecran, &positionb);
          SDL_Flip(ecran); /* On met à jour l'affichage */
          }

          SDL_FreeSurface(box1);
          SDL_Quit();

          return EXIT_SUCCESS;
          }

          return 0;}

          bool Collision(AABB box1,AABB box2)
          {
          if((box2.x >= box1.x + box1.w) // trop à droite
          || (box2.x + box2.w <= box1.x) // trop à gauche
          || (box2.y >= box1.y + box1.h) // trop en bas
          || (box2.y + box2.h <= box1.y)) // trop en haut
          return false;
          else
          return true;
          }

          mais il met comme problème :

          C:\Users\harry\Documents\testsdl - Copie\main.cpp|117|error: 'AABB' was not declared in this scope|
          1. Un grand merci pour la réponse maintenant j'ai plus de message d'erreur mais... sa ne marche toujours pas, svp aider moi je n'arrive vraiment pas...

            voila se que j'ai:

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

            #define true 1
            #define false 0

            struct AABB
            {
            int x;
            int y;
            int w;
            int h;
            };
            int main(int argc, char *argv[])
            {{
            SDL_Surface *ecran = NULL , *box1 = NULL , *box2 = NULL;
            SDL_Rect positionZozor;
            SDL_Rect positionb;
            SDL_Event event;
            int continuer = 1;
            SDL_Rect AABB;

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

            box2 = SDL_LoadBMP("icon.bmp");
            box1 = SDL_LoadBMP("cb.bmp");
            SDL_SetColorKey(box1, SDL_SRCCOLORKEY, SDL_MapRGB(box1->format, 0, 0, 255));

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

            positionb.x = 0;
            positionb.y = 0;
            SDL_EnableKeyRepeat(10, 10);

            struct AABB box;

            box.x = 50;
            box.y = 500;
            box.w = 800;
            box.h = 101;

            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(box1, NULL, ecran, &positionZozor);
            SDL_BlitSurface(box2, NULL, ecran, &positionb);
            SDL_Flip(ecran); /* On met à jour l'affichage */
            }

            SDL_FreeSurface(box1);
            SDL_FreeSurface(box2);
            SDL_Quit();

            return EXIT_SUCCESS;
            }

            return 0;}

            bool Collision(AABB box1,AABB box2)
            {
            if((box2.x >= box1.x + box1.w) // trop à droite
            || (box2.x + box2.w <= box1.x) // trop à gauche
            || (box2.y >= box1.y + box1.h) // trop en bas
            || (box2.y + box2.h <= box1.y)) // trop en haut
            return false;
            else
            return true;
            }