Annonce

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


#1 2013-10-23 08:49:03 ArrayList?

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

ArrayList?



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.


Code (P5) :

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

 

#2 2013-10-23 10:03:37 Re : ArrayList?

Makio135
membre
Lieu: Lyon
Date d'inscription: 2010-11-11
Messages: 89
Site web

Re: ArrayList?



à priori ça devrait juste être:

b.collision(c);

Hors ligne

 

#3 2013-10-23 11:59:39 Re : ArrayList?

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

Re: ArrayList?



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

 

#4 2013-10-23 13:46:13 Re : ArrayList?

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

Re: ArrayList?



j'ai fini par trouver l'erreur ,mais ça ne fonctionne pas bien .Il doit y avoir un autre problème.

Code (P5) :

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

 

#5 2013-10-23 22:00:56 Re : ArrayList?

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

Re: ArrayList?



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

 

#6 2013-10-24 06:46:35 Re : ArrayList?

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

Re: ArrayList?



bonjour
merci pour tes conseils,comment faire pour régler le problème de dysfonctionnement?
Merci;

Hors ligne

 

#7 2013-10-24 08:39:43 Re : ArrayList?

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

Re: ArrayList?



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

 

#8 2013-10-24 11:18:48 Re : ArrayList?

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

Re: ArrayList?



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

 

#9 2013-10-24 13:19:54 Re : ArrayList?

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

Re: ArrayList?



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

 

#10 2013-10-24 16:17:05 Re : ArrayList?

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

Re: ArrayList?



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));

Code (P5) :

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

 

fil rss de cette discussion : rss

Pied de page des forums

Powered by FluxBB

codelab, graphisme & code : emoc / 2008-2024