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

collision(sdl/c++)

bobtriguette32
bobtriguette32
Niveau 6
28 février 2006 à 02:11:51

Bonjour j´aimerais savoir comment gèrer les collisions entre 2 carré avec sdl.

merci de vos réponses

ratchetJv85
ratchetJv85
Niveau 7
28 février 2006 à 03:05:37

ya pas un topic d´aide pour sa ? o_0

bobtriguette32
bobtriguette32
Niveau 6
28 février 2006 à 04:29:21

Je en crois pas qu´il y en aye pour la libraire sdl.

Lapintade
Lapintade
Niveau 30
28 février 2006 à 08:38:28

La premiere question a se poser est : "Sdl gere il les collisions" ?

Sinon, c´est un autre probleme qui est tout simplement "Comment gere la collision entre deux carrés" (en 2D donc ?? )

Ca manque de precision pour pouvoir te repondre.

JeanYvesYves
JeanYvesYves
Niveau 10
28 février 2006 à 08:45:29

En effet, Lapintade a raison, ce n´est pas SDL qui détecte les collisions, c´est un probleme de savoir si 2 rectangles se chevauchent ou non.

Bon, allez, je te passe une petite fonction :)
Elle renvoie 1 si les 2 rectangles se chavauchent, 0 sinon :)

int BoxCollide(SDL_Rect* a,SDL_Rect* b)
{
if (!(((b->x<a->x) && (a->x<b->x+b->w)) || ((b->x<a->x+a->w) && (a->x+a->w<b->x+b->w))))
return 0;
if (!(((b->y<a->y) && (a->y<b->y+b->h)) || ((b->y<a->y+a->h) && (a->y+a->h<b->y+b->h))))
return 0;
return 1;
}

Quintoff
Quintoff
Niveau 10
28 février 2006 à 11:40:28

Hum intéressant cette fonction...
Ca te dérange si je la met sur devamateur.be ?

JeanYvesYves
JeanYvesYves
Niveau 10
28 février 2006 à 11:47:02

pas de soucis :)

Quintoff
Quintoff
Niveau 10
28 février 2006 à 11:47:39

Ok merci, je fais ça de suite :ok:

Quintoff
Quintoff
Niveau 10
28 février 2006 à 11:54:53

Et voila : http://www.devamateur.be/articleid.php?id=19

Encore merci :)

JeanYvesYves
JeanYvesYves
Niveau 10
28 février 2006 à 11:58:53

la fonction pourrait se simplifier avec les regles d´algebre de Boole (en particulier avec la regle de De Morgan), mais bon...

Quintoff
Quintoff
Niveau 10
28 février 2006 à 12:04:41

C´est un peu chaud pour moi en tout cas. Je viens de faire une recherche rapide, tu parle de ça : http://fr.wikipedia.org/wrg/wiki/Alg%C3%A8bre_de_Boole_ (logique)#Th.C3.A9or.C3.A8me_de_De_Morgan ?

Quintoff
Quintoff
Niveau 10
28 février 2006 à 12:05:43

Evidemment le forum fait encore des siennes, il faut recopier l´url au complet.

JeanYvesYves
JeanYvesYves
Niveau 10
28 février 2006 à 12:08:25

Allez, petite démo pour la simplification.
D´apres De Morgan :
!( A && B) <=> !A || !B
!( A || B) <=> !A && !B

Appliquons :

(!(((b->x<a->x) && (a->x<b->x+b->w)) || ((b->x<a->x+a->w) && (a->x+a->w<b->x+b->w))))
->
(!((A && B) || (C && D)))
<=>
(!(A && B) && !( C && D))
<=>
(!A || !B ) && (!C || !D )

ça donne :

int BoxCollide(SDL_Rect* a,SDL_Rect* b)
{
if (((b->x>=a->x) || (a->x>=b->x+b->w)) && ((b->x>=a->x+a->w) || (a->x+a->w>=b->x+b->w))))
return 0;
if (((b->y>=a->y) || (a->y>=b->y+b->h)) && ((b->y>=a->y+a->h) || (a->y+a->h>=b->y+b->h))))
return 0;
return 1;
}

Normalement, ça donne la meme chose (a erreur de calcul pres :rire: )

Quintoff
Quintoff
Niveau 10
28 février 2006 à 12:15:10

Ok mais ce n´est pas vraiment simplifié je trouve. C´est différent.

Quintoff
Quintoff
Niveau 10
28 février 2006 à 12:15:56

Enfin il faudrait voir aussi la vitesse d´exécution de chaque méthode pour avoir un vraie comparaison :)

JeanYvesYves
JeanYvesYves
Niveau 10
28 février 2006 à 12:17:51

oui, y´a juste un "not" en moins.
Cependant, y´a des >= a la place des > (cela dit, tu pourrais laisser des >, sans = : tout dépend si tu veux que le cas ou les 2 boites se frolent (surface) te renvoie vrai ou faux...

Note que cette fonction peut etre développée (1 lignes de +) pour tester la meme chose en 3D : 2 parralelepipedes qui se touchent. (avec d´autres structures bien sur)

JeanYvesYves
JeanYvesYves
Niveau 10
28 février 2006 à 12:19:25

Oui, faudrait voir un bench (mesure de temps) pour ces 2 cas. -> l´optimisation de cette fonction est fondamentale, car souvent, on teste des centaines de collisions par seconde...

Quintoff
Quintoff
Niveau 10
28 février 2006 à 12:31:21

Ouais surtout en 3D à mon avis. On est plus souvent amené à faire des tests de collisions en 3D qu´en 2D, déja parce que il y a beaucoup plus de paralélépipèdes à tester que de rectangles en 2D.

dynoplasmma
dynoplasmma
Niveau 9
28 février 2006 à 12:50:05

Moi pour gerer deux rantagles qui se touchaient, j´ai fait une surface avec points de l´autre rectangle, j´ai prit la surface pour le plus gros rectagnle, et les points pour le plus petit rectangle :
http://www.rafb.net/paste/results/1fRSXr82.html

Mais le fonction de JYY est plus pratique :)

bobtriguette32
bobtriguette32
Niveau 6
28 février 2006 à 20:10:22

J´ai réusi a faire les collisions mais le problème maintenant c´est que si mon carré entre en collision avec l´autre il ne peut plus se déplacer. Quoi faire?

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