Annonce

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


#1 2014-09-28 13:41:49 [Débutant] Poo : Limites

alexis51151
membre
Date d'inscription: 2014-09-28
Messages: 24

[Débutant] Poo : Limites



Bonjour à tous,

Je poste un message sur ce forum car je travaille depuis peu sur un projet de modélisation de contagion, et j'ai donc choisi le langage "processing" recommandé par mon professeur de mathématiques pour réaliser cette modélisation, par sa simplicité (même si je trouve qu'il s'agit d'un langage très réglementé dans la syntaxe, ce qui m'a gêné et continue car je suis habitué au PHP, VB.NET dans lesquels j'ai des notions basiques), d'où ma requête sur les limites d'un cadre de jeu pour mon outil.

Je souhaite faire rebondir la "balle", mais j'ai quelques problèmes. J'ai essayé plusieurs méthodes :

Puis avec de la programmation orientée objet :

int a = int(random(-5,5));
int b = int(random(-5,5));

infection Infected1 = new infection(600,425,color(255));


void setup() {
  smooth();
  size(1200,850);
}

void draw() {
  background(0);
  noStroke();
  Infected1.affichage();
  Infected1.bouger(a,b);
}








class infection {
  int x;
  int y;
  int mouvX;
  int mouvY;
  color couleur;
  
  infection (int posX, int posY, color  nouvCouleur) {
    x = posX;
    y = posY;
    
    couleur = nouvCouleur;
    
  }
  
  void affichage() {
    fill(couleur);
    ellipse(x,y,20,20);
    
    
    
  }
 
 void bouger( int moveX, int moveY) {
   if ( x + moveX > width|| x + moveX < 0) {
     x = x - moveX;
   }
   else { 
     x = x + moveX;
   }
   if (y + moveY > height || y + moveY < 0) {
     y = y - moveY;
   }
   else {
     y = y + moveY;
   }
 
   }   
   
 

}

Je sais que ma requête peut vous paraître simpliste ( à la vue des sujets bien plus complexes traités sur ce forum), et libre à vous de m'aider, car je reste bloqué sur ce "détail" fonctionnel.

Dans le premier code, que j'ai abandonné pour me tourner vers le poo, la balle rebondie sur les côtés droit et gauche, mais pas en haut et en bas, ce que je ne comprends pas.
Quant à l'autre, lorsqu'elle rencontre les limites, elle remonte et reste bloquée.

Merci de votre aide, je suis un peu gêner de vous demander une solution pour quelque chose de si bête...

Merci d'avance smile

Hors ligne

 

#2 2014-09-28 15:17:02 Re : [Débutant] Poo : Limites

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

Re: [Débutant] Poo : Limites



Bonjour,

Tu as bien fait d'opter pour l'utilisation de classe.
Quitte à utiliser les classes, je te propose de l'approfondir avec cet exemple :

int a = int(random(-10, 10));
int b = int(random(-10, 10));

Infection infected1;

void setup() {
  smooth();
  size(1200, 850);
  infected1 = new Infection(600, 425, color(255), a, b);
}

void draw() {
  background(0);
  noStroke();
  infected1.affichage();
  infected1.bouger();
}

class Infection {
  int x;
  int y;
  int mouvX;
  int mouvY;
  color couleur;
  PVector vitesse;

  Infection (int posX, int posY, color  nouvCouleur, int a, int b) {
    x = posX;
    y = posY;
    vitesse = new PVector(a, b);
    couleur = nouvCouleur;
  }

  void affichage() {
    fill(couleur);
    ellipse(x, y, 20, 20);
  }

  void bouger() {
    x += vitesse.x;
    y += vitesse.y;
    if ((x > width) || (x < 0)) {
      vitesse.x *= -1;
    }
    if ((y > height) || (y < 0)) {
      vitesse.y *= -1;
    }
  }
}

Il y a une convention typographique en java. On met une majuscule au nom de la classe et pas de majuscule à une instance de celle-ci.
Il existe un outil très puissant, les PVector qui peuvent s'additionner très facilement. Si tu as des questions, nhésite pas. Bon courage.

Hors ligne

 

#3 2014-09-28 16:44:38 Re : [Débutant] Poo : Limites

alexis51151
membre
Date d'inscription: 2014-09-28
Messages: 24

Re: [Débutant] Poo : Limites



