Novembre 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | Calendrier |
|
|
| Aide pour trouver un problème de détection de collisions | |
| | Auteur | Message |
---|
Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Aide pour trouver un problème de détection de collisions Ven 8 Mai 2015 - 1:44 | |
| Bonsoir, est-ce que quelqu'un voit l'erreur que j'ai fais dans ce programme ? La détection marche mal dans le coin en haut à gauche du rectangle. Je suis trop fatigué pour continuer à réfléchir. J'espère que quelqu'un trouvera - Code:
-
DIM Collision_Point_AABB_resultat% DIM Collision_AABB_resultat% DIM Collision_cercle_point_resultat% DIM Collision_Cercle_AABB_resultat% DIM ProjectionSurSegment_resultat% DIM cercle1_x% : cercle1_x% = 70 DIM cercle1_y% : cercle1_y% = 40 DIM cercle1_r : cercle1_r = 15 DIM rect1_x% : rect1_x% = 50 DIM rect1_y% : rect1_y% = 80 DIM rect1_width : rect1_width = 50 DIM rect1_height : rect1_height = 50
label Appuie_touche
' Création des images pour les sprites de notre cercle et de notre rectangle picture 100 : hide 100 : height 100,rect1_height : width 100,rect1_width color 100,255,0,0 : file_save 100,"sprite_1.bmp" height 100,2*cercle1_r : width 100,2*cercle1_r : color 100,0,0,0 2d_fill_color 0,0,255 : 2d_target_is 100 : 2d_circle cercle1_r,cercle1_r,cercle1_r file_save 100,"sprite_2.bmp" : 2d_target_is 0 : delete 100
scene2d 100 : hide 100 : full_space 100 sprite 1 : sprite_file_load 1,"sprite_1.bmp" : file_delete "sprite_1.bmp" sprite_position 1,rect1_x%,rect1_y% sprite 2 : sprite_file_load 2,"sprite_2.bmp" : file_delete "sprite_2.bmp" sprite_position 2,cercle1_x%,cercle1_y% on_key_down 0,Appuie_touche Collision_Cercle_AABB(cercle1_x%,cercle1_y%,cercle1_r,rect1_x%,rect1_y%, rect1_width,rect1_height) show 100 end
SUB Collision_Point_AABB(point_x%,point_y%,rect_x%,rect_y%,rect_width,rect_height) Collision_Point_AABB_resultat% = 0 IF rect_x% <= point_x% AND point_x% < rect_x% + rect_width IF rect_y% <= point_y% AND point_y% < rect_y% + rect_height Collision_Point_AABB_resultat% = 1 END_IF END_IF END_SUB
SUB Collision_AABB(r1_x%,r1_y%,r1_width,r1_height,r2_x%,r2_y%, r2_width,r2_height) Collision_AABB_resultat% = 1 IF ((r2_x% >= (r1_x% + r1_width)) OR ((r2_x% + r2_width) <= r1_x%) OR (r2_y% >= (r1_y% + r1_height)) OR ((r2_y% + r2_height) <= r1_y%)) THEN Collision_AABB_resultat% = 0 END_SUB
SUB Collision_cercle_point(c1_x%,c1_y%,c1_r,x%,y%) DIM_LOCAL d Collision_cercle_point_resultat% = 0 d=(c1_x% - x%)*(c1_x% - x%) + (c1_y% - y%)*(c1_y% - y%) IF (d < (c1_r*c1_r)) THEN Collision_cercle_point_resultat% = 1 END_SUB
SUB Collision_Cercle_AABB(c1_x%,c1_y%,c1_r,r1_x%,r1_y%,r1_width,r1_height) Collision_Cercle_AABB_resultat% = 1 Collision_AABB(c1_x%,c1_y%,2*c1_r,2*c1_r,r1_x%,r1_y%,r1_width,r1_height) IF Collision_AABB_resultat% = 0 Collision_Cercle_AABB_resultat% = 0 ELSE Collision_cercle_point(c1_x%,c1_y%,c1_r,r1_x%,r1_y%) IF Collision_cercle_point_resultat% = 0 Collision_cercle_point(c1_x%,c1_y%,c1_r,r1_x%,r1_y%+r1_height) IF Collision_cercle_point_resultat% = 0 Collision_cercle_point(c1_x%,c1_y%,c1_r,r1_x%+r1_width,r1_y%) IF Collision_cercle_point_resultat% = 0 Collision_cercle_point(c1_x%,c1_y%,c1_r,r1_x%+r1_width,r1_y%+r1_height) IF Collision_cercle_point_resultat% = 0 THEN Collision_Cercle_AABB_resultat% = 0 END_IF END_IF END_IF IF Collision_Cercle_AABB_resultat% = 0 Collision_Point_AABB(c1_x%,c1_y%,r1_x%,r1_y%,r1_width,r1_height) IF Collision_Point_AABB_resultat% = 1 Collision_Cercle_AABB_resultat% = 1 ELSE ProjectionSurSegment(c1_x%,c1_y%,r1_x%,r1_y%,r1_x%,r1_y%+r1_height) IF ProjectionSurSegment_resultat% = 0 ProjectionSurSegment(c1_x%,c1_y%,r1_x%,r1_y%,r1_x%+r1_width,r1_y%) IF ProjectionSurSegment_resultat% = 0 Collision_Cercle_AABB_resultat% = 0 : ' Cas B ELSE Collision_Cercle_AABB_resultat% = 1 : ' Cas E END_IF ELSE Collision_Cercle_AABB_resultat% = 1 : ' Cas E END_IF END_IF END_IF END_IF IF Collision_Cercle_AABB_resultat% = 1 CAPTION 0,"Il y a collision entre le cercle et le rectangle" ELSE CAPTION 0,"Il n'y a pas collision entre le cercle et le rectangle" END_IF END_SUB
SUB ProjectionSurSegment(Cx%,Cy%,Ax%,Ay%,Bx%,By%) DIM_LOCAL ACx%, ACy%, ABx%, ABy%, BCx%, BCy%, s1%, s2% ACx% = Cx%-Ax% : ACy% = Cy%-Ay% ABx% = Bx%-Ax% : ABy% = By%-Ay% BCx% = Cx%-Bx% : BCy% = Cy%-By% s1% = (ACx%*ABx%) + (ACy%*ABy%) : s2% = (BCx%*ABx%) + (BCy%*ABy%) IF ((s1%*s2%)>0) ProjectionSurSegment_resultat% = 0 ELSE ProjectionSurSegment_resultat% = 1 END_IF END_SUB
Appuie_touche: if key_down_code = 37 and cercle1_x% > 0 then cercle1_x% = cercle1_x% - 5 if key_down_code = 39 and cercle1_x% < (width(100) - 2*cercle1_r) then cercle1_x% = cercle1_x% + 5 if key_down_code = 38 and cercle1_y% > 0 then cercle1_y% = cercle1_y% - 5 if key_down_code = 40 and cercle1_y% < (height(100) - 2*cercle1_r) then cercle1_y% = cercle1_y% + 5 sprite_position 2,cercle1_x%,cercle1_y% Collision_Cercle_AABB(cercle1_x%,cercle1_y%,cercle1_r,rect1_x%,rect1_y%, rect1_width,rect1_height) return | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Aide pour trouver un problème de détection de collisions Ven 8 Mai 2015 - 11:07 | |
| C'est bon, j'ai relu et j'ai corrigé les problèmes de logiques Le bon code c'est donc: - Code:
-
DIM Collision_Point_AABB_resultat% DIM Collision_AABB_resultat% DIM Collision_cercle_point_resultat% DIM Collision_Cercle_AABB_resultat% DIM ProjectionSurSegment_resultat% DIM cercle1_x% : cercle1_x% = 70 DIM cercle1_y% : cercle1_y% = 40 DIM cercle1_r : cercle1_r = 80 DIM rect1_x% : rect1_x% = 80 DIM rect1_y% : rect1_y% = 80 DIM rect1_width : rect1_width = 120 DIM rect1_height : rect1_height = 120
label Appuie_touche
' Création des images pour les sprites de notre cercle et de notre rectangle picture 100 : hide 100 : height 100,rect1_height : width 100,rect1_width color 100,255,0,0 : file_save 100,"sprite_1.bmp" height 100,2*cercle1_r : width 100,2*cercle1_r : color 100,0,0,0 2d_fill_color 0,0,255 : 2d_target_is 100 : 2d_circle cercle1_r,cercle1_r,cercle1_r file_save 100,"sprite_2.bmp" : 2d_target_is 0 : delete 100
scene2d 100 : hide 100 : full_space 100 sprite 1 : sprite_file_load 1,"sprite_1.bmp" : file_delete "sprite_1.bmp" sprite_position 1,rect1_x%,rect1_y% sprite 2 : sprite_file_load 2,"sprite_2.bmp" : file_delete "sprite_2.bmp" sprite_position 2,cercle1_x%,cercle1_y% on_key_down 0,Appuie_touche Collision_Cercle_AABB(cercle1_x%,cercle1_y%,cercle1_r,rect1_x%,rect1_y%, rect1_width,rect1_height) show 100 end
SUB Collision_Point_AABB(point_x%,point_y%,rect_x%,rect_y%,rect_width,rect_height) Collision_Point_AABB_resultat% = 0 IF rect_x% <= point_x% AND point_x% < rect_x% + rect_width IF rect_y% <= point_y% AND point_y% < rect_y% + rect_height Collision_Point_AABB_resultat% = 1 END_IF END_IF END_SUB
SUB Collision_AABB(r1_x%,r1_y%,r1_width,r1_height,r2_x%,r2_y%, r2_width,r2_height) Collision_AABB_resultat% = 1 IF ((r2_x% >= (r1_x% + r1_width)) OR ((r2_x% + r2_width) <= r1_x%) OR (r2_y% >= (r1_y% + r1_height)) OR ((r2_y% + r2_height) <= r1_y%)) THEN Collision_AABB_resultat% = 0 END_SUB
SUB Collision_cercle_point(c1_x%,c1_y%,c1_r,x%,y%) DIM_LOCAL d Collision_cercle_point_resultat% = 0 d=(c1_x% - x%)*(c1_x% - x%) + (c1_y% - y%)*(c1_y% - y%) IF (d < (c1_r*c1_r)) THEN Collision_cercle_point_resultat% = 1 END_SUB
SUB Collision_Cercle_AABB(c1_x%,c1_y%,c1_r,r1_x%,r1_y%,r1_width,r1_height) DIM_LOCAL r1%,r2%,r3%,r4% Collision_AABB(c1_x%,c1_y%,2*c1_r,2*c1_r,r1_x%,r1_y%,r1_width,r1_height) IF Collision_AABB_resultat% = 0 Collision_Cercle_AABB_resultat% = 0 ELSE Collision_cercle_point(c1_x%+c1_r,c1_y%+c1_r,c1_r,r1_x%,r1_y%) r1% = Collision_cercle_point_resultat% Collision_cercle_point(c1_x%+c1_r,c1_y%+c1_r,c1_r,r1_x%,r1_y%+r1_height) r2% = Collision_cercle_point_resultat% Collision_cercle_point(c1_x%+c1_r,c1_y%+c1_r,c1_r,r1_x%+r1_width,r1_y%) r3% = Collision_cercle_point_resultat% Collision_cercle_point(c1_x%+c1_r,c1_y%+c1_r,c1_r,r1_x%+r1_width,r1_y%+r1_height) r4% = Collision_cercle_point_resultat% IF r1% = 1 OR r2%=1 OR r3%=1 OR r4%=1 Collision_Cercle_AABB_resultat% = 1 ELSE Collision_Point_AABB(c1_x%+c1_r,c1_y%+c1_r,r1_x%,r1_y%,r1_width,r1_height) IF Collision_Point_AABB_resultat% = 1 Collision_Cercle_AABB_resultat% = 1 ELSE ProjectionSurSegment(c1_x%+c1_r,c1_y%+c1_r,r1_x%,r1_y%,r1_x%,r1_y%+r1_height) r1% = ProjectionSurSegment_resultat% ProjectionSurSegment(c1_x%+c1_r,c1_y%+c1_r,r1_x%,r1_y%,r1_x%+r1_width,r1_y%) r2% = ProjectionSurSegment_resultat% IF r1% = 1 OR r2% = 1 Collision_Cercle_AABB_resultat% = 1 : ' Cas E ELSE Collision_Cercle_AABB_resultat% = 0 : ' Cas B END_IF END_IF END_IF END_IF IF Collision_Cercle_AABB_resultat% = 1 CAPTION 0,"Il y a collision entre le cercle et le rectangle" ELSE CAPTION 0,"Il n'y a pas collision entre le cercle et le rectangle" END_IF ' CAPTION 0,"X : " + STR$(cercle1_x%) + " Y : " +STR$(cercle1_y%) END_SUB
SUB ProjectionSurSegment(Cx%,Cy%,Ax%,Ay%,Bx%,By%) DIM_LOCAL ACx%, ACy%, ABx%, ABy%, BCx%, BCy%, s1%, s2% ACx% = Cx%-Ax% : ACy% = Cy%-Ay% ABx% = Bx%-Ax% : ABy% = By%-Ay% BCx% = Cx%-Bx% : BCy% = Cy%-By% s1% = (ACx%*ABx%) + (ACy%*ABy%) : s2% = (BCx%*ABx%) + (BCy%*ABy%) IF ((s1%*s2%)>0) ProjectionSurSegment_resultat% = 0 ELSE ProjectionSurSegment_resultat% = 1 END_IF END_SUB
Appuie_touche: if key_down_code = 37 and cercle1_x% > 0 - cercle1_r then cercle1_x% = cercle1_x% - 5 if key_down_code = 39 and cercle1_x% < (width(100) - 2*cercle1_r) then cercle1_x% = cercle1_x% + 5 if key_down_code = 38 and cercle1_y% > 0 - cercle1_r then cercle1_y% = cercle1_y% - 5 if key_down_code = 40 and cercle1_y% < (height(100) - 2*cercle1_r) then cercle1_y% = cercle1_y% + 5 sprite_position 2,cercle1_x%,cercle1_y% Collision_Cercle_AABB(cercle1_x%,cercle1_y%,cercle1_r,rect1_x%,rect1_y%, rect1_width,rect1_height) return Voilà, c'est le code final pour mon article (le premier d'une série sur les détection de collision que je terminerais dès que je peux pour le numéro de mai) | |
| | | Marc
Nombre de messages : 2466 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
| Sujet: Re: Aide pour trouver un problème de détection de collisions Ven 8 Mai 2015 - 11:40 | |
| Bonjour Jicehel,
J'ai essayé ton programme en long en large et en travers : pas de problème ! Pas d'anomalie trouvée.
Bonne continuation.
Marc37 | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Aide pour trouver un problème de détection de collisions Ven 8 Mai 2015 - 11:49 | |
| Dans l'article je traiterais des point, ségments, rectangles de formes AABB (rectangles parallèles aux axes de l'écran), et des cercles. Les autres formes (les polygones), des detections par masques pour des objets et des zones sur l'écran, etc .. ce sera pour un prochain article (si j'ai le temsp et que j'y arrive ). J'ai encore un peu de rédaction à faire et quelques codes plus simples mais je dois faire d'autres choses aujourd'hui alors je pense que je le mettrais que ce soir sur le webdav d'Ygeronimi | |
| | | papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Aide pour trouver un problème de détection de collisions Ven 8 Mai 2015 - 17:06 | |
| - Jicehel a écrit:
- …. ce sera pour un prochain article (si j'ai le temsp et que j'y arrive ).
Tu as fait un bon départ, donc tu y arriveras. Pour le temsp je ne peux rien pour toi, mais je te souhaite bon courage ! | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Aide pour trouver un problème de détection de collisions Ven 8 Mai 2015 - 17:39 | |
| Ca te plaiera, je pense Papydall, il y a des maths dans le tuto | |
| | | Contenu sponsorisé
| Sujet: Re: Aide pour trouver un problème de détection de collisions | |
| |
| | | | Aide pour trouver un problème de détection de collisions | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |