COLLISIONS DE BABALLES

John Dogget Messages postés 384 Date d'inscription vendredi 18 juin 2004 Statut Membre Dernière intervention 7 mai 2009 - 8 oct. 2007 à 21:24
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 - 16 oct. 2007 à 13:26
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/44323-collisions-de-baballes

cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
16 oct. 2007 à 13:26
"Le plus gros du calcul vient de la recherche des collisions."

Tu peux faire des zones ou utiliser un quadtree. Dans ton cas (A vu de nez de la capture), des zones risques d'être plus appropriée, car tu a pas mal d'objets pas trop mal répartits.

Quand je dis zones, je pense à un bête quadrillage, avec une largeure de case par exemple égale au diamètre de ton plus gros disque. Chaque disque se trouve alors dans une case. Pour chaque disque, tu peux ainsi faire des tests qui portent sur les disques de la même case et sur les 8 cases adjacentes.
cs_Jean_Jean Messages postés 615 Date d'inscription dimanche 13 août 2006 Statut Membre Dernière intervention 13 décembre 2018 3
12 oct. 2007 à 22:50
@ barbichette
Amusant les attractions!
ça donne envie de faire un jeu!
@ jace1975
Je n'ai jamais compris l'utilité de déclarer const b1:tballe? Par défault, ilcomprend si l'on ne met pas const;Non?

Bien à vous!
Jean_Jean
cs_barbichette Messages postés 220 Date d'inscription lundi 30 octobre 2000 Statut Membre Dernière intervention 15 juillet 2013
12 oct. 2007 à 22:48
j'ai mis dans le zip une version directX avec les composants Asphyre
Mais j'ai laissé la version bitmap classique pour ceux qui ne veulent pas installer ces composants.

Par contre, j'ai une question.
Le plus gros du calcul vient de la recherche des collisions.
Si quelqu'un a une solution pour eviter de parcourir plein de fois tous le tableau...
Je pensai peut-êter à une fonction récursive, ou un truc comme ça...

Barbichette
jace1975 Messages postés 81 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 12 octobre 2007 1
12 oct. 2007 à 00:41
j'ai remplacer ton type currency par single et ca consomme beaucoup moins, comme c'est bizarre

mais sinon l'algo de collision est pas mal, bravo pour le boulot
jace1975 Messages postés 81 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 12 octobre 2007 1
11 oct. 2007 à 22:32
c'est marrant mais tu devrais mieux écrire tes fonctions
genre :
function iscollision(const b1:tballe; const b2:tballe):boolean;
begin
result:=distance2(AddVect(b1.p,b1.v), AddVect(b2.p,b2.v))<sqr(b1.r+b2.r);
end;

plutot que ça:

function iscollision(b1:tballe; b2:tballe):boolean;
var
a,b:tvect;
dist:Currency;//???????
begin
//distance entre b1 et b2 < somme des rayons
a:= AddVect(b1.p,b1.v);
b:= AddVect(b2.p,b2.v);
dist:=distance2(a,b);
result:=dist<sqr(b1.r+b2.r);
end;
cs_barbichette Messages postés 220 Date d'inscription lundi 30 octobre 2000 Statut Membre Dernière intervention 15 juillet 2013
9 oct. 2007 à 13:07
ben voilà, j'ai déjà trouvé un petit bug dans l'unité UVect.
La function LinCombinVect2D ne mettait à zéro le membre z du vecteur. Donc comme ça renvoie n'importe quoi, ça fait n'importe quoi...
cs_barbichette Messages postés 220 Date d'inscription lundi 30 octobre 2000 Statut Membre Dernière intervention 15 juillet 2013
9 oct. 2007 à 06:21
En effet, j'ai aussi parfois des erreurs d'opérations en virgule flottante. Principalement avec le mode répulsif. Mais comme je ne comprend pas bien l'origine d'une telle erreur, je n'ai pas encore trouvé de parade...
Je continue d'ailleurs de chercher car pour faire les petites améliorations, il y a tout de suite cette erreur.

Chez moi, ça ralentis fortement avec plus de 200 balles et lorsqu'elles sont toutes aglutinées au même endroit.
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
8 oct. 2007 à 22:36
ça rappelle la source de foxi avec les collisions en plus..
un peu d'optimisation, une touche de couleur et çà devrait
être bien.
bravo Barbichette,
on dirait une attaque sanguine !
je mets 8/10 pour le code.
John Dogget Messages postés 384 Date d'inscription vendredi 18 juin 2004 Statut Membre Dernière intervention 7 mai 2009
8 oct. 2007 à 21:24
Salut.

Un petit oubli de ta part je pense : unit2 est déclaré dans les "uses" mais pas présent, ce qui forcement bloque à la compilation (unit2.dcu manquant).

Ensuite j'ai réussi à faire planter le programme, j'ai pas cherché en detail d'où viens le problème mais j'ai un arrêt du debugueur dans "UVect" à la ligne 41 (operation en virgule flottante incorrecte).

Par contre, je me rappel plus ce que j'avais mis comme valeure dans la première fenetre, j'imagine que ça t'aidera ;)

J'ai pas constaté de ralentissement particulier sur ma becane (de guerre), mais si tu veux de la rapidité, faudrait passer par directx ou opengl.

L'affichage dans le titre n'est peut être pas très utile et ralentie peut être un poil tout ça.
Rejoignez-nous