John Dogget
Messages postés384Date d'inscriptionvendredi 18 juin 2004StatutMembreDernière intervention 7 mai 2009
-
8 oct. 2007 à 21:24
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDerniè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.
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 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és615Date d'inscriptiondimanche 13 août 2006StatutMembreDernière intervention13 décembre 20183 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és220Date d'inscriptionlundi 30 octobre 2000StatutMembreDernière intervention15 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és81Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention12 octobre 20071 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és81Date d'inscriptionmardi 31 mai 2005StatutMembreDernière intervention12 octobre 20071 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és220Date d'inscriptionlundi 30 octobre 2000StatutMembreDernière intervention15 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és220Date d'inscriptionlundi 30 octobre 2000StatutMembreDernière intervention15 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és4720Date d'inscriptiondimanche 26 février 2006StatutModérateurDernière intervention31 juillet 202113 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és384Date d'inscriptionvendredi 18 juin 2004StatutMembreDerniè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.
16 oct. 2007 à 13:26
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.
12 oct. 2007 à 22:50
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
12 oct. 2007 à 22:48
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
12 oct. 2007 à 00:41
mais sinon l'algo de collision est pas mal, bravo pour le boulot
11 oct. 2007 à 22:32
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;
9 oct. 2007 à 13:07
La function LinCombinVect2D ne mettait à zéro le membre z du vecteur. Donc comme ça renvoie n'importe quoi, ça fait n'importe quoi...
9 oct. 2007 à 06:21
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.
8 oct. 2007 à 22:36
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.
8 oct. 2007 à 21:24
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.