alexis51151 — 2014-09-28 13:41:49

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

Mushussu — 2014-09-28 15:17:02

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.

alexis51151 — 2014-09-28 16:44:38

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!

Mushussu — 2014-09-28 19:27:40

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.

fabrice54 — 2014-09-29 05:50:31

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;
  }
}
alexis51151 — 2014-09-29 18:23:39

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 ^^.

fabrice54 — 2014-09-30 05:00:39

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
fabrice54 — 2014-09-30 05:17:18

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);
  }
}
alexis51151 — 2014-10-05 16:48:15

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.

Mushussu — 2014-10-05 20:28:25

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();
    }
  }
}
fabrice54 — 2014-10-06 06:03:33

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);
}
}
fabrice54 — 2014-10-06 09:05:09

Explication sur la fonction get.
http://imss-www.upmf-grenoble.fr/prever … yList.html

alexis51151 — 2014-10-06 14:29:19

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 :) ), 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.

Mushussu — 2014-10-06 15:27:44

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();
  }
}
fabrice54 — 2014-10-07 04:37:50

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);
  }
}
fabrice54 — 2014-10-07 07:21:32

voici une syntaxe pour la programmation des arrayList pour comparer tes virus.
for ( int i =0 ; i < cerclesArrayList.size() ; i++ ) {
     
     CercleClass cercle_i = (CercleClass) cerclesArrayList.get(i);
     
     for ( int j =i+1 ; j < cerclesArrayList.size() ; j++ ) {
       
       CercleClass cercle_j = (CercleClass) cerclesArrayList.get(j);
       float distance = dist(cercle_i.x,cercle_i.y,cercle_j.x,cercle_j.y);
       if ( distance < (cercle_i.diametre + cercle_j.diametre)/2 ) {
         cercle_i.couleur = color(255,0,0);
         cercle_j.couleur = color(255,0,0);
       }
     }
   }

Mushussu — 2014-10-07 09:54:48

Le sujet des collisions à déjà été traité sur le forum :
http://codelab.fr/4540
http://codelab.fr/4505

Tu reconnaîtras certain protagonistes.

alexis51151 — 2014-10-08 13:18:34

Ah oui, je reconnais les intervenants :)

J'étudie le 1er code de fabrice54 et je me mets à étudier les autres cas.
Mon professeur de maths m'a dit qu'il pourrait m'aider à maitriser les équations différentielles, qui ne sont plus étudiées au lycée... Mais que sur la propagation, ça va être compliqué, et ce sera selon mes capacités.

fabrice54 — 2014-10-09 04:18:29

Bonjour.

Un code plus simple.

Code (P5) :

ArrayList<Balle> maBalle;
int nbBalle=10;

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();
    
}
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);
   
   maBalle.get(i).collision(maBalle.get(j));
  }
}

  
}
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(30,30);
    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 collision(Balle j){
  float distance=position.dist(j.position);
 
  if(distance<20){
    print(distance," ");

 
 
  }
  else{
    fill(255,0,255);
  
  }
    ellipse(position.x,position.y,diametre.x,diametre.y); 
}
}
alexis51151 — 2014-10-12 08:20:53

J'ai réfléchis sur la contamination, et j'ai complétement compris l'idée de vérifier pour chaque "balle" au départ la distance vis-à-vis des autres avec 2 boucles, ça devrait donc être fait rapidement!

PS : J'ai commencé mon programme collision, j'ai un résultat intéressant, mais il y a une erreur. Je vais la rechercher et je vous montre les résultats.

fabrice54 — 2014-10-13 05:22:08

Tu verras dans le dernier programme que je t'ais fais parvenir il y a des erreurs.C'est au niveau de la syntaxe.Je pense que c'est quelque chose comme ça" maBalle.(get i).couleur=color(0,255,0)"ceci est pour le changement de couleur  après collision.D'autre part la ligne " maBalle.get(i).collision(maBalle.get(j));   "dois être douteuse cette ligne permet de passer au sous_programme collision  mais je n'en connais pas trop la syntaxe ;car je n'ais pas trouvez d'exemple de programme arrayList avec  des vecteurs .

