/* Le programme illustre une voiture qui apparaît aléatoirement dans la fenêtre avec une onde qui suit jusqu'à t+50 pixel devant elle.
Des obstacles apparaîssent aléatoirement devant la voiture. A l'aide de l'onde,la voiture va esquiver les obstacles qui apparaissent devant elle */
 
// DECLARATION des variables
 
 
float xond=100;                 //Position sur axes des abcisses de l'onde 
float xvoit=70;                 //Position sur axe des abscisses de la voiture   : x de 0 à 70 = accélération de la voiture
float yvoit= random(50,100);     //Position random sur axe ordonnée de la voiture
float yond=yvoit;               //Position axe ordonnée onde = ordonnée voiture
 
//Tailles et placement des obstacles
//OBSTACLE 1
float lobs1 = random(8,40);      //Largeur de l'obstacle n°1
float xobs1 = random(200,595);   //Random abscisses obstacle n°1
float yobs1 = random(40,100);    //Random ordonnée obstacle n°1
//OBSTACLE 2
float lobs2 = random(8,40);      //L. de l'obstacle n°2 
float xobs2 = random(200,595);   //random abscisses obstacle n°2
float yobs2 = random(40,100);    //random ordonnées obstacle n°2
 
//OBSTACLE 2
float lobs3 = random(8,40);      //L. de l'obstacle n°3 
float xobs3 = random(200,595);   //random abscisses obstacle n°3
float yobs3 = random(40,100);    //random ordonnées obstacle n°3
 
//Boolean de pour les deplacements
 
boolean onde=true;            //boolean pour le mouvement de l'aller-retour onde
 
boolean obs1b=false;          //boolean pour l'esquive par le bas de l'obstacle 1    lorsque (yvoit+10 >= yobs1+lobs1/2)
boolean obs1h=false;          //boolean pour l'esquive par le haut de l'obstacle 1    lorsque (yvoit+10 <= yobs1+lobs1/2)
 
boolean obs2b=false;          //boolean pour l'esquive par le bas de l'obstacle 1     lorsque (yvoit+10 >= yobs2+lobs2/2)
boolean obs2h=false;          //boolean pour l'esquive par le haut de l'obstacle 1    lorsque (yvoit+10 <= yobs2+lobs2/2)
 
boolean obs3b=false;          //boolean pour l'esquive par le bas de l'obstacle 1     lorsque (yvoit+10 >= yobs3+lobs3/2)
boolean obs3h=false;          //boolean pour l'esquive par le haut de l'obstacle 1    lorsque (yvoit+10 <= yobs3+lobs3/2)
 
 
void setup() {
size (600,600);
 
}
 
