bonjour;
je but sur une ligne un peu plus bas dans le programme" b.collision(c.balle());"je ne sais quoi mettre à c.balle qui était avant balle[j];dans le détecteur de collision.J'ai donc modifiez le programme que tu m'as corrigé pour le passer en ArrayList pour pouvoir rajouter une balle à chaque collisions , mais cette ligne m’empêche d'aller plus loin pour voir si il y a d'autre erreurs ce qui n'aurais rien d’étonnant.
int nb=4; ArrayList<Balle>balle; void setup() { size(800, 700); balle=new ArrayList<Balle>(); for (int i=0;i<nb;i++) { balle.add(new Balle(random(width), random(height), -1, 1)); } } void draw() { background(255); for (int i=0;i<balle.size();i++) { Balle b=balle.get(i); b.rebondir(); b.bouger(); } for (int i=0;i<balle.size();i++) { for (int j = i + 1 ; j < balle.size(); j++) { Balle b=balle.get(i); Balle c=balle.get(j); b.collision(c.balle());//cette ligne je ne sais pas comment faire. } } for (int i=0;i<balle.size();i++) { Balle b=balle.get(i); b.afficher(); } } class Balle { PVector position; PVector deplacement; int rayon; boolean bing; Balle(float px, float py, float dx, float dy) { position = new PVector(px, py); deplacement=new PVector (dx, dy); rayon = 20; } void rebondir() { bing = false; if (position.x > width|| position.x < 0) { deplacement.x=deplacement.x*-1; } if (position.y >height||position.y<0) { deplacement.y= deplacement.y* -1; } } void bouger() { position.add(deplacement); } void collision(Balle j) { float distance = position.dist(j.position); if (distance<40) { bing = true; j.bing = true; } } void afficher() { if (bing) { balle.add(new Balle(position.x,position.y)); fill(255, 0, 255); } else { fill(0, 255, 255); } if(balle.size()>80) { balle.remove(4); } ellipse(position.x, position.y, 40, 40); } }
Hors ligne
à priori ça devrait juste être:
b.collision(c);
Hors ligne
J'ai corrigé la première erreur ;maintenant il y en a une deuxième dans void afficher
"balle.add(new Balle(j'ai donc entrez la position de la balle de différentes manières )mais rien n'y fait ;aussi une seule erreur m'aurais étonné.D'après ce que j'ai compris cette ligne devrais faire apparaître la nouvelle balle à la position de la collision ,c'est pour cela que j'ai essayez de mettre la position de la balle ici; mais ça ne fonctionne pas.J'ai peut être aussi tous compris de travers c'est une forte possibilité.
merci pour toute tes corrections.
Hors ligne
j'ai fini par trouver l'erreur ,mais ça ne fonctionne pas bien .Il doit y avoir un autre problème.
int nb=4; ArrayList<Balle>balle; void setup() { size(800, 700); balle=new ArrayList<Balle>(); for (int i=0;i<nb;i++) { balle.add(new Balle(random(width), random(height), -1, 1)); } } void draw() { background(255); for (int i=0;i<balle.size();i++) { Balle b=balle.get(i); b.rebondir(); b.bouger(); } for (int i=0;i<balle.size();i++) { for (int j = i + 1 ; j < balle.size(); j++) { Balle b=balle.get(i); Balle c=balle.get(j); b.collision(c); } } for (int i=0;i<balle.size();i++) { Balle b=balle.get(i); b.afficher(); } } class Balle { PVector position; PVector deplacement; int rayon; boolean bing; Balle(float px, float py, float dx, float dy) { position = new PVector(px, py); deplacement=new PVector (dx, dy); rayon = 20; } void rebondir() { bing = false; if (position.x > width|| position.x < 0) { deplacement.x=deplacement.x*-1; } if (position.y >height||position.y<0) { deplacement.y= deplacement.y* -1; } } void bouger() { position.add(deplacement); } void collision(Balle j) { float distance = position.dist(j.position); if (distance<40) { bing = true; j.bing = true; } } void afficher() { if (bing) { balle.add(new Balle(position.x,position.y, -1, 1)); fill(255, 0, 255); } if(balle.size()>80) { balle.remove(4); } else { fill(0, 255, 255); } ellipse(position.x, position.y, 40, 40); } }
Hors ligne
Concernant la rigueur de la programmation, il faut voir une classe comme indépendante du programme principal. Donc il ne peut y avoir de référence dans la classe à une variable du programme principal.
Dans la méthode afficher() ton programme, tu fais référence à la variable balle qui est définie dans le programme principal.
Si tu as besoin d'une de ces variables il faut les passer en paramètre :
void afficher(ArrayList<Balle> baballe) { if (bing) { baballe.add(new Balle(position.x, position.y, -1, 1)); fill(255, 0, 255); } if (baballe.size()>80) { baballe.remove(4); } else { fill(0, 255, 255); } ellipse(position.x, position.y, 40, 40); }
Concernant le dysfonctionnement qui se produit quand il y a collision, tu créés à chaque collision une nouvelle instance à l'emplacement d'une balle existante donc il se reproduit une collision et ce indéfiniment.
Lorsqu'il y a collision, les balles ne rebondissent pas les unes sur les autres.
Hors ligne
bonjour
merci pour tes conseils,comment faire pour régler le problème de dysfonctionnement?
Merci;
Hors ligne
Il faut te poser la question du scénario :
Que se passe t'il quand deux balles se rencontrent ?
Où est créer la nouvelle balle sans qu'elle ne se surimpose à une autre ?
Il est nécessaire de répondre à ces question avant de commencer à programmer les comportements des balles.
Hors ligne
Normalement les balles rebondissent les unes sur les autres, et la nouvelle balle apparaît à la position de la rencontre + 2 rayons. Pour le rebondissement je ne l'ai pas écris;car pour le moment je voulais juste faire apparaître une balle supplémentaire quand les balles se croisaient.Pour la surimposition des balles.
ex:void afficher() {
if (bing) {
balle.add(new Balle(position.x+40,position.y+40, -1, 1));
fill(255, 0, 255);
}
et la la balle apparaît à un endroit visible,mais je ne comprends pas pourquoi les balles se multiplient à l'infini?
car d'après ce que je comprend la taille du tableau augmente de 1 à la fois ;et si l'on voulais augmenter de 2 comment ferais ton ?.
Hors ligne
Comme tes balles avancent lentement, lorsqu'elles se croisent il se créé à chaque boucle une nouvelle balle. Comme les nouvelles balles crées ne sont pas très éloignées les unes des autres alors il s'en créé de nouvelles.
Donc une grande quantité.
Il faut peut-être penser à les faire rebondir comme cela il n'y aura qu'une seule création.
Mais sinon, tu es sur la bonne voie pour créer de nouvelles instances de balle avec une arrayList.
Hors ligne
OK ,j'ai compris pourquoi la balle se duplique à l'infini ;j'ai donc créé une collision avec un rebond tout fonctionne bien; mais même si je mets la ligne qui rajoute la balle plus loin dans le programme ,avec une position supérieure
au point de rencontre cela continu à se dupliquer.Là j'ai supprimez la ligne du programme,et la position d'apparition est superiere à,40 et de plus les balles s’éloignent l'une de l'autre pourtant le phénomène de duplication continu.Je ne sais pas ou mettre cette ligne .Regarde le programme que je te transmet,il m'a l'air de bien fonctionner.
balle.add(new Balle(position.x+50, position.Y+50, -1, 1));
int nb=10; ArrayList<Balle>balle; void setup() { size(800, 700); balle=new ArrayList<Balle>(); for (int i=0;i<nb;i++) { balle.add(new Balle(random(width), random(height), -1, 1)); } } void draw() { background(255); for (int i=0;i<balle.size();i++) { Balle b=balle.get(i); b.rebondir(); b.bouger(); } for (int i=0;i<balle.size();i++) { for (int j = i + 1 ; j < balle.size(); j++) { Balle b=balle.get(i); Balle c=balle.get(j); b.collision(c); } } for (int i=0;i<balle.size();i++) { Balle b=balle.get(i); b.afficher(); } } class Balle { PVector position; PVector deplacement; int rayon; boolean bing; Balle(float px, float py, float dx, float dy) { position = new PVector(px, py); deplacement=new PVector (dx, dy); rayon = 20; } void rebondir() { bing = false; if (position.x > width|| position.x < 0) { deplacement.x=deplacement.x*-1; } if (position.y >height||position.y<0) { deplacement.y= deplacement.y* -1; } } void bouger() { position.add(deplacement); } void collision(Balle j) { float distance = position.dist(j.position); if (distance<40) { bing = true; j.bing = true; } } void afficher() { if (bing) { deplacement.x=deplacement.x*-1; deplacement.y=deplacement.y*-1; } if(balle.size()>80) { balle.remove(4); } else { fill(0, 255, 255); } ellipse(position.x, position.y, 40, 40); } }
Hors ligne