SDL collision

Fermé
riri785 Messages postés 13 Date d'inscription jeudi 13 août 2009 Statut Membre Dernière intervention 22 janvier 2012 - 10 juil. 2011 à 16:22
riri785 Messages postés 13 Date d'inscription jeudi 13 août 2009 Statut Membre Dernière intervention 22 janvier 2012 - 11 juil. 2011 à 12:21
Bonjour, a tous

je débute a la sdl et je n'arrive pas a faire les collision , j'aimerais que quand box1 rencontre box2 il y aille une collision, mais voila quand je met ça:



#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;
}



il n'y a pas de message d'erreur ni de collision malheureusement, aider moi svp je suis complètement bloquer.

8 réponses

Bonjour,

Tu as une très jolie fonction Collision, qui a l'air correctement écrite, mais tu ne l'appelles jamais. Pourquoi ferait-elle quelque chose ?
1
premier problème :
Il ne faut pas déclarer bool Collision; puisque Collision est une fonction. Il faut déclarer (avant main) ta fonction :
bool Collision(AABB box1,AABB box2);
C'est ce qu'on appelle le prototype de la fonction. Comme ça le compilateur sait à quoi va ressembler la fonction avant de trouver sa définition qui, elle, se situe après.

deuxième problème :
Note que quand tu écris
if (Collision(box1, box2)); 
SDL_Quit;
Il n'y a qu'une seule instruction soumise au if. Si tu veux qu'il y en ait plusieurs, il faut les entourer avec des accolades {}
Le hic dans ton cas, c'est que l'instruction qui suit le if c'est le ; (instruction vide). Je suppose que tu voulais que ce soit SDL_Quit(). Enlève le ; qui suit le if sinon su sortiras à tous les coups
1
riri785 Messages postés 13 Date d'inscription jeudi 13 août 2009 Statut Membre Dernière intervention 22 janvier 2012
10 juil. 2011 à 22:10
Merci merci bien, j'ai avancer, mais je voulais savoir en quoi je peut déclarer "collision" parce que j'ai mit en bool mais sa ne marche 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;
bool Collision;






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;
}
if (Collision(box1, box2));
SDL_Quit;



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;
}

et sa me met: 'Collision' cannot be used as a function|


PS:oui je sais c'est bizarre de vouloir fermer le programme quand il y a une collision mais c'est un test ^^
0
riri785 Messages postés 13 Date d'inscription jeudi 13 août 2009 Statut Membre Dernière intervention 22 janvier 2012
10 juil. 2011 à 22:47
Bon alors je me suis rendue conte de ma con***ie ^^ maintenent j'ai sa :



#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;
int Collision = 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);

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;

if (Collision);
{


SDL_Quit();
}



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 box2,AABB box1);
{
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 maintenant sa me met ça :
'box2' was not declared in this scope|



svp aider moi je désespère la ^^
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
As-tu vu mon message de 22h45 ?
0
riri785 Messages postés 13 Date d'inscription jeudi 13 août 2009 Statut Membre Dernière intervention 22 janvier 2012
10 juil. 2011 à 23:12
oups non dsl...
alors j'ai suivie t'es conseil et 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;
};

bool Collision(AABB box1,AABB box2);

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;

if (Collision)
{


SDL_Quit();
}



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 box2,AABB box1);
{
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 j'ai toujour les problemes avec box1 et box2 :

error: 'box2' was not declared in this scope|

pourtant il est bien déclarer en SDL_Rect vue qui prend ''positionb''
0
Tu n'indiques pas à quelle ligne cette erreur est détectée...
Tu as ajouté une erreur qui n'y était pas au départ : un pointvirgule à la fin de bool Collision(AABB box2,AABB box1); lors de la définition de la fonction. Et ne dis pas que c'est moi qui t'ai dit de le mettre, moi je t'ai dit d'en mettre à la déclaration du prototype.
Et tu n'appelles toujours pas ta fonction Collision.
D'ailleurs, cette fonction détecte la collisioen entre deux structures AABB.
Et tu as redonné ce nom AABB à un objet de type SDL_Rect, ce qui est une source de confusion garantie.

Tu vas sans doute me trouver sévère, mais je crois vraiment que tu ne maîtrises pas les notions les plus élémentaires du C++ et que tu devrais commencer par quelque chose de beaucoup, beaucoup plus simple.
Et surtout commencer par apprendre avant d'appliquer : là tu donnes l'impression de faire le contraire.
0
riri785 Messages postés 13 Date d'inscription jeudi 13 août 2009 Statut Membre Dernière intervention 22 janvier 2012
11 juil. 2011 à 12:21
Non je ne te trouve pas sévère tu a tout a fait raison , mais sa fessait longent que je n'avait pas fait de la programmation j'ai oublier surement des notions, et j'ai tenté de mis mettre en fessant de la pratique.

mais tu dit quelque chose de plus simple, es que tu peut me dire se que je devrais faire pour vraiment mis remettre stp ?

ps: en tout qu'a merci bien pour tout t'es réponses.
0