D'abord, merci beaucoup! Cela va me permettre d'avancer. Ensuite, je vais essayer d'analyser toutes les modifications avant de continuer pour bien m’imprégner de la logique du langage et de la technique utilisée.  Je ferais attention à la convention typographique, je ne connaissais pas!
Et je vais m'intéresser aux PVector.
Je pense que la prochaine étape est la classification via un tableau pour ajouter des infections.

Et encore, merci!

Je ferai part de l'avancée.

PS : Mon erreur sur les limites étaient l'addition/soustraction au lieu de la multiplication ?

Et j'apprécie l'utilisation des vecteurs, intéressant!

Dernière modification par alexis51151 (2014-09-28 16:52:56)

Hors ligne

 

#4 2014-09-28 19:27:40 Re : [Débutant] Poo : Limites

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

Re: [Débutant] Poo : Limites



Non, ton erreur était que tu ne modifiais pas la direction après le rebond. Pour t'exercer, tu peux coder la position comme un PVector.

Hors ligne

 

#5 2014-09-29 05:50:31 Re : [Débutant] Poo : Limites

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

Re: [Débutant] Poo : Limites



Bonjour

Un petit programme marrant;qui est susceptible de t'intéresser dans le cadre de tes recherches.

Code (P5) :

ArrayList bibittes;
ArrayList explosions;
 
void setup() {
  size(400,400);
  smooth();
  frameRate(20);
  bibittes = new ArrayList();
  explosions = new ArrayList();
  for ( int i =0; i < 30; i++ ) {
    bibittes.add( new Bibitte(random(width),random(height)) );
  }
}
 
void draw() {
  background(255);
 
 
  for ( int i =0; i < bibittes.size(); i++ ) {
    Bibitte bibitte1 = (Bibitte) bibittes.get(i);
    for ( int j = i+1; j < bibittes.size();j++ ) {
      Bibitte bibitte2 = (Bibitte) bibittes.get(j);
 
      float distance = dist( bibitte1.x , bibitte1.y , bibitte2.x , bibitte2.y );
      if ( distance < 20 ) {
 
        // Changer la direction des bibittes concernees
        float angle = atan2( bibitte2.y-bibitte1.y, bibitte2.x-bibitte1.x );
        bibitte1.angle = bibitte1.angleCible = angle + PI;
        bibitte2.angle = bibitte2.angleCible = angle;
 
        // Ajouter des explosions
        int nombreExplosions = floor(random(3,10));
        for ( int k =0 ; k < nombreExplosions ; k++ ) {
 
          // Trouver le point au centre des deux bibittes concerness
          float xCentre = bibitte1.x + cos(angle) * 10;
          float yCentre = bibitte1.y + sin(angle) * 10;
          Explosion explosion = new Explosion(xCentre, yCentre);
          explosions.add(explosion);
        }
      }
    }
  }
 
  // Dessiner les bibittes
  for ( int i =0; i < bibittes.size(); i++ ) {
    Bibitte b = (Bibitte) bibittes.get(i);
    b.draw();
  }
 
  // Dessiner les explosions et les retirer
  // si elles ont depasse leur duree
  for ( int i = explosions.size()-1; i >= 0; i-- ) {
    Explosion e = (Explosion) explosions.get(i);
 
    if ( e.draw() == false ) {
      explosions.remove(i);
    }
  }
}
 
class Bibitte {
  float x;
  float y;
  float angle;
  float angleCible;
  float v;
   
  Bibitte(float x, float y) {
    this.x = x;
    this.y = y;
    v = random(2,4);
    angle = random(PI*2);
    angleCible = random(PI*2);
  }
   
  
 
   
  void draw() {
    
    // Determiner si la bibitte de direction
    if ( random(100) < 5 ) {
       angleCible = random(PI*2);
   }
    
   // Deplacer la bibitte
   float angle_difference = angleCible - angle;
     
    angle_difference = angle_difference  % (PI * 2);
     
     if (angle_difference > PI) {
      angle_difference = angle_difference- PI * 2;
    } else if (angle_difference < -PI)  {
      angle_difference = angle_difference + PI * 2;
    }
     
    angle = angle_difference * 0.1 + angle;
     
    x = x + cos(angle) * v;
    y = y + sin(angle) * v;
     
    if ( x > width + 10) x = - 10;
    else if ( x < -10) x = width + 10;
    else if ( y > height + 10) y = - 10;
    else if ( y < -10) y = height + 10;
     
    // Dessiner la bibitte
    fill(0);
    noStroke();
    pushMatrix();
    translate(x,y);
    rotate(angle);
    ellipse(0,0,20,20);
    translate(7,0);
    fill(255);
    stroke(0);
    ellipse(0,-4,6,6);
    ellipse(0,4,6,6);
    popMatrix();
  }
 
}
 
