Une balle sensible àla souris

Un code improvisé au cours, commenté pour s’y retrouver. Une balle parcours la fenêtre, rencontrer la souris lui fait changer de direction, plus le choc est violent, plus le ricochet est fort.

Note : ce code peut être allégé par l’emploi de la fonction dist(), qui permet de connaitre la distance entre deux points, et les variables réservées pmouseX et pmouseY qui permettent de conservent les coordonnées en x et y de la souris lors du frame précédent...

// Un code de démo de processing
// Stéphane, septembre 09

// position en x et y de la balle
float bx,by;

// vitesse de la balle sur l'axe x et y
float vx=2,vy=3;

// stocker la position precedente de la souris
int ancien_x=0,ancien_y=0;

// attendre que la souris aie quitté la balle
int attend=0;


void setup(){
  size(700,600);
  // position de départ alétoire de la balle
  bx=random(width);
  by=random(height);
  // vitesse aléatoire de la balle
  vx=random(6)+1;
  vy=random(6)+1;

  noStroke();
  background(0);
}

void draw(){
  // déplacer la balle en fonction de sa vitesse
  bx=bx + vx;
  by=by + vy;

  // la balle ricoche si elle atteind les bords
  if(bx>width || bx<0){ 
    vx=-vx; 
  }
  if(by>height || by<0){ 
    vy=-vy; 
  }

  // est-ce que la souris est sur la balle ?
  if(abs(mouseX-bx)<15 && abs(mouseY-by)<15){
    // est-ce que la souris n'était pas déjà dans la zone d'influence ? 
    // sinon oui ne rien faire
    if(attend==0){
      vx=(ancien_x-mouseX)+0.5;
      vy=(ancien_y-mouseY)+0.5;
      vy=-vy;
      vx=-vx;
      // securite : attendre que la souris aie quitte
      // la zone d'influence
      attend=1;
    } 
  } 
  else {
    // la boule quitte la zone d'influence, la souris peut être de nouveau active
    attend=0;
  }


  // dessiner la balle avec une couleur différente chaque fois
  fill(random(255),random(255),random(255));
  ellipse(bx,by,50,50);

  // stocker cette position pour le prochain frame
  ancien_x=mouseX;
  ancien_y=mouseY;

}