alexis51151 — 2014-10-13 15:50:54

J'ai réussi à faire ça, mais j'ai dû me tromper à un endroit...

void comparer() {
  for (int i=0; i < infected.size(); i++) {
    Infection ip = infected.get(i);
    for (int j=1; j < infected.size(); j++) {
      Infection je = infected.get(j);
        if (dist(ip.position.x,ip.position.y,je.position.x,je.position.y) < 20) {
          ip.couleur = color(255,0,0);
          
        }
      }
      
        
  }
}

PS : L'arborescence de mon programme était ainsi : je prends un objet dans le tableau, je le compare à tous les autres objets présents dans le tableau, ainsi que leur distance. Si elle est inférieure à 20 (la moitié du cercle), et qu'il se touche donc, le deuxième objet (donc ici je) devient rouge.

Cependant, lorsque j'utilise l'objet je et que je veux lui donner la couleur rouge, ça ne fonctionne pas contrairement à "ip.couleur" donc j'ai laissé celui-là.

Je pense que mon erreur se situe au niveau du fait que je le fais avec chacun des objets. Donc, si un a déjà été traité, il se retrouve traité une fois encore, ce qui fait qu'à la fin, je me retrouve avec un unique point blanc qui devient rouge en contact avec un autre rouge.
Je pense que la solution serait d'utiliser la fonction que fabrice m'a mis dans l'autre exemple, mais était parti sur cette méthode, j'aurais souhaité l'optimiser ainsi.
Peut-être dois-je réguler la comparaison ?

(le void comparer a bien été placé dans draw).

Mushussu — 2014-10-13 20:38:22

C'est bien tu avances.

Pour optimiser ton code et pour éviter les redondances, la deuxième boucle, il faut la faire partir de i + 1. Tout ceux d'avant ont déjà été traités.
De plus, comme tu utilises des PVector pour les positions, il est préférables d'utiliser les méthodes de cette classe. Il y'a la méthode PVector.dist() qui donne la distance entre deux vecteurs.
Pour les collisions, on peut introduire une variable booléenne dans la classe. Si il y a collision alors elle devient vraie.
La gestion de la couleur ne vient qu'au moment de l'affichage avec le choix de la couleur de remplissage.
Il faut bien par contre la remettre à false avant le nouveau tour de la boucle principale.

void comparer() {
  for (int i = 0; i < infected.size () - 1; i++) {
    Infection ip = infected.get(i);
    for (int j = i + 1; j < infected.size (); j++) {
      Infection je = infected.get(j);
      if (PVector.dist(ip.position, je.position) < 20) {
        ip.bing = true;
        je.bing = true;
      }
    }
  }
}

class Balle {
  boolean bing;

  Balle() {
    bing = false;
  }

  void afficher() {
    if (bing) {
      fill(255, 0, 0);
    } else {
      fill(couleur);
    }
    ellipse(position.x, position.y, 2 * rayon, 2 * rayon);
    bing = false;
  }
}
fabrice54 — 2014-10-14 05:50:06

Boonjour.
Je viens de voir les corrections que Mushussu a apportez à ton programme ;maintenant tous devrais fonctionner parfaitement bien.Comme tu utilise les vecteurs c'est cette ligne qu'il faut écrire pour calculer la distance entre deux vecteurs"  if (PVector.dist(ip.position, je.position.x) < 20) {"c'est celle là que je ne savais pas comment en écrire la syntaxe merci à Mushussu.

fabrice54 — 2014-10-14 06:34:50

Re.
Je te fais parvenir une version qui fonctionne dont tu pourras t'inspirer avec les corrections apportées par Mushussu.
Par contre j'ai fais une petite modif sur la ligne dont j'ai parlez précédemment ((PVector.dist(ip.position, je.position.x) < 20) ) car je n'ai pas pu faire fonctionner cette ligne; en me basant sur cet exemple j'ai écris"float distance=pi.position.dist(pj.position);"ceci a l'air de fonctionner correctement.


Code (P5) :