class Explosion {
 
 
  float x;
  float y;
  color c;
  float taille;
  int duree;
  private int temps;
  float direction;
  float vitesse;
  float rotation;
  float vitesseRotation;
 
  Explosion( float x, float y) {
 
    this.x = x;
    this.y = y;
    c = color(random(200,256),random(0,256),random(0,30));
    taille = random(5,20);
    duree = floor(random(200,1500));
    temps = millis();
    direction = random(TWO_PI);
    vitesse = random(2,6);
    rotation = random(TWO_PI);
    vitesseRotation = random(-0.5,0.5);
  }
 
 
  boolean draw() {
 
    if ( millis() - temps > duree ) {
      return false;
    }
    else {
      x = x + cos(direction) * vitesse;
      y = y + sin(direction) * vitesse;
 
      noStroke();
      fill(c);
      pushMatrix();
      translate(x,y);
      rotation = rotation + vitesseRotation;
      rotate(rotation);
      rectMode(CENTER);
       
      // Changer la taille selon le temps restant
      int tempsEcoule = millis() - temps;
      float tailleCourante =  map( tempsEcoule , 0 , duree , taille , 0);
       
      rect( 0, 0, tailleCourante, tailleCourante );
      popMatrix();
    }
    return true;
  }
}

Hors ligne

 

#6 2014-09-29 18:23:39 Re : [Débutant] Poo : Limites

alexis51151
membre
Date d'inscription: 2014-09-28
Messages: 24

Re: [Débutant] Poo : Limites



Merci à toi fabrice54, je vais essayer d'étudier le fonctionnement du programme pour pouvoir m'en inspirer, même si l'histoire des angles me rebute un peu à première vue, ayant une tête plutôt les vecteurs.

Ce qui est intéressant est que je me consacre actuellement à cette fonction "ArrayList" pour l'utiliser afin de multiplier le nombre de "boules" donc ça va sans doute m'aider!

J'ai déjà un peu en tête mon projet final, mais je dois avouer que je suis quelque fois perdu avec la programmation qui offrent un espace de travail plus rigide que les maths étudiées en cours.

Bref, je vais déjà m'adonner à la formation des objets et à leur mise en mouvement, comme dans ton exemple, et je pense que je complexifierai ensuite avec les équations différentielles (que je vais devoir apprendre par moi-même...)

Sur ce, je vais passer une heure dessus demain, et je vais essayer d'appliquer des changements pour initialiser un nombre n d'objets.

Merci.

PS : étrange coïncidence, je venais tout juste de trouver ce script sur Internet en cherchant l'arrayList quand j'ai vu ton message, comme quoi ^^.

Dernière modification par alexis51151 (2014-09-29 18:25:04)

Hors ligne

 

#7 2014-09-30 05:00:39 Re : [Débutant] Poo : Limites

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

Re: [Débutant] Poo : Limites



Bonjour.

Un exemple d'arrayList dans processing.

Code (P5) :

ParticleSystem ps;

void setup() {
  size(640,360);
  ps = new ParticleSystem(new PVector(width/2,50));
}

void draw() {
  background(0);
  ps.addParticle();
  ps.run();
}





// A simple Particle class

class Particle {
  PVector location;
  PVector velocity;
  PVector acceleration;
  float lifespan;

  Particle(PVector l) {
    acceleration = new PVector(0,0.05);
    velocity = new PVector(random(-1,1),random(-2,0));
    location = l.get();
    lifespan = 255.0;
  }

  void run() {
    update();
    display();
  }

  // Method to update location
  void update() {
    velocity.add(acceleration);
    location.add(velocity);
    lifespan -= 1.0;
  }

  // Method to display
  void display() {
    stroke(255,lifespan);
    fill(255,lifespan);
    ellipse(location.x,location.y,8,8);
  }
  
  // Is the particle still useful?
  boolean isDead() {
    if (lifespan < 0.0) {
      return true;
    } else {
      return false;
    }
  }
}




// A class to describe a group of Particles
// An ArrayList is used to manage the list of Particles 

class ParticleSystem {
  ArrayList<Particle> particles;
  PVector origin;

  ParticleSystem(PVector location) {
    origin = location.get();
    particles = new ArrayList<Particle>();
  }

  void addParticle() {
    particles.add(new Particle(origin));
  }

  void run() {
    for (int i = particles.size()-1; i >= 0; i--) {
      Particle p = particles.get(i);
      p.run();
      if (p.isDead()) {
        particles.remove(i);
      }
    }
  }
}
Processing was initiated by

