Bonjour.
Dans le programme suivant je voudrais pouvoir enlever les deux balles qui se croisent avec l'instruction remove();
mais je n'arrive pas à trouver comment faire pour écrire cette syntaxe.(l'instruction remove est dans le sous progrmme comparer).
Merci.
ArrayList<Balle> maBalle; int nbBalle=20; void setup() { size(500, 500); smooth(); maBalle = new ArrayList<Balle>(); for (int i=0; i<nbBalle; i++) { maBalle.add(new Balle()); } } void draw() { background(255); for(int i = 0; i < maBalle.size(); i++) { Balle b = maBalle.get(i); b.rebond(); b.deplacement(); b.comparer(); b.display(); } } void mousePressed(){ maBalle.add(new Balle()); } class Balle { PVector position; PVector deplacement; PVector diametre; color couleur; boolean bing; Balle() { position=new PVector(random(0,width),random(0,height)); deplacement=new PVector(random(-2,2),random(-3,3)); diametre=new PVector(30,30); couleur=color(0); bing=false; } void deplacement(){ position.add(deplacement); } void rebond() { //detection des murs if (position.x < 0 ||position. x >= width) { deplacement.x=deplacement.x*-1; } if (position.y < 0 ||position. y >= height) { deplacement.y=deplacement.y*-1; } } void comparer(){ for(int i=0;i<maBalle.size();i++){ Balle pi=maBalle.get(i); for(int j=i+1;j<maBalle.size();j++){ Balle pj=maBalle.get(j); if (PVector.dist(pi.position,pj.position) < 20) { pi.bing=true; pj.bing=true; maBalle.remove(0);//ICI; } } } } } void display(){ if (bing) { fill(255, 0, 0); } else { fill(couleur); } ellipse(position.x,position.y,diametre.x,diametre.y); } }
Hors ligne
Bonjour,
La méthode remove() de la classe ArrayList a besoin d'une instance d'un objet à enlever pas un indice :
http://docs.oracle.com/javase/1.5.0/doc … tml#remove(java.lang.Object)
Donc il suffit de lui indiquer pi et pj les deux instances qui se sont heurtées dans le test.
Pourquoi avoir mis le type PVector pour diamètre ? La balle n'a besoin que d'un entier. J'ai introduit la variable rayon qui me paraît plus adéquate dans la gestion des collisions et j'ai donc fait le test de collision en testant la distance en fonction des deux rayons.
De plus, ce n'est pas une bonne pratique de programmation d'utiliser dans une classe une variable globale. Il faut passer en paramètre les variables glabelles pour qu'elles soient accessibles dans les méthodes de la classe.
J'ai donc créer un paramètre dans la méthode comparer().
ArrayList<Balle> maBalle; int nbBalle=20; void setup() { size(500, 500); smooth(); maBalle = new ArrayList<Balle>(); for (int i=0; i<nbBalle; i++) { maBalle.add(new Balle()); } } void draw() { background(255); for (int i = 0; i < maBalle.size (); i++) { Balle b = maBalle.get(i); b.rebond(); b.deplacement(); b.comparer(maBalle); b.display(); } } void mousePressed() { maBalle.add(new Balle()); } class Balle { PVector position; PVector deplacement; PVector diametre; color couleur; boolean bing; int rayon; Balle() { position=new PVector(random(0, width), random(0, height)); deplacement=new PVector(random(-2, 2), random(-3, 3)); diametre=new PVector(30, 30); couleur=color(0); bing=false; rayon = 15; } void deplacement() { position.add(deplacement); } void rebond() { //detection des murs if (position.x < 0 ||position. x >= width) { deplacement.x=deplacement.x*-1; } if (position.y < 0 ||position. y >= height) { deplacement.y=deplacement.y*-1; } } void comparer(ArrayList<Balle> listeBalle) { for (int i=0; i<listeBalle.size (); i++) { Balle pi=listeBalle.get(i); for (int j=i+1; j<listeBalle.size (); j++) { Balle pj=listeBalle.get(j); if (PVector.dist(pi.position, pj.position) < (pi.rayon + pj.rayon)) { pi.bing=true; pj.bing=true; listeBalle.remove(pi); listeBalle.remove(pj); } } } } void display() { if (bing) { fill(255, 0, 0); } else { fill(couleur); } ellipse(position.x, position.y, diametre.x, diametre.y); } }
Hors ligne