diff --git a/Boss.pde b/Boss.pde index e16971d..842901b 100644 --- a/Boss.pde +++ b/Boss.pde @@ -1,35 +1,33 @@ class Boss { + int pv, pv_baseboss; boolean invincible = false; float boss_time; boolean boss_d_ou_g = false; - int boss_vitesse; + int boss_vitesse, default_bosvit; + float boss_cooldown = 5; + boolean collision_laser = false; PImage visu_boss; int y; int x; //égale à ancien "boss_bouge" boolean show = true; int NUMEROXEPLO = 0; int deta_time; - int time_inv_boss, invisi_time = 1000; // temps de d'invincibilité en millisecondes (2 secondes) + int time_inv_boss, invisi_time = 2000; // temps de d'invincibilité en millisecondes (2 secondes) int time_cligno_boss, deta_cligno_time = 150; // temps de clignotage en millisecondes //jauge des pv du boss int H_jpv = 25, W_jpv = 650, x_jpv, y_jpv = 20; - - //var à récup - boolean collision_laser = false; - float boss_cooldown = 5; - int boss_stop = 4; - int Xa, Xb, Xc, Ya, Yb, Yc, Xd, Yd, Xe, Ye; - float time_game = millis()/1000; - float ABC, DBC, ACB, DCB, EBC, ECB; int largeur_bar_vie_T = W_jpv; int largeur_bar_vie_cible = W_jpv; + //laser + int Xa, Xb, Xc, Ya, Yb, Yc, Xd, Yd, Xe, Ye; + float ABC, DBC, ACB, DCB, EBC, ECB; + int boss_stop = 4; boolean son_Laser = false, clignote = false; - Boss (int pvboss, String visuboss, int start_x, int start_y, int vitboss){ - boss_vitesse = vitboss; + boss_vitesse = default_bosvit = vitboss; x = start_x; y = start_y; pv = pv_baseboss = pvboss; @@ -38,6 +36,47 @@ class Boss { } + void BarDeVieBoss(){ + + //largeur en pixels en fonction des pv courants du boss + largeur_bar_vie_cible = W_jpv * pv / pv_baseboss; + //println ("T : " + largeur_bar_vie_T + " C : " + largeur_bar_vie_cible); + + //calcul delai en miliseconds pour chaque pixels a supprimer de la bars de vie en fonction du temps d'invincibilité du boss + // temps / pixels a suprimmer de la barre : + //deta_time = invisi_time / (W_jpv - (W_jpv * pv / pv_baseboss)); + //println("pv : " + pv + " :: invincible : " + invincible+ " :: deta_time : " + deta_time); + + //jauge des pv du boss + x_jpv = width/2-W_jpv/2; + fill(255, 255, 255, 40); + noStroke(); + rect(x_jpv, y_jpv, W_jpv, H_jpv, H_jpv / 2); + fill(#AE0202, 230); + noStroke(); + rect( + x_jpv + (W_jpv - largeur_bar_vie_T)/2, // coordonnées X de la bar de vie + y_jpv, // coordonnées Y de la bar de vie + largeur_bar_vie_T, + H_jpv, // hauteur de la bar de vie + H_jpv / 2 // pour arrondir les angles de la bar de vie du boss + ); + fill(255); + textSize(H_jpv / 1.5); + textAlign(CENTER, CENTER); + text(pv + " / " + pv_baseboss , x_jpv + W_jpv / 2 , y_jpv + H_jpv /2); + textAlign(LEFT, BOTTOM); + textSize(12); + strokeWeight(2); + stroke(#ffffff); + + noFill(); + rect(x_jpv, y_jpv, W_jpv, H_jpv, H_jpv / 2); + fill(255, 255, 255); + strokeWeight(1); + stroke(#000000); + } + void verifiercollisions(){ //vérifie s'il y a une collisions avec le vaisseau @@ -58,29 +97,93 @@ class Boss { invincible = true; } else { show = false; - } - //calcul delai en miliseconds pour chaque pixels a supprimer de la bars de vie en fonction du temps d'invincibilité du boss - // temps / pixels a suprimmer de la barre : - deta_time = invisi_time / (W_jpv - (W_jpv * pv / pv_baseboss)); - println("pv : " + pv + " :: invincible : " + invincible+ " :: deta_time : " + deta_time); - + } //Suppression du missile lancermisile = false; //a voir pour faire une classe pour le missile du ship } + + //vérification de la collision avec le laser du boss + if(boss_vitesse == 0){ + //coordonnées base du vaisseau: + Xd = ship.x - 100; + Yd = ship.y + 100; + + Xe = ship.x + 100; + Ye = Yd; + + //calcul des angles + ABC = acos( ( ((Xc-Xb)*(Xa-Xb)) + ((Yc-Yb)*(Ya-Yb)) )/( sqrt(sq(Xc-Xb)+sq(Yc-Yb)) * sqrt(sq(Xa-Xb)+sq(Ya-Yb)) ) ); + ACB = ABC; + //println("ABC : "+ ABC); + //DBC = acos( ( ((Xc-Xb)*(Xd-Xb)) + ((Yc-Yb)*(Yd-Yb)) )/( sqrt(sq(Xc-Xb)+sq(Yc-Yb)) * sqrt(sq(Xd-Xb)+sq(Yd-Yb)) ) ); + DCB = acos( ( ((Xb-Xc)*(Xd-Xc)) + ((Yb-Yc)*(Yd-Yc)) )/( sqrt(sq(Xb-Xc)+sq(Yb-Yc)) * sqrt(sq(Xd-Xc)+sq(Yd-Yc)) ) ); + EBC = acos( ( ((Xc-Xb)*(Xe-Xb)) + ((Yc-Yb)*(Ye-Yb)) )/( sqrt(sq(Xc-Xb)+sq(Yc-Yb)) * sqrt(sq(Xe-Xb)+sq(Ye-Yb)) ) ); + //println("DCB : "+ DCB + " / EBC : "+ EBC); + + stroke(204, 102, 0); + strokeWeight(4); + line(Xd, Yd, Xe, Ye); + //println("Ye, Xe : " + Ye + " <> " + Xe); + //println("Xd, Yd : " + Xd + " <> " + Yd); + + //test collisions avec le laser: + if (EBC > ABC || ACB < DCB) { + collision_laser = false; + //println("collision laser: " + collision_laser); + } else { + collision_laser = true; + ship.collision = true; + //println("collision laser: " + collision_laser); + } + } } void bouge_boss(){ + //gestion du laser + if (boss_time + boss_cooldown < millis()/1000 && !invincible && pv > 0) { + boss_vitesse = 0; + image(laserboss1, x, 380 + y); + //joue le son du laser une seul fois + if(!son_Laser){ + son_Laser = true; + sonLaser_boss.play(); + } + //calcul dimension laser: + //coordonnées point haut + Xa = x; + Ya = -100 + y; + + Xb = x - 566; + Yb = -100 + y + 981; + + Xc = x + 566; + Yc = Yb; + + //triangle(Xa, Ya, Xb, Yb, Xc, Yc); + + // boucle fin d'attaque + if (boss_time + boss_cooldown + boss_stop < millis()/1000){ + boss_cooldown = random(1, 7); + boss_vitesse = default_bosvit++; + //default_bosvit += 1; + boss_time = millis()/1000; + son_Laser = false; + } + + //println("boss_time + boss_cooldown + boss_stop : "+ boss_time + boss_cooldown + boss_stop); + } + if (boss_d_ou_g == true){ //si le boss vas vers la gauche - if (x > 0){ //si le boss il n'est pas tout a gauche + if (x > 100){ //si le boss il n'est pas tout a gauche x -= boss_vitesse; //on le fais aller a gauche } else { //sinon boss_d_ou_g = false; //on lui dit d'aller a gauche } } - if (boss_d_ou_g == false && x < width){ + if (boss_d_ou_g == false && x < width-100){ x += boss_vitesse; } else { boss_d_ou_g = true; @@ -100,9 +203,9 @@ class Boss { clignote = invincible = false; } - //if (largeur_bar_vie_T > largeur_bar_vie_cible){ - // largeur_bar_vie_T -- ; - //} + if (largeur_bar_vie_T > largeur_bar_vie_cible){ + largeur_bar_vie_T -- ; + } // clignotement : if (invincible && time_cligno_boss + deta_cligno_time <= millis()) { @@ -129,6 +232,7 @@ class Boss { } void affiche_et_mets_a_jour_le_boss(){ + BarDeVieBoss(); verifiercollisions(); bouge_boss(); apparaitre(); diff --git a/Bosss.pde b/Bosss.pde deleted file mode 100644 index 1180a2c..0000000 --- a/Bosss.pde +++ /dev/null @@ -1,180 +0,0 @@ -boolean boss_d_ou_g = false; -int boss_bouge = 800; -int boss_y = 171; -int boss_vitesse = 8; -boolean collision_laser = false; -float boss_cooldown = 5; -float boss_time; -int boss_stop = 4; -int pv_baseboss = 5; -int boss_pv = pv_baseboss; -int Xa, Xb, Xc, Ya, Yb, Yc, Xd, Yd, Xe, Ye; -float time_game = millis()/1000; -float ABC, DBC, ACB, DCB, EBC, ECB; -int H_jpv = 25, W_jpv = 650, x_jpv, y_jpv = 20; -int largeur_bar_vie_T = W_jpv; -int largeur_bar_vie_cible = W_jpv; -boolean invincible = false, son_Laser = false, clignote = false; -int invisi_time = 1000; // temps de d'invincibilité en millisecondes (2 secondes) -int deta_time, time_inv_boss; -int deta_cligno_time = 150; // temps de clignotage en millisecondes -int time_cligno_boss; - - - - -void bosss() { - - time_game = millis()/1000; - println("second : "+ time_game); - println("boss_time + boss_cooldown : " + boss_time + boss_cooldown); - if (boss_time + boss_cooldown < time_game && !invincible){ - boss_vitesse = 0; - image(laserboss1, boss_bouge, 380 + boss_y); - //joue le son du laser une seul fois - if(!son_Laser){ - son_Laser = true; - sonLaser_boss.play(); - } - //calcul dimension laser: - //coordonnées point haut - Xa = boss_bouge; - Ya = -100 + boss_y; - - Xb = boss_bouge - 566; - Yb = -100 + boss_y + 981; - - Xc = boss_bouge + 566; - Yc = Yb; - - //triangle(Xa, Ya, Xb, Yb, Xc, Yc); - - //coordonnées base du vaisseau: - Xd = x - 100; - Yd = y + 100; - - Xe = x + 100; - Ye = Yd; - - //calcul des angles - ABC = acos( ( ((Xc-Xb)*(Xa-Xb)) + ((Yc-Yb)*(Ya-Yb)) )/( sqrt(sq(Xc-Xb)+sq(Yc-Yb)) * sqrt(sq(Xa-Xb)+sq(Ya-Yb)) ) ); - ACB = ABC; - //println("ABC : "+ ABC); - //DBC = acos( ( ((Xc-Xb)*(Xd-Xb)) + ((Yc-Yb)*(Yd-Yb)) )/( sqrt(sq(Xc-Xb)+sq(Yc-Yb)) * sqrt(sq(Xd-Xb)+sq(Yd-Yb)) ) ); - DCB = acos( ( ((Xb-Xc)*(Xd-Xc)) + ((Yb-Yc)*(Yd-Yc)) )/( sqrt(sq(Xb-Xc)+sq(Yb-Yc)) * sqrt(sq(Xd-Xc)+sq(Yd-Yc)) ) ); - EBC = acos( ( ((Xc-Xb)*(Xe-Xb)) + ((Yc-Yb)*(Ye-Yb)) )/( sqrt(sq(Xc-Xb)+sq(Yc-Yb)) * sqrt(sq(Xe-Xb)+sq(Ye-Yb)) ) ); - //println("DCB : "+ DCB + " / EBC : "+ EBC); - - //line(Xd, Yd, Xe, Ye); - //println("Xb, Xe : " + Xb + " <> " + Xe); - //test collisions avec le laser: - if (EBC > ABC || ACB < DCB) { - collision_laser = false; - } else { - collision_laser = true; - ship.collision = true; - println("collision : " + collision_laser); - } - - - // boucle fin d'attaque - if (boss_time + boss_cooldown + boss_stop < time_game){ - boss_cooldown = random(1, 7); - boss_vitesse = 8; - boss_time = time_game; - son_Laser = false; - } - - //println("boss_time + boss_cooldown + boss_stop : "+ boss_time + boss_cooldown + boss_stop); - } - - if(!clignote){ - image(imgboss1, boss_bouge, boss_y); - } - - if (boss_d_ou_g == true){ //si le boss vas vers la gauche - if (boss_bouge > 0){ //si le boss il n'est pas tout a gauche - boss_bouge -= boss_vitesse; //on le fais aller a gauche - } else { //sinon - boss_d_ou_g = false; //on lui dit d'aller a gauche - } - } - - if (boss_d_ou_g == false && boss_bouge < width){ - boss_bouge += boss_vitesse; - } else { - boss_d_ou_g = true; - } - - - - - //largeur en pixels en fonction des pv courants du boss - largeur_bar_vie_cible = W_jpv * boss_pv / pv_baseboss; - println ("T : " + largeur_bar_vie_T + " C : " + largeur_bar_vie_cible); - - if (time_inv_boss + deta_time <= millis()){ - if (largeur_bar_vie_T > largeur_bar_vie_cible){ - largeur_bar_vie_T -- ; - invincible = true; - } else { - invincible = false; - } - time_inv_boss = millis(); - } - - // clignotement : - if (invincible && time_cligno_boss + deta_cligno_time <= millis()) { - time_cligno_boss = millis(); - clignote = !clignote; - } else if (!invincible) { - clignote = false; - } - - //jauge des pv du boss - x_jpv = width/2-W_jpv/2; - fill(255, 255, 255, 40); - noStroke(); - rect(x_jpv, y_jpv, W_jpv, H_jpv, H_jpv / 2); - fill(#AE0202, 230); - noStroke(); - rect( - x_jpv + (W_jpv - largeur_bar_vie_T)/2, // coordonnées X de la bar de vie - y_jpv, // coordonnées Y de la bar de vie - largeur_bar_vie_T, - H_jpv, // hauteur de la bar de vie - H_jpv / 2 // pour arrondir les angles de la bar de vie du boss - ); - fill(255); - textSize(H_jpv / 1.5); - textAlign(CENTER, CENTER); - text(boss_pv + " / " + pv_baseboss , x_jpv + W_jpv / 2 , y_jpv + H_jpv /2); - textAlign(LEFT, BOTTOM); - textSize(12); - strokeWeight(2); - stroke(#ffffff); - noFill(); - rect(x_jpv, y_jpv, W_jpv, H_jpv, H_jpv / 2); - fill(255, 255, 255); - strokeWeight(1); - stroke(#000000); - - if ( dist(ship.x, ship.y, boss_bouge, boss_y) < 200 ) { - // en gros le vaisseau éclate quand il touche le boss - ship.collision = true; - } else { - //si le missile est en contact avec le boss et qu'il n'est pas invincible le boss perd un point de vie - if ( dist(xm, ym, boss_bouge, boss_y) < 114 && !invincible ){ - boss_pv = boss_pv - 1; - sonCollision.play(); - time_inv_boss = time_cligno_boss = millis(); - //calcul delai en miliseconds pour chaque pixels a supprimer de la bars de vie en fonction du temps d'invincibilité du boss - // temps / pixels a suprimmer de la barre : - deta_time = invisi_time / (W_jpv - (W_jpv * boss_pv / pv_baseboss)); - //println("boss_pv : " + boss_pv + " :: deta_time : " + deta_time); - lancermisile = false; - clignote = false; - } - } - - } diff --git a/space_inviders.pde b/space_inviders.pde index cb329db..c1fcb76 100644 --- a/space_inviders.pde +++ b/space_inviders.pde @@ -176,16 +176,6 @@ void setup() { ship.affiche_et_mets_a_jour_le_ship(x, y); - //Affiche le boss Du niveau 1 (ancienne méthode sans la classe boss) - if ( false && nombreEnemiReste == 0 && boss_pv > 0) { - // image(imgWin, largeur/2, hauteur/2); - if (boss_start == false) { - boss_start = true; - boss_time = millis()/1000; - } - //bosss(); - } - //Affiche le boss Classe 1 text("énemis restant: " + nombreEnemiReste, 120, 20); if ( nombreEnemiReste <= 0) { @@ -303,7 +293,7 @@ void setup() { if (key == 'f' ) { touchePresse = "f"; } if (key == 'z' && touchePresse == "f") { - //boss.pv = 1; + boss.pv = 2; //on tue tous les ennemis for (int i = 0; i