Hors ligne

 

#8 2014-09-30 05:17:18 Re : [Débutant] Poo : Limites

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

Re: [Débutant] Poo : Limites



Un arrayList simple qui met une balle quant tu appui sur la souris.

Code (P5) :

ArrayList particles;
 
void setup() {
  size(200, 400);
  particles = new ArrayList();
  smooth();
}
 
void draw() {
 
  background(255);
 
  // must cycle through ArrayList backwards, because
  // removing objects in the middle
  for (int i=particles.size()-1; i>=0; i--) {
    Particle p = (Particle) particles.get(i);
    p.run();
    p.gravity();
    p.display();
 
    // check to see if particle has fallen off screen
    // if so, remove it from the ArrayList
 
    if (p.y>height) {
      particles.remove(i);
    }
  }
 
  println(particles.size());
}
 
// add a new particle each time the mouse is pressed
void mousePressed() {
  particles.add(new Particle());
}
 
 
class Particle {
  float x;
  float y;
  float xspeed;
  float yspeed;
 
  Particle() {
    x = mouseX;
    y = mouseY;
    xspeed = random(-1, 1);
    yspeed = random(-3, 0);
  }
 
  void run() {
    x = x + xspeed;
    y = y + yspeed;
  }
 
  void  gravity() {
    yspeed += 0.05;
  }
 
  void display() {
    stroke(0);
    fill(0, 75);
    ellipse(x, y, 10, 10);
  }
}

Hors ligne

 

#9 2014-10-05 16:48:15 Re : [Débutant] Poo : Limites

alexis51151
membre
Date d'inscription: 2014-09-28
Messages: 24

Re: [Débutant] Poo : Limites



J'ai étudié les deux codes que tu m'as mis à disposition afin d'essayer de comprendre la fonction ArrayList.
Je pense l'avoir comprise, mais j'ai toujours des problèmes dessus.
Je ne comprends pas complétement la fonction get(), et dans le premier code, avec les particules, je ne comprends pas le 1.get() ( ligne 29).
Je pense avoir compris que get était en quelque sorte un rangement supplémentaire dans le arraylist, par exemple : on doit classer des points avec les coordonnées, on peut donc faire x.get() et y.get ?

Ensuite, je suis arrivé à ce code, qui bloque :

int a,b;
Infection infected1;

void setup() {
  smooth();
  size(1200, 850);
  infected1 = new Infection(600, 425, color(255), a, b);
}

void draw() {
  background(0);
  noStroke();
  infected1.affichage();
  infected1.bouger();
}

class Infection {
  int x;
  int y;
  int mouvX;
  int mouvY;
  color couleur;
  PVector vitesse;
  

  Infection (int posX, int posY, color  nouvCouleur, int a, int b) {
    x = posX;
    y = posY;
    vitesse = new PVector(int(random(-10, 10)), int(random(-10, 10)));
    couleur = nouvCouleur;
  }

  void affichage() {
    fill(couleur);
    ellipse(x, y, 20, 20);
  }

  void bouger() {
    x += vitesse.x;
    y += vitesse.y;
    if ((x > width) || (x < 0)) {
      vitesse.x *= -1;
    }
    if ((y > height) || (y < 0)) {
      vitesse.y *= -1;
    }
  }
}

class InfectionSystem {
  ArrayList<Infection> infected;
  PVector coordX;
  PVector coordY;
  
  InfectionSystem(PVector locationX, PVector locationY) {
    coordX = locationX.get();
    coordY = locationY.get();
    infected = new ArrayList<Infection>();
  }
  
  void addInfection() {
    infected.add(new Infection(coordX,coordY));
  }
  
  void afficher() {
    for (int i = 0; i < infected.size(); i++) {
      Infection in = infected;get(i);
      in.afficher();
    }
  }
  
}

Je cherche avant tout à comprendre mon erreur, et je ne veux donc pas un code tout refait... mais plutôt des explications qui me permettront d'avancer, et ainsi de devenir autonome dans la poursuite de mon travail.

Merci.

Dernière modification par alexis51151 (2014-10-05 16:48:39)

Hors ligne

 

#10 2014-10-05 20:28:25 Re : [Débutant] Poo : Limites

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

Re: [Débutant] Poo : Limites



Bonsoir,

Pour être précis dans les termes, ArrayList et une classe. C'est un objet qui permet de stocker des objets comme un tableau, mais en beaucoup plus puissant.
Il y a deux façons de parcourir un ArrayList (ArrayList<MaClasse> tab;):

