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

gestion des collision sur SDL

aldi88
aldi88
Niveau 6
06 mars 2011 à 22:20:27

Bonjour a tous
cela fait quelque jour que je débute avec SDL mais je n'arrive pas a faire une gestion de collision AABB, j'ai essayer ce tuto http://www.siteduzero.com/tutoriel-3-254500-formes-simples.html

mais je n'ai rien compris, es que quelqu'un peut me montre un exemple concret de cette gestion svp.

Pocolo
Pocolo
Niveau 10
06 mars 2011 à 22:45:12

Je vais te l'expliquer de faon grossière pour que tu comprennes. En imaginant que tu veux vérifier la collision entre un rectangle A et un rectangle B il faut que tu vérifies si:

A.x >= B.x + B.w
A.x + A.w <= B.x
A.y >= B.y + B.h
A.y + A.h <= B.y

Et il faut que TOUTES ces conditions soit remplies pour que l'on considère qu'il y a bien une collision entre ces rectangles. :oui:

Pocolo
Pocolo
Niveau 10
06 mars 2011 à 22:49:25

Excuses-moi, c'est l'inverse en fait, il faut que toutes ces conditions ne soient PAS remplies pour qu'il y ait collision. :peur:

Enfin ça peut se faire dans les deux sens mais tel que je l'ai écrit on vérifie si le rectangle est a l’extérieur et non pas a l’intérieur de l'autre.

aldi88
aldi88
Niveau 6
06 mars 2011 à 22:55:32

Je te remercie pour ta réponse qui ma permis de mieux comprendre l'utilisation (ouf on y arrive ^^)

mais alors dans un programme ou j’aurais deux images rectangle de 60sur30(par exemple) et je veut que quand il y a collision le programme s’arrête je marque quoi?

Pocolo
Pocolo
Niveau 10
06 mars 2011 à 23:01:58

Tu peux faire un booléen comme celui qui est sur la page du SDZ, c'est comme ça que ça se fait en général, mais si tu utilises SLD_Rect tu n'a pas besoin de faire une struct comme il l'a fait, son bool donnerait ça avec des SDL_Rect:

bool Collision(SDL_Rect box1, SDL_Rect 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;
}

tu écris cette fonction quelque part et tu y fais appel dans ta boucle, genre en imaginant que tes rectangles s'appellent rect1 et rect2:

if( Collision(rect1, rect2) ) alors on mets fin au programme;

aldi88
aldi88
Niveau 6
06 mars 2011 à 23:11:30

Je vient de copier ton code dans codeblocks mais il me mais cette erreur:
a function-definition is not allowed here before '{' token|

ps:je n'ai pas définit de rectangle ni rien j'ai juste copier le code dans main.

ps2:je te remercie encore une fois de ta patience

Pocolo
Pocolo
Niveau 10
06 mars 2011 à 23:12:39

Faudrait que tu postes tout ton code parce que je n'y vois pas clair là.

aldi88
aldi88
Niveau 6
06 mars 2011 à 23:14:50

En fait se problème est résolue mais j'en est un nouveau voici le code:

  1. ifdef __cplusplus

#include <cstdlib>

  1. else

#include <stdlib.h>

  1. endif
  2. ifdef __APPLE__
  3. include <SDL/SDL.h>
  4. else
  5. include <SDL.h>
  6. endif

int main ( int argc, char** argv )
{

{
// initialize SDL video
bool Collision(SDL_Rect box1, SDL_Rect 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;
}
return 0;
}

voici les erreur:

error: expected initializer before 'if'|

|error: 'else' without a previous 'if'|

Pocolo
Pocolo
Niveau 10
06 mars 2011 à 23:23:00

C'est tout le code ça? :hap:

Parce que bon il manque pas mal de trucs quand même, écrit le minimum avant de t'occuper des collisions.

Pocolo
Pocolo
Niveau 10
06 mars 2011 à 23:25:28

Autrement y'a un problème avec tes "{}" et une fonction s’écrit en dehors du main, dans le main tu appelles les fonction mais c'est tout.

aldi88
aldi88
Niveau 6
06 mars 2011 à 23:28:12

non la c'est juste pour teste mais mon vrai programme je les complètement loupé a cause justement de se problème de collision alors pour ne pas avoir le même problème je préféré être au point avec sa.

mais si tu veut un programme un peut plus construit pour pouvoir m'aider je peut le faire pour demain (en espèrent que tu seras la pour regarder...)

Pocolo
Pocolo
Niveau 10
06 mars 2011 à 23:33:35

Il faut juste que tu écrives ta fonction en dehors du main, et dans la boucle tu y fais appel comme je l'ai écrit plus haut:

if( Collision(rect1, rect2) ) alors on mets fin au programme;

Tu dois pouvoir te débrouiller avec ça.

aldi88
aldi88
Niveau 6
06 mars 2011 à 23:38:28

Ok je te remercie de ton aide précieuse.

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