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

Cours SDL Collisions simples

Glosoli
Glosoli
Niveau 10
29 juillet 2011 à 12:09:13

Hello. :oui:

Voilà, aujourd'hui j'expérimente la collision, j'tente de trouver des cours simple, qui mettrait deux objets simples (un carré, un rectangle ?) qui serait bloqués par la gestion de collision. Je ne trouve que des tutos qui relatent des cours précédents, on qui ne disent pas c'que je veux. :non:
Ce serait donc un tuto pour apprendre tout simplement la base de la collision. :oui:

A moins que quelqu'un souhaite m'aider dans mes démarches directement. :hap:

Odolwan
Odolwan
Niveau 10
29 juillet 2011 à 12:12:00

J'avais écrit ça sur un autre topic si ça peut t'aider.

"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. "

Glosoli
Glosoli
Niveau 10
29 juillet 2011 à 12:14:22

Salut !

J'avais lu ça, "il faut penser à l'envers", mais ça ne m'aide.

Déjà, AABB représente quoi exactement dans le code ?

Glosoli
Glosoli
Niveau 10
29 juillet 2011 à 12:14:59

+ j'avais lu les topics sur la SDL et collisions, j'ai lu ton post, j'ai à peu près compris mais j'ai du mal à m'y lancer. ^^

Glosoli
Glosoli
Niveau 10
29 juillet 2011 à 12:20:05

J'ai lu attentivement, j'vais expérimenter ça et tenter de mieux comprendre !

Désolé pour triple post !

Pocolo
Pocolo
Niveau 10
29 juillet 2011 à 13:50:49

Je vois souvent les gens parler de "collisions SDL" mais ce type de calcul de collisions n'est aucunement spécifique à la SDL, dans la mesure du possible il faut essayer de ne pas tout mélanger lorsque l'on débute.

Odolwan
Odolwan
Niveau 10
29 juillet 2011 à 13:55:17

Quand on débute on peut avoir du mal à comprendre un code écrit dans une bibliothèque/langage qu'on ne connait pas. JE pense qu'il voulait qu'on l'aide en prenant des exemples avec SDL.

Glosoli
Glosoli
Niveau 10
29 juillet 2011 à 13:57:34

En fait, j'apprends à exploiter la SDL, à travers le C uniquement. J'connais pas grand chose d'autre. Mais oui, le code qu'il m'a filé c'est un généraliste, je vois le genre, faut juste le mettre en œuvre dans le langage quoi. :peur:

Odolwan
Odolwan
Niveau 10
29 juillet 2011 à 13:58:53

Donne ton code en privé je t'ai répondu.

Pocolo
Pocolo
Niveau 10
29 juillet 2011 à 14:05:13

" JE pense qu'il voulait qu'on l'aide en prenant des exemples avec SDL. "

Non mais le truc c'est justement que ce genre de calcul de collision est le même partout, ce sont juste 8 chiffres que l'on compare.

Glosoli
Glosoli
Niveau 10
29 juillet 2011 à 15:15:05

Pocolo :d) J'ai vu des systèmes rien qu'en 2D SDL trè complexe. :peur: C'que je veux faire, c'un truc tout bido,. :peur:

Glosoli
Glosoli
Niveau 10
01 août 2011 à 22:24:52

Bonjour !

Pour ne pas refaire un topic, j'espère qu'on viendra voir ici. :peur:

Mon souci : J'ai un carré blanc que je déplace avec les flèches du clavier. J'ai un rectangle rouge que j'ai mis sur l'écran. Par un système simple de collision, je fais en sorte que lorsque je ne touche pas le rectangle, je peux me déplacer, lorsqu'il y a collision, le carré est stoppé par le rectangle.
MAIS, ici, le carré reste collé, ou est coincé dans le rectangle. J'ai du mal à comprendre pourquoi. :-(

http://pastebin.com/MgPJ9E3r

Le code est très simpliste, vous pouvez le test à condition d'avoir bien évidemment la SDL de chargée :oui:

Pocolo
Pocolo
Niveau 10
01 août 2011 à 23:06:15

C'est simple, prenons la première condition par exemple "carre.x + carre.w <= positionmur.x", tant que le carré est entièrement à gauche du rectangle cette condition est vraie mais imaginons que "carre.x + carre.w" soit égal à "positionmur.x" (qui selon ton code est de 600) la condition est toujours vraie (puisque inférieur ou égal) et donc tu ajoutes 1 à "carre.x", suite à quoi carre.x + carre.w est égal à 601 et la condition (qui était la seule à être vraie) devient fausse, ton carré ne peut plus bouger nul part.

Glosoli
Glosoli
Niveau 10
02 août 2011 à 03:24:20

Hey Pocolo !

Merci de ton aide, j'ai enfin trouvé. :oui: En fait, il fallait prendre toute la condition que j'ai mis avant le switch, et la mettre juste après chaque déplacement. Et de suite après la condition, je mets le déplacement contraire pour "l'éjecter" du rectangle, pour qu'il ne soit plus dans le rectangle !

En gros, j'te montre pour un déplacement :

case SDLK_RIGHT:
carre.x++;

if(!(carre.x + carre.w <= positionmur.x || carre.x >= positionmur.x + positionmur.w || carre.y + carre.h <= positionmur.y || carre.y >= positionmur.y + positionmur.h))

carre.x--;
break;

J'ai donc fait ça pour les 4 déplacements, tout simplement. Le fait d'ajouter 1 rejoint ton explication, lorsque je mets le déplacement contraire lorsqu'il y a collision.

Mais je te remercie !

Pocolo
Pocolo
Niveau 10
02 août 2011 à 13:05:45

" je mets le déplacement contraire pour "l'éjecter" du rectangle "

C'est ce que la plupart des gens font en général. Autrement même si ton code marche il n'est pas bien optimisé et pas assez propre, tu devrais songer a utiliser des fonctions.

Glosoli
Glosoli
Niveau 10
02 août 2011 à 13:23:11

D'accord, j'me remets dans le bain tout à l'heure et j'tente de le rendre plus clean !

elbenito49
elbenito49
Niveau 21
02 août 2011 à 14:00:45

Ton langage n'est pas objet ? sa serait plus simple..

méthode getPosition()
méthode de test()

et c'est good

Odolwan
Odolwan
Niveau 10
02 août 2011 à 19:25:31

Il programme qu'en C je crois...

Glosoli
Glosoli
Niveau 10
02 août 2011 à 19:45:09

En C exact. :oui:

godrik
godrik
Niveau 30
02 août 2011 à 19:57:43

non, avoir un langage objet ne serait pas plus simple. Surtout pour une fonctionnalite si trivial a obtenir en C... Le probleme n'est pas d'avoir un langage objet ou non. le probleme est d'avoir l'idee d'abstraire les problemes dans des fonctions dediees.

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