for (int i = 0; i < tab.size(); i++) {
  MaClasse instance = tab.get(i);
  ...
}

La méthode get extrait l'élément avec comme indice i.

L'autre méthode :

for (MaClasse instance : tab) {
  ...
}

Tu peux consulter les différentes méthodes des ArryList ici :
http://docs.oracle.com/javase/1.5.0/doc … yList.html

Sinon, pour ton code, je me suis permis de peaufiner la gestion des coordonnées avec les PVector :

int a, b;
Infection infected1;

void setup() {
  smooth();
  size(1200, 850);
  infected1 = new Infection(600, 425, color(255), a, b);
}

void draw() {
  background(0);
  noStroke();
  infected1.affichage();
  infected1.bouger();
}

class Infection {
  int mouvX;
  int mouvY;
  color couleur;
  PVector position, vitesse;


  Infection (int posX, int posY, color  nouvCouleur, int a, int b) {
    position = new PVector(posX, posY);
    vitesse = new PVector(int(random(-10, 10)), int(random(-10, 10)));
    couleur = nouvCouleur;
  }

  void affichage() {
    fill(couleur);
    ellipse(position.x, position.y, 20, 20);
  }

  void bouger() {
    position.add(vitesse);
    if ((position.x > width) || (position.x < 0)) {
      vitesse.x *= -1;
    }
    if ((position.y > height) || (position.y < 0)) {
      vitesse.y *= -1;
    }
  }
}

class InfectionSystem {
  ArrayList<Infection> infected;
  PVector coordX;
  PVector coordY;

  InfectionSystem(PVector locationX, PVector locationY) {
    coordX = locationX.get();
    coordY = locationY.get();
    infected = new ArrayList<Infection>();
  }

  void addInfection() {
    infected.add(new Infection(coordX, coordY));
  }

  void afficher() {
    for (int i = 0; i < infected.size (); i++) {
      Infection in = infected.get(i);
      in.afficher();
    }
  }
}

Hors ligne

 

#11 2014-10-06 06:03:33 Re : [Débutant] Poo : Limites

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

Re: [Débutant] Poo : Limites



Bonjour.

J'ai regardez ton programme d’après ce que j'ai vus il manquerais un constructeur dans la class arrayList j'ai cherchez mais après différentes modifs je n'ai pas trouvez.Je t'envois donc un petit programme dans l’esprit du tiens mais en beaucoup plus simple. J’espère que cela pourras t'aider.

Code (P5) :

ArrayList<Balle> maBalle;
int nbBalle=3;

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.display();
    b.deplacement();
    
}
}
void mousePressed(){  
   maBalle.add(new Balle());
}

class Balle
{
  PVector position;
 PVector deplacement;
 PVector diametre;
 color couleur;
  Balle()
  {
    
    position=new PVector(random(0,width),random(0,height));
    deplacement=new PVector(random(-2,2),random(-2,2));
    diametre=new PVector(random(10,50),random(10,50));
    couleur=color(random(0,255),random(0,255),random(0,255));

  }
  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 display(){
  fill(couleur);
  ellipse(position.x,position.y,diametre.x,diametre.y);
}
}

Hors ligne

 

#12 2014-10-06 09:05:09 Re : [Débutant] Poo : Limites

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

Re: [Débutant] Poo : Limites

Hors ligne

 

#13 2014-10-06 14:29:19 Re : [Débutant] Poo : Limites

alexis51151
membre
Date d'inscription: 2014-09-28
Messages: 24

Re: [Débutant] Poo : Limites