void draw() {
  background (#FADC2D);      //couleur de fond
  
  //définition des tailles des différents élèments
  voiture();                 //classe qui représente les paramètres de la voiture
  rect(xond+2,yond,1,20);    //onde  x+2 pour décalage bug par rapport a la voiture. le y=milieu voiture
  rect(xobs1,yobs1,1,lobs1); //obstacle n°1
  rect(xobs2,yobs2,1,lobs2); //obstacle n°2
  rect(xobs3,yobs3,1,lobs3); //obstacle n°3 
  
  deplacementonde();   //classe qui représente le déplacement de l'onde
 
 
//esquive de l'osbtacle 1 
 mvtobs1b();           //Mouvement de la voiture si l'obstacle 1 se dresse devant elle et si le plus court chemin pour l'esquiver passe par le bas de cet obstacle  
 
 mvtobs1h();           //Mouvement de la voiture si l'obstacle 1 se dresse devant elle et si le plus court chemin pour l'esquiver passe par le haut de cet obstacle
 
//esquives de l'obstacle 2
 
 mvtobs2b();           //Mouvement de la voiture si l'obstacle 2 se dresse devant elle et si le plus court chemin pour l'esquiver passe par le bas de cet obstacle
 
 mvtobs2h();           //Mouvement de la voiture si l'obstacle 2 se dresse devant elle et si le plus court chemin pour l'esquiver passe par le haut de cet obstacle
 
//esquives de l'obstacle 3
 
 mvtobs3b();           //Mouvement de la voiture si l'obstacle 3 se dresse devant elle et si le plus court chemin pour l'esquiver passe par le bas de cet obstacle
 
 mvtobs3h();           //Mouvement de la voiture si l'obstacle 3 se dresse devant elle et si le plus court chemin pour l'esquiver passe par le haut de cet obstacle
 
//FIN DU DRAW
 
//différentes CLASS pour l'organisation du programme
 
//void des paramètres de la voiture
void voiture() {
  rect(xvoit,yvoit,-30,20);  //tailles voiture
  xvoit=xvoit+1;             //vitesse voiture
}
 
//void du déplacement de l'onde  
/* PARAMETRAGE ONDE ALLEZ RETOUR
Si le boolean onde==true ET SI xond est inférieur à sa distance max(xvoit+50), alors onde avance
SINON onde == false et si onde == false et tant que xonde est supérieur au capot de la voiture ALORS onde recule
SINON onde == true
*/
void deplacementonde() {
  if(onde==true){
  if(xond
  xond=xond+4;              
 }else{
 onde=false;
 }
}else{
 if(xond>xvoit){                       
  xond=xond-2;
 }else{
 onde=true;
 }
}
}
 
/* DIFFERENTS VOID D'ESQUIVES D'OBSTACLES
Si la voiture se situe dans la moitié inférieure de la taille de l'osbtacle , alors la voiture esquive l'obstacle par le haut
Si la voiture se situe dans la moitié supérieur de la taille de l'osbtacle , alors la voiture esquive l'obstacle par le bas
*/
 
//void mvtobs1b  mouvement d'esquive par le bas de l'obstacle 1
 
void mvtobs1b() {
 if((xond >= xobs1) && (yvoit+10 >= yobs1+lobs1/2) && (yvoit+10 <= yobs1+lobs1+10))  /*si le x de l'onde dépasse ou est égal au x d'une obstacle , ET SI, Le capot de la voiture se situe sur la moitié supérieure de 
 l'obstacle, ET SI, le capot de la voiture se situe sous la longeur de l'obstacle alors : */
 {
 obs1b=true;                            //boolean de l'esquive d'obstacle devient vrai
 if(obs1b==true)                        //si ce boolean est vrai alors :
 {
 yvoit=yvoit+1;                        //la voiture se déplace vers le bas de la fenetre
 yond=yond+1;                          //l'onde qui suit la voiture se déplace aussi vers le bas de la fenetre
 }
 if(xvoit>xobs1)                       //si xvoit dépasse xobs alors la voiture cesse de descendre vers le bas : la voiture à esquivé l'obstacle
 {
  obs1b=false;                         //le boolean devient faux 
 }
}
}
 
//void mvtobs1h  mouvement d'esquive par le haut de l'obstacle 1
void mvtobs1h() {
  if((xond >= xobs1) && (yvoit+10 <= yobs1+lobs1/2) && (yvoit+10 >= yobs1-10))
{
  obs1h=true;
  if(obs1h==true)
  {
 yvoit=yvoit-1; 
 yond=yond-1; 
}
if(xvoit>xobs1)
  {
    obs1h=false;
  }
}
}
 
//void mvtobs2b  mouvement d'esquive par le bas de l'obstacle 2
void mvtobs2b() {
if((xond >= xobs2) && (yvoit+10 >= yobs2+lobs2/2) && (yvoit+10 <= yobs2+lobs2+10))
{
  obs2b=true;
  if(obs2b==true)
  {
 yvoit=yvoit+1; 
 yond=yond+1; 
}
 if(xvoit>xobs2)
 {
   obs2b=false;
 }
}
}
 
//void mvtobs2h  mouvement d'esquive par le haut de l'obstacle 2
 
void mvtobs2h() {
  if((xond >= xobs2) && (yvoit+10 <= yobs2+lobs2/2) && (yvoit+10 >= yobs2-10))
  obs2h=true;
  if(obs2h==true)
  {
   yvoit=yvoit-1; 
   yond=yond-1; 
}
 if(xvoit>xobs2)
 {
   obs2h=false;
 }
}
}
 
//void mvtobs3b  mouvement d'esquive par le bas de l'obstacle 3
void mvtobs3b() {
if((xond >= xobs3) && (yvoit+10 >= yobs3+lobs3/2) && (yvoit+10 <= yobs3+lobs3+10))
{
 obs3b=true;
 if(obs3b==true)
 {
  yvoit=yvoit+1; 
  yond=yond+1; 
}
 if(xvoit>xobs3)
 {
   obs3b=false;
 }
}
}
 
//void mvtobs3h  mouvement d'esquive par le haut de l'obstacle 3
void mvtobs3h() {
  if((xond >= xobs3) && (yvoit+10 <= yobs3+lobs3/2) && (yvoit+10 >= yobs3-10))
{
 obs3h=true;
 if(obs3h==true)
 {
 yvoit=yvoit-1; 
 yond=yond-1; 
}
 if(xvoit>xobs3)
 {
   obs3h=false;
 }
}
}