Annonce

>>> Bienvenue sur codelab! >>> Première visite ? >>> quelques mots sur codelab //// une carte des membres//// (apéros) codelab


#1 2014-10-16 05:59:33 syntaxe remove.

fabrice54
membre
Date d'inscription: 2012-06-07
Messages: 242

syntaxe remove.



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.

Code (P5) :

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

 

#2 2014-10-16 09:24:29 Re : syntaxe remove.

Mushussu
membre
Lieu: Orléans
Date d'inscription: 2012-05-24
Messages: 802

Re: syntaxe remove.



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

 

fil rss de cette discussion : rss

Pied de page des forums

Powered by FluxBB

codelab, graphisme & code : emoc / 2008-2024