J'ai enfin réussi ce que je souhaitais obtenir! Je me suis inspiré de la balle, et en ayant vraiment compris le but du ArrayList (merci à vous deux smile ), j'ai pu produire un code fonctionnel, qui reste à améliorer ( je tenterai de l'optimiser demain) :

Infection infected1;
int nbInfected = 10;
ArrayList<Infection> infected;

void setup() {
  smooth();
  size(1200, 850);
  infected1 = new Infection(600, 425, color(255));
  
  infected = new ArrayList<Infection>();
  
}

void draw() {
  background(0);
  noStroke();
  infected1.affichage();
  infected1.bouger();
  ajouter();
  former();
}

class Infection {
  int mouvX;
  int mouvY;
  color couleur;
  PVector position, vitesse;


  Infection (int posX, int posY, color  nouvCouleur) {
    position = new PVector(posX, posY);
    vitesse = new PVector(int(random(-10, 10)), int(random(-10, 10)));
    couleur = nouvCouleur;
  }

  void affichage() {
    fill(couleur);
    ellipse(position.x, position.y, 20, 20);
  }

  void bouger() {
    position.add(vitesse);
    if ((position.x > width) || (position.x < 0)) {
      vitesse.x *= -1;
    }
    if ((position.y > height) || (position.y < 0)) {
      vitesse.y *= -1;
    }
  }
}

void ajouter() {
  for (int i=0; i < nbInfected; i++) {
    infected.add( new Infection(int(random(0,1000)),int(random(0,800)), color(255)));
   
  }
}

void former() {
  for (int i=0; i < nbInfected; i++) {
    Infection in = infected.get(i);
    in.affichage();
    in.bouger();
  }
}

Il ne me reste plus qu'à apprendre par moi-même les équations différentielles (j'ai déjà a peu près compris) et à l'appliquer pour la modélisation, et je serai capable de finaliser mon projet. Je vais m'atteler à la présentation de l'interface maintenant, en mettant quelques exemple en plus.

Prochaine étape -> changer la couleur en cas de collision (nettement plus ardu je devine), donc il faudra que je réutilise get et que je suive les positions de chaque balle en permanence pour savoir si une est rentrée en collision avec un autre, je vais sans doute essayer de comprendre le principe avec le code qu'on m'avait donné un peu plus haut.

Dernière modification par alexis51151 (2014-10-06 14:37:46)

Hors ligne

 

#14 2014-10-06 15:27:44 Re : [Débutant] Poo : Limites

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

Re: [Débutant] Poo : Limites



Bonjour,

C'est bien tu es sur la bonne voie. Il y a cependant une erreur dans ton code. A chaque boucle du programme principal, tu ajoute des éléments au tableau, mais tu ne les vois pas car dans ton affichage tu te limites au 10 premiers.

L'ajout de toute les balles doivent se faire  à l'initialisation si tu veux un nombre précis au départ. C'est-à-dire dans la méthode setup().
Dans ton énumération des éléments de ton ArrayList il vaut mieux utiliser la méthode size() pour connaître la taille du tableau exact.
J'ai enlevé aussi la création de l'instance qui n'apparaît pas dans l'ArrayList.

int nbInfected = 10;
ArrayList<Infection> infected;

void setup() {
  smooth();
  size(1200, 850);
  infected = new ArrayList<Infection>();
  ajouter(nbInfected);
}

void draw() {
  background(0);
  noStroke();
  former();
}

class Infection {
  color couleur;
  PVector position, vitesse;

  Infection (int posX, int posY, color  nouvCouleur) {
    position = new PVector(posX, posY);
    vitesse = new PVector(int(random(-10, 10)), int(random(-10, 10)));
    couleur = nouvCouleur;
  }

  void affichage() {
    fill(couleur);
    ellipse(position.x, position.y, 20, 20);
  }

  void bouger() {
    position.add(vitesse);
    if ((position.x > width) || (position.x < 0)) {
      vitesse.x *= -1;
    }
    if ((position.y > height) || (position.y < 0)) {
      vitesse.y *= -1;
    }
  }
}

void ajouter(int nombreElements) {
  for (int i=0; i < nombreElements; i++) {
    infected.add( new Infection(int(random(0, 1000)), int(random(0, 800)), color(255)));
  }
}

void former() {
  for (int i=0; i < infected.size(); i++) {
    Infection in = infected.get(i);
    in.affichage();
    in.bouger();
  }
}

Hors ligne

 

#15 2014-10-07 04:37:50 Re : [Débutant] Poo : Limites

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

Re: [Débutant] Poo : Limites



Content que cela ai pus t'aider; je te fais parvenir un petit programme dont tu peux t'inspirer pour continuer ton programme .

Code (P5) :

int nb=10;    
Balle[]balle=new Balle[nb];    
void setup() {    
  size(800, 700);    
  for (int i=0;i<nb;i++) {    
    balle[i]=new Balle(random(width), random(height), -1, 1);
  }
}    
void draw() {    
  background(255);    
  for (int i=0;i<nb;i++) {    
    balle[i].rebondir();    
    balle[i].bouger();
  }    
  for (int i=0;i<nb;i++) {    
    for (int j = i + 1 ; j < nb; j++) {    
      balle[i].collision(balle[j]);
    }
  }
  for (int i=0;i<nb;i++) {    
    balle[i].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) {
      fill(255, 0, 255);
    } 
    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