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 boss() { 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; } } }