space_inviders/Boss.pde

243 lines
7.3 KiB
Plaintext

class Boss {
int pv, pv_baseboss;
boolean invincible = false;
float boss_time;
boolean boss_d_ou_g = false;
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 = 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;
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 = default_bosvit = vitboss;
x = start_x;
y = start_y;
pv = pv_baseboss = pvboss;
boss_time = millis()/1000;
visu_boss = loadImage("data/images/" + visuboss);
}
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
if ( dist(ship.x, ship.y, x, y) < 200 && show) {
ship.collision = true;
}
//println("pv : " + pv);
//vérifie les collisions du missile du notre vaisseau sur le boss
if ( dist(xm, ym, x, y) < 114 && !invincible && show){
//invincible = true;
clignote = false;
pv = pv - 1;
sonCollision.play();
if (pv > 0) {
time_inv_boss = millis() + invisi_time;
invincible = true;
} else {
show = false;
}
//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 > 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-100){
x += boss_vitesse;
} else {
boss_d_ou_g = true;
}
}
void apparaitre(){
//println("invincible : " + invincible + " :: time_inv_boss : " + time_inv_boss + " :: millis() : " + millis() );
// invincibileté :
if (invincible && time_inv_boss > millis()) {
//time_inv_boss = millis();
invincible = true;
} else {
clignote = invincible = false;
}
if (largeur_bar_vie_T > largeur_bar_vie_cible){
largeur_bar_vie_T -- ;
}
// clignotement :
if (invincible && time_cligno_boss + deta_cligno_time <= millis()) {
time_cligno_boss = millis();
clignote = !clignote;
}
//affiche l'anime de explosion :
if ( !show && NUMEROXEPLO<50 ) {
// Ou Methode avec un if :
if ( String.valueOf(NUMEROXEPLO).length()==1 ) visu_boss = loadImage("data/images/explosion/explosion000"+NUMEROXEPLO+".png");
else visu_boss = loadImage("data/images/explosion/explosion00"+NUMEROXEPLO+".png");
NUMEROXEPLO += 1;
}
if (NUMEROXEPLO == 1 && son) sonExposion.play();
//Affiche le ship ou explosion s'il n'est pas détruis (l'anime de explosion est pas finie)
if (NUMEROXEPLO < 50 && !clignote) image(visu_boss, x, y);
//println("boss ..");
}
void affiche_et_mets_a_jour_le_boss(){
BarDeVieBoss();
verifiercollisions();
bouge_boss();
apparaitre();
}
}