ArrayList<Balle> maBalle;  
int nbBalle=10;  
  
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);  
    float distance=pi.position.dist(pj.position);
    if(distance<20){
      pi.bing=true;
      pj.bing=true;
   
  
  }  
}

  }
}
   
 void display(){  
  if (bing) {
      fill(255, 0, 0);
    } else {
      fill(couleur);
    }
     
    ellipse(position.x,position.y,diametre.x,diametre.y);   
}  
}
Mushussu — 2014-10-14 09:25:30

J'avais fait une petite erreur d'inattention comme le code n'était pas complet :

      if (PVector.dist(ip.position, je.position) < 20) {
fabrice54 — 2014-10-15 05:38:37

Bonjour .

j'avais fini par trouver le petit problème;mais j'avais déjà écris la ligne;car pour trouver la syntaxe c’était pas simple,je voulais mettre des get() partout ;c'est quant j'ai vu ton exemple que j'ai compris qu'il fallait mettre ip et je.Bien que j'avais écris des lignes comme celle-ci"maBalle.get(i).collision(maBalle.get(j));  "dans la sous programme collision j'obtenais bien une distance entre deux balles;mais pour les croisements cela ne fonctionnait pas.Merci pour les corrections.

alexis51151 — 2014-10-15 20:27:29

J'ai utilisé un boolean comme recommandé, mais je n'ai pas encore le résultat escompté. Je vais travailler sur un code pour que la balle devienne rouge uniquement si celle qui la touche est rouge. Je vous tiens au courant.

Mushussu — 2014-10-15 20:32:50

D'accord, je comprend la contagion, dans ce que je proposais, c'était pour indiquer une collision. Tu peux créer une variable booléenne contamine :

boolean contamine;

Quand une boule "heurte" une autre si elle est contaminée alors elle devient contaminée.

alexis51151 — 2014-10-16 16:58:18

Oui, j'avais justement rajouté une booléenne sur le modèle de bing avec cet effet, reste à faire une syntaxe viable.
Je vais m'y atteler.

alexis51151 — 2014-10-20 14:51:36

J'ai continué le projet et ait réussi un assez bon programme qui semble fonctionner :

void contamination() {
  for (int k = 0; k < nbContamine;k++) {
    Infection cont = infected.get(k);
    cont.contamine = true;
    cont.couleur = color(255,0,0);
  }
}

et dans le sous-onglet de la class Infected, j'ai rajouté ça :

class Infection {
  color couleur;
  PVector position, vitesse;
  boolean bing, contamine;

  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;
    bing = false;
    contamine = true;
  }

  void affichage() {
    if (bing == true && contamine == true)  {
      fill(255,0,0);
    }
    else {
    fill(couleur);
    }
    ellipse(position.x, position.y, 20, 20);
  }

Je pressens que mon professeur va me dire que mes fonctions n'ont pas vraiment des noms adaptés, il faudra que je pense à les modifier pour que les autres personnes sur le projet puissent s'y retrouver quand je leur expliquerai ^^.

Mushussu — 2014-10-20 15:09:12

C'est chouette que tu arrives à quelque chose qui te convienne. Ce serait bien que tu postes sur le forum ton code sous la forme d'un fichier zip, pour que d'autre personne puisse s'en inspirer.

Il est important, comme tu le dis, que les noms de méthodes et de classes soient bien explicite pour pouvoir être utilisés par d'autres.

Continue ton exploration.

alexis51151 — 2014-10-21 15:07:58

Oui, dès que j'aurai fini mon projet, je le posterai en intégralité pour qu'on s'en inspire.
Je vais essayer de faire des compteurs pour des statistiques maintenant.
Cela semble compliqué à cause du fonctionnement de "draw", qui met à jour à chaque fois la boucle, ce qui donne des nombre infiniment grands.

Mushussu — 2014-10-30 15:01:48

Bonjour,

Beau boulot et beau projet pour mettre les mains dans le code.
- Sur ta question principale, en fait tu n'avais pas besoin de la variable bing dans ta classe. La variable contamine suffit. Si deux boules se rencontrent et que l'une d'elle est contaminée alors elle contamine l'autre. C'est le travail réalisé dans la méthode comparer().

- Il faut que tu fasses un travail de renommage de ta classe et de tes variables qui ne sont pas parlantes. La classe principale n'est pas une infection, c'est une personne, un agent, une balle …
Cet agent a des caractéristiques notamment celui d'être contaminé.

- j'ai modifié la méthode affichage de la classe car pour chaque agent, tu redessinais le cadre et le texte.

- J'ai changé la méthode bouger_GUI, en méthode changer avec le prototype suivant :

void bouger(int bordGauche, int bordHaut, int bordDroit, int bordBas);

Cela s'appelle la surcharge de méthode. Le programme suivant que tu passes ou non des arguments dans ta méthode choisira l'une ou l'autre.

- Attention tu as sans doute mis un nouvel onglet pour ta classe, mais si tu mets des variables avant le mot-clef class, ces variables sont considérées comme globales. Et il ne faut pas utiliser dans une class des variables globales.

- Pour l'initialisation des agents, j'ai introduit un autre paramètre dans le constructeur pour savoir s'il sont contaminés au départ.

alexis51151 — 2014-10-31 18:09:50

Merci pour ton aide. J'avais hier supprimé mon message car j'ai trouvé la solution après de multiples essais, d'où mon soulagement.
Mais, aujourd'hui, j'ai décidé de faire une sorte de "panneau de configuration" annexe qui ouvrirait une autre fenêtre lorsque l'on cliquerait sur un bouton.
J'ai donc cherché sur Internet, car je n'arrivais pas en utilisant les void draw et setup à avoir le résultat, et suis tombé sur le sujet du forum http://codelab.fr/4435 . J'ai donc lu les réponses et tenté de comprendre le code.
J'en suis ainsi venu à savoir que PApplet était en fait la librairie pour processing, que Frame était la classe que je devais utiliser pour créer une nouvelle fenêtre, et que setBounds servait à positionner la nouvelle fenêtre par rapport à la première.

Je me suis donc amusé à reproduire cela, c'est-à-dire à faire apparaître une deuxième fenêtre le plus simplement possible, et ayant réussi, je me suis lancé dans mon code.

Là, déjà, un problème de taille : n'ayant que très peu (voir aucunes) notions en Java, mais me remémorant du PHP, je vois des "public" avant les classes. Je sais que c'est pour que la classe soit valable dans tout le code. Je l'enlève donc comme je l'avais fais dans le programme simplifié.
Je renomme les classes avec des noms évocateurs (avant cela j'avais essayé avec tout le code d'origine, excepté les void setup et draw de la page de base). Mais, des erreurs apparaissent. Je tente beaucoup de choses, sans succès.
Je pense être cette fois-ci réellement perdu car j'ai deux parties en création (le input et la nouvelle fenêtre) qui sont liés entre-eux, je fusionne donc une partie de input avec la nouvelle fenêtre pour faire un input dans celle-ci (mon but final).

J'ai obtenu cela :

On peut observer que le bouton est prêt. Le problème ici est que je ne peux pas exécuter le programme à cause d'une erreur : "Cannot find a class or type named Cadre". Pour résoudre ce problème, j'ai passé la classe "Cadre" en public class, sans aucune amélioration. J'avais auparavant enlevé la déclaration d'un objet pour chacune de ces classes, car processing ne les trouvaient pas, avec le même message d'erreur.

J'espère que tu pourras m'aider, voire m'expliquer si possible.

Je te laisse aussi le code modifié de mes deux autres onglets (principal et classe Infection) pour te montrer comment j'ai réussi à faire fonctionner le programme.

Onglet principal :

Onglet Infection :

J'ai observé la forme de la fonction bouger que tu me proposes, je vais voir si je la mets ou non demain.

Merci beaucoup pour ton aide, tu es en quelque sorte mon guide dans ce monde de la programmation. Je passe de nombreuses heures sur ce programme car il sera un atout lors de la présentation de mes travaux, mais aussi par passion car je pense que la programmation permet tout, et cela me permet aussi de comprendre comment fonctionne les choses avec lesquelles nous vivons chaque jour, pour voir qu'ils ne sont pas si complexes.

Encore merci, et à bientôt.

Mushussu — 2014-10-31 23:53:55

Bonsoir,

Tu avais mis la définition de ta classe SecondeFenetre dans une méthode, donc elle ne se créait jamais. J'ai remis cela tout en ordre. Cependant,
- Il y a une convention typographique en java pour nommer les classes. Il faut que le première lettre soit en majuscule, on n'utilise pas les tirets, tous les mots sont agglutinés et chacun a une majuscule à la première lettre.
- Il faut donc déclarer les classes Cadre et SecondeFenetre comme les autres.
- Il y a une distinction entre les méthodes mousePressed et mouseClicked, regarde bien l'aide.
- PApplet et la classe de Processing
- Il faut vraiment séparer l'affichage de tes menus de l'affichage de tes agents. Le menu est distinct de la classe Infection. Donc il doit apparaître dans la méthode draw
- Dans un forum, l'aide est pour tout le monde, donc ne supprime pas tes messages, ils eurent servir pour une autre personne. Tu peux faire une modification en indiquant que tu as trouvé la solution au problème.
- Comme ton programme commence a être long, compresse-le et joint le dans ta future réponse.
- Il y avait aussi un problème lors de ton test de survol du bouton un mouseX qui devait être un mouseY

Bon courage pour la suite.

alexis51151 — 2014-11-01 08:57:00

Bonjour,

j'ai observé et remanié le code, j'espère enfin avoir compris et intégré les majuscules pour les classes, je me souviens que tu me l'avais déjà dis pour la classe Infection.
J'ai ce matin commencé la programmation d'une classe Input permettant donc de l'utiliser dès que je le souhaite, mais je trouve encore un message d'erreur.

Je pense que créer directement une classe pourra m'être plus utile, si je fais un interface graphique car le style que j'aurais mis sur celle-ci (input) s'appliquera à toutes les autres.

Je mettrai, sous ton conseil, dorénavant mon fichier en zip.

Merci.

Mushussu — 2014-11-01 13:07:42

C'est une bonne idée de créer une classe pour un nouvel objet qui serait un champ de saisie.

C'est un peu complexe de gérer les évènements clavier, souris … Ce n'est pas aussi trivial que tu le penses. Va voir l'article du wiki du Labomedia que j'ai rédigé :
http://wiki.labomedia.org/index.php/Acc … une_classe

Il existe une librairie Processing qui a déjà tout les éléments GUI. Elle s'appelle controlP5 :
http://www.sojamo.de/libraries/controlP5/

Il y a une erreur dans le constructeur de ta classe Input :

Input(int posX, int posY, int longRect, int largRect) {

N'hésite pas à créer des onglets, un onglet par classe.

J'ai un peu modifier le code que j'ai posté précédemment, j'ai utilisé la méthode isShowing() pour savoir si la fenêtre est visible ou non. Cela évite l'utilisation d'une variable.

alexis51151 — 2014-11-02 08:47:24

Bonjour, j'ai analysé ton code sur Labomedia, et pense l'avoir compris dans l'ensemble. Il me reste une zone de flou : les getX(), getAction()... ont-ils été déclarés auparavant dans le programme ? Car ils ne semblent pas être reconnus par processing. Dois-je alors importer une librairie ?

Hormis cela, j'avais entendu parler de la librairie controlP5 mais je pense qu'il serait préférable que je tente d'abord par moi-même, bien sûr les résultats graphiques seront peu enviables à celle-ci. Alors, je pourrais peut-être l'utiliser au moins pour l'aspect graphique "soigné".

Et j'ai une dernière question quant à cette bride de code :

void mousePressed() {
  if ((mouseX > 960) && (mouseX < 1190) && (mouseY > 120) && (mouseY < 220)) {
    if (c.isShowing()) {
      c.setVisible(false);
    } else {
      c.setVisible(true);
    }
  }
}

J'ai compris que la fonction isShowing() renvoyait l'état de l'objet selon deux attributs -> est-il ou non visible.
Mais le problème vient ensuite : le if a donc pour but que si la fenêtre est ouverte (donc visible), elle ne l'est plus, et sinon qu'elle le soit ? Je viens de comprendre, qu'en réalité, c'est pour la refermer avec le bouton, n'est-ce-pas ?
Ne serait-il pas enviable de pouvoir aussi refermer la fenêtre avec la croix de celle-ci, ce qui n'est actuellement pas possible.


PS : Pour les Get()..., je viens de trouver ceci : http://processing.org/reference/javadoc … Event.html qui semble bien correspondre à l'explication que je cherchais.

J'ai donc adopté un nouvel import :

import java.lang.Object;

Question : Est-il utile ou déjà incorporé à processing ?

Mushussu — 2014-11-02 11:41:50

Bonjour,

Le programme du wiki tourne sans importer de librairie supplémentaire. Je suis avec la dernière version de Processing la 2.2.1. Comme tu l'as vu getX() est défini dans la classe mouseEvent de Processing.

Donc si la fenêtre est ouverte, elles se ferme
Sinon, elles s'ouvre

alexis51151 — 2014-11-03 15:24:24

Bonjour,

J'ai poursuivi l'assimilation de ton code, en l'aménageant (trop peu, mais malheureusement mon manque de connaissances ne me laisse que peu d'originalité, mais l'habitude me fait me rappeler d'initialiser... désormais) mais je pense qu'une partie (surtout pour le keyEvent ou Clavier dans mon cas) n'est pas indispensable, je n'ai besoin de gérer qu'un nombre limité d'informations différentes, le but étant d'avoir un interface simple et efficace.

J'ai donc fais à part le programme de la classe, pour le corriger, mais une erreur apparaît : le programme ne parvient pas à trouver la méthode Souris() qui est pourtant public.

Merci pour l'aide.

Mushussu — 2014-11-03 20:49:33

C'est un but tout à fait louable de franciser ton application, mais dans ce cas là ce n'est pas approprié. Les méthodes doivent être celles définies par Processing.
Si tu remplaces Clavier par keyEvent et Souris par mouseEvent la compilation se déroule normalement.

alexis51151 — 2014-11-05 15:08:35

Bonjour,

J'ai réussi ma classe input ainsi :

Désormais, je souhaite ajouter un input dans ma seconde fenêtre. Je vais donc dans le setup() de la seconde fenêtre et ajoute ceci :

public class SecondeFenetre extends PApplet {
  public void setup() {
    size(400, 300);
    entree = new Input(this,100,100,100,100,color(255,0,0));
    noLoop();
  }

  public void draw() {

  }
}

Je remarque lorsque je fais certaines manipulations tout en positionnant l'input dans l'Applet SecondeFenetre qu'il est toujours par rapport à l'Applet principal car il se positionne par rapport à celle-ci.

Je me demande donc où je dois initialiser mon nouvel objet.

Mushussu — 2014-11-06 16:36:19

Il ne faut pas croiser les effluves. c'est mal.
Evite de déclarer une variable globale, ici entrée, pour l'utiliser dans une classe.

Je te propose une solution qui ne me satisfait pas, mais qui fonctionne. Il faut mettre la déclaration de ta classe dans la classe Secondefenetre. Il faut que je me penche sur cette histoire de classe emboitées.

public class SecondeFenetre extends PApplet {
  Input entree;
  
  public void setup() {
    size(400, 300);
    entree = new Input(this, 100, 100, 100, 100, color(255, 0, 0));
    noLoop();
  }

  public void draw() {
  }
  
  public class Input {
    ...
  }
}

Petite remarque, je viens de découvrir que la méthode registerDraw() était dépréciée. Il faut remplacer :

page.registerDraw(this);

par

page.registerMethod("draw", this);
alexis51151 — 2014-11-11 09:52:44

Bonjour,

Cela fait plusieurs jours que je suis face à un problème que je ne comprends pas : mon code semble fonctionnel (celui avec l'input), mais lorsque je tape un caractère, il apparaît trois fois.

Alors, je vérifie mon code, avec le plus d'éventualités qui me viennent à l'esprit (fermer les possibilités sur le boolean curseur pour le remettre à false si l'utilisateur n'est plus sur le rectangle)... mais ceci est fonctionnel.
Je décide ensuite d'étudier plus particulièrement cette petite partie du code "evenement.getKey()" mais je ne trouve aucun problème particulier.
J'en viens donc à la conclusion qu'il s'agit d'un problème de répétition, mais je ne sais guère où.
Une aide me serait précieuse, merci.

Voici le code de la partie, et le code entier en zip :

Mushussu — 2014-11-11 10:20:15

Bonjour,

C'est normal que trois lettres apparaissent, car tu ne fais pas le tri dans les évènements. Donc tu as un KeyEvent.PRESS, un KeyEvent.TYPE et un KeyEvent.RELEASE. D'ailleurs quand tu appuies sur une touche, il n'y a que deux lettres qui s'affichent la troisième vient quand tu relâches la touche.

Donc, voici ton bout de code :

public void keyEvent(processing.event.KeyEvent evenement) {
    if (curseur && (evenement.getAction() == KeyEvent.PRESS)) {
      taper = taper + evenement.getKey();
      if (evenement.getKey() == RETURN) {
        sauvegarder = taper;
        taper = "";
      }
    }
  }
alexis51151 — 2014-11-11 14:35:22

Ah d'accord! J'avais tenté de remédier à ce problème avec le "switch" mais il me paraissait trop complexe pour mon usage. Ceci explique donc cela. Merci pour ton aide.

alexis51151 — 2014-11-15 17:38:21

Bonsoir,

j'avance prudemment dans la réalisation de mon projet, toujours accaparé par la classe "input", après avoir réalisé un changement de direction toutes les "x" secondes pour un plus grand réalisme (dérisoire pour le moment, mais que je compte entreprendre très bientôt).
J'ai donc réalisé mon premier champ de saisie, avec comme but de permettre à l'utilisateur de rentrer le nombre de balles voulues, et qu'une fois le nombre saisie, qu'il y ait un ajout... Je sais que cela est complexe, car induisant de recréer toutes les balles, mais je pensait que l'ayant mis dans le "draw", cela s’alignerait sur le nouveau nombre de balles.
Je me demande donc par quel moyen je peux faire ce changement de manière dynamique. Dois-je faire un void qui engloberait tous les autres et s'enclencherait à chaque fois que l'utilisateur saisit un nouveau nombre ? Ou une simple redirection de la variable sauvergarder vers le programme principal suffirait ?

Je joins ci-dessous mon nouveau code.

Mushussu — 2014-11-15 20:21:36

Bonjour,

Je n'ai pas bien saisi ce que tu souhaites faire. Ce que j'ai cru entrevoir, c'est que ton champ saisi sert à ajouter un nombre de balles, aux balles déjà en place. Pour cela, comme tu as déjà une méthode ajouter() il suffit d'ajouter le nombre de balles correspondant.

J'ai testé ton programme, comme je n'ai pas de pavé numérique, je suis obligé d'appuyer sur la touche shift qui ajoute un caractère étrange à ton champ de saisie.

alexis51151 — 2014-11-16 08:11:23

Oui, en effet. J'ai déjà la méthode ajouter(), mais le problème est que lorsque je choisis le nombre de balles, le programme s'est déjà lancé. Je pensais, comme toi d'après ce que j'ai compris, que le nombre de balles serait modifié, mais ce n'est pas le cas.

J'ai pensé que le problème venait du fait que j'avais mis "nbInfected = sauvegarder;" dans ma classe, ce qui fait qu'il n'est peut-être pas accessible à la méthode ajouter(). Ou dois-je simplement mettre une nouvelle méthode ajouter() dans la classe qui se produirait lorsque l'utilisateur change la saisie ? Bien sûr, cette nouvelle méthode resterait ancrée sur la première fenêtre.

Sinon, certains caractères ne sont en effet pas reconnus (enter,return,shift....) et j'ai déterminé un nombre maximum de chiffres.

J'ai tenté des modifications, sans succès :

void setup() {
  time1 = second();
  frameRate(100);
  smooth();
  size(1200, 850);
  infected = new ArrayList<Infection>();
  ajouter(nbInfected);
  ajouter(int(sauvegarder));
  c = new Cadre();
  c.setTitle("Panneau de configuration");
}

   public void keyEvent(processing.event.KeyEvent evenement) {
    if (curseur && (evenement.getAction() == KeyEvent.PRESS)) {
      if (taper.length() < 4) {
      taper = taper + evenement.getKey();
      }
      if (evenement.getKey() == ENTER) {
        sauvegarder = taper;
        taper = "";
       int(sauvegarder);
       println(sauvegarder);  
      }
    }
  }
Mushussu — 2014-11-16 10:41:09

OK, j'ai compris ton erreur. Effectivement il ne suffit pas de changer la variable pour que le nombre de balles évolue. Quand le la touche ENTER est pressée il faut faire appel à une méthode pour ajouter des balles.
Dans le code ci-dessous, je fais un traitement des caractères entrés.

    public void keyEvent(processing.event.KeyEvent evenement) {
      if (curseur && (evenement.getAction() == KeyEvent.PRESS)) {
        if (evenement.getKey() == ENTER) {
          ajouter(Integer.parseInt(taper));
          println(taper);
          taper = "";
          return;
        }
        if ((taper.length() < 4) && (evenement.getKey() >= 48) && (evenement.getKey() <= 57)) {
          taper = taper + evenement.getKey();
        }
      }
    }

Je fais appel à la méthode ajouter(), ce qui n'est pas optimal. Dans ce genre de problème, il est utile de créer une classe qui serait le système de balles avec les méthodes afférentes qui servent à gérer l'ajout et la suppression des balles. On peut ainsi facilement passer l'unique instance de cette en paramètres dans les méthodes des autres classes.
Regarde ici :
http://processing.org/examples/simplepa … ystem.html

alexis51151 — 2014-11-16 11:29:07

Merci! Je comprends donc que le getKey() entre 48 et 57 correspond aux chiffres, ce que je cherchais depuis longtemps! Je vais désormais utiliser le code que tu m'as conseillé pour enlever des balles, ainsi qu'une rapide recherche pour connaître des correspondances en getKey de certains caractères.
Où puis-je trouver ces correspondances en getKet() ? J'ai cherché sur la documentation de Processing, sans succès hormis les réponses mais pour Java.

Mushussu — 2014-11-16 11:31:22

Oui, pardon, j'ai été un peu vite getKey() renvoie un char. Or les chiffres sont codés dans la table ASCII de 48 à 57 :
http://www.asciitable.com

alexis51151 — 2014-11-23 08:16:32

J'achève la partie ajouter/enlever des balles de mon programme mais je tombe sur un autre problème : lorsqu'il s'agit d'enlever une balle, si l'on enlève plus de balles qu'il n'y en a, j'ai une erreur (ce qui est logique somme toute).
Pour remédier à cela, j'ai tenté de vérifié dans mes différentes boucles que je n'enlèverai un nombre de balles que si le nbInfected (nb de balles) est supérieur ) 0.

Mais, même en ayant essayé avec l'ensemble des void qui interagissent avec cette partie du programme, je ne parviens pas à faire cesser cette erreur.

J'ajouterai par la suite des boutons pour ajouter/enlever, mais le problème actuel réside dans cette erreur, que je ne parviens pas à résoudre.
Je pense qu'une solution serait de rendre publique taper, qui lui évolue car nbInfected est toujours égal à 4, mais je ne sais pas comment faire.

Je mets le code en .zip ci-dessous.

Mushussu — 2014-11-23 18:46:54

Bonsoir,

Tu ne fais pas de test pour savoir si le nombre d'éléments à enlever est inférieur à la taille de ton tableau. Pour connaître la taille actuelle de ton tableau, c'est la méthode size() qu'il faut utiliser.
D'autre part, j'ai constaté que tu faisais à chaque tour appel à la méthode contamination() or il n'est nécessaire qu'une seule fois dans le setup().
Voici la méthode enlever() que je te propose :