CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[c] collision sdl

aldi88
aldi88
Niveau 6
13 juillet 2011 à 17:52:40

Bonjour a tous

je vien de faire un programme pour que quand box1 et box2 se rencontre le programme s’éteint (oui je sais c'est assez barbare ^^) le probleme et que sa ne marche pas et en plus sa ne me met pas de message d'erreur oO

le voici:

  1. include <stdlib.h>
  2. include <stdio.h>
  3. include <SDL/SDL.h>
  1. define true 1
  2. define false 0

void pause();

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

int Collision(SDL_Rect box2,SDL_Rect box1);

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_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);

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 */
}

if (Collision(positionb , positionZozor))

{
SDL_Quit();
}

SDL_FreeSurface(box1);
SDL_FreeSurface(box2);

pause();
SDL_Quit();

return EXIT_SUCCESS;

return 0;}

int Collision(SDL_Rect box2,SDL_Rect 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;
}
}

void pause()
{
int continuer = 1;
SDL_Event event;

while (continuer)
{
SDL_WaitEvent(&event);
switch(event.type)
{
case SDL_QUIT:
continuer = 0;
}
}
}

tbop2
tbop2
Niveau 10
13 juillet 2011 à 18:19:04

Salut. Peux tu la prochaine fois copier ton code dans pastebin s'il te plait ?

Simple question : il est de toi ce code ou tu l'as recopie du sdz brut de decoffrage ?

Pocolo
Pocolo
Niveau 10
13 juillet 2011 à 19:29:30

https://www.jeuxvideo.com/forums/0-31-0-1-0-1-1-aldi88.htm

Ben alors, tu n'as toujours pas réussi a vérifier si il y a collision entre deux AABB?

Ça montre que tu ne comprends pas vraiment ce que tu écris, tu devrais revoir les bases je pense.

tbop2
tbop2
Niveau 10
13 juillet 2011 à 19:47:27

Ah je me disais bien que j'avais déjà vu ça quelque part en plus ! A force ça sent un peu le troll tout de même.

Pocolo
Pocolo
Niveau 10
13 juillet 2011 à 19:54:21

Sinon je viens de regarder le code rapidement et il y a des erreurs assez grossières, il y a vraiment des trucs à revoir.

C'est normal que le programme ne se ferme pas lorsque les deux rectangles se touchent car tu as mis la condition en dehors de la boucle principale donc le programme vérifie seulement si ils se touchent lorsque tu mets fin a la boucle, autrement dit lorsque tu fermes le programme, ça n'a aucun sens.

Sinon il me semble que je te l'avais deja dit sur un de tes autres topic mais SDL_Quit ne sert PAS a quitter le programme, c'est une fonction qui ferme tous les sous-systèmes de la SDL et libère la mémoire utilisée par celle-ci.

Il faut que tu mettes la condition dans la boucle principale et d'autre part de mettre ta variable "continuer" a 0 si il y a collision afin de mettre fin à la boucle.
A noter aussi que "Collision" devrait être un booléen vu que c'est juste une question de vrai ou faux, tu économises ainsi 3 bytes.

A part ça il y a d'autres bizarreries dans le code notamment le "return EXIT_SUCCESS" suivi de "return 0", ce dernier ne sert a rien puisque tu viens déjà de retourner 0 avec "return EXIT_SUCCESS" et que tu as déjà mis fin a la fonction.

Bref beaucoup de fautes, on voit bien que tu as juste recopié le code et ajouté des trucs par-ci par-là.

aldi88
aldi88
Niveau 6
13 juillet 2011 à 20:35:27

Si je comprend se que je met mais certain truck que je ne comprenait pas la venais d'un autres forum,pis je n'avait pas tant d'erreur que sa, pour la condition dans la boucle principale j'avoue que la j'ai fait fort ^^ et autrement pour le SDL_quite il est vrais que tu me l'avait bien explique, en tout qu'a la je viens de réussir (grâce a vous) la collision (bon maintenant j'ai fait une vrais collision plus de "fermer le programme" ^^)
tout sa pour vous dire un grand merci a toi en particulier et a tout les forumer pour les aide qui peuvent apporter a ceux qui on du mal (beaucoup dans mon cas ^^),car la théorie telle que le site du zeros peut être bien mais la pratique et le je cherche a droit et a gauche peut être mieux pour certain , pourtant les cours je connait (je suis en premier).

merci.

Pocolo
Pocolo
Niveau 10
13 juillet 2011 à 20:54:58

" en tout qu'a la je viens de réussir (grâce a vous) la collision "

En programmation c'est bien de réussir à faire quelque chose mais c'est encore mieux si l'on comprends comment on l'a fait, je ne suis pas sur que ce soit le cas ici hélas. :peur:

Odolwan
Odolwan
Niveau 10
14 juillet 2011 à 14:23:52

J'ai pas l'impression que tu as tout bien compris. :noel:

Bon je vais expliquer à ma façon. Peut-être que ça aidera une autre personne par la suite.

Le truc que tous les programmeurs font, c'est de penser à l'envers. En gros on ne va pas chercher quand la AABB1 est en collision avec la AABB2 mais quand :d) elle ne l'est pas :g)

Donc pour le calcul sur l'axe x ça donne :

if(!(AABB1.x > (AABB2.x + AABB2.w) ||( AABB1.x + AABB1.w) < AABB2.x)
{
//Si AABB1 n'est pas totalement à droite OU totalement à gauche de AABB2, c'est que forcement il y a collision.
}

Si tu as compris le principe, tu peux l'appliquer facilement pour l'axe y.

C'est ce qui est utilisé pour calculer si la souris se trouve dans la zone d'un bouton. Pour les menus par exemple.

Sous forums
  • Aide à l'achat Mac
  • Macintosh
  • Création de Jeux
  • Programmation
  • Création de sites web
  • Linux
  • Internet
  • Steam Deck
  • Hardware
La vidéo du moment