xxxxxxxxxx
class Alien {
constructor(col, row) {
this.column = col;
this.row = row;
this.coords();
}
coords() { //Fonction pour définir les coordonnées des coins en fonction des coordonnées de l'alien sur la grille et des propriétés de la grille
this.x1 = leftOffset + this.column * columnOffset - alienWidth/2;
this.x2 = this.x1 + alienWidth;
this.y1 = topOffset + this.row * rowOffset - alienHeight/2;
this.y2 = this.y1 + alienHeight;
this.x = (this.x1 + this.x2) / 2;
this.y = (this.y1 + this.y2) / 2;
}
draw() { //Fonction appelée à chaque actualisation pour chaque alien
this.coords();
rect(this.x1, this.y1, this.x2, this.y2); //On affiche l'alien
}
}
class Projectile {
constructor(x, y, d) {
this.x = x;
this.y = y;
this.direction = d;
}
alienCollisionTest() { //Test si le projectile est en contact avec un alien, détruit le projectile si oui
for (col in aliens) { //Pour chaque colonne d'aliens
if (aliens[col].length == 0) { //Si la colonne est vide, le projectile ne peut pas toucher d'aliens
continue; //Donc on passe cette colonne
}
var alien = aliens[col][aliens[col].length-1]; //On récupère le dernier alien de la colonne (le seul qui peut êt'er touché)
if (collision(this, alien)) { //Si le projectile touche l'alien
aliens[col].splice(-1, 1); //On supprime l'alien
projectiles.splice(projectiles.indexOf(this),1); //On supprime le projectile
aliencount --; //On décrémente le nombre d'aliens
if (aliencount == 0) { //Si le nombre d'aliens restant est nul, la partie est gagnée
win();
}
return; //Puis on arrête la fonction, le projectile a été supprimé
}
}
return false; //Si on arrive à ce stade de la fonction, le projectile n'a touché aucun alien, alors on retourne falase
}
draw() { //Appelée à chaque actualisation pour chaque projectile
if (this.direction) { //Si le projectile est vers le haut (tir joueur)
this.y -= projectileSpeed; //Il se déplace vers le haut
fill(0,255,0);
ellipse(this.x, this.y, 10, 10) //Puis on l'affiche
this.alienCollisionTest(); //On teste s'il touche un alien
} else { //So le projectile est vers le bas
this.y += projectileSpeed //Il se déplace vers le bas
if ( playerCollision(this) ) { //Si il touche le joueur
player.lives--;
if (player.lives == 0) { //Quand le joueur est mort
death();
}
projectiles.splice(projectiles.indexOf(this),1); //On détruit le projectile
return true; //Puis on arrête la fonction
}
fill(255,0,0); //On arrive à ce stade de la fonction que si le projectile n'a pas touché le joueur
ellipse(this.x, this.y, 10, 10) //Donc on l'affiche
}
} //Projectile.draw()
}
var player = { //Joueur
x: 50,
y: 0,
width: 70,
height: 50,
speed: 10,
can_shoot: true,
lives: 3
}
var alienWidth = 50; //Largeur des aliens
var alienHeight = 30; //Hauteur des aliens
var projectiles = []; //Liste des projectiles actifs
var aliens = []; //Liste des aliens
var gridWidth = 8; //Largeur de la grille d'aliens
var gridHeight = 4; //Hauteur de la grille d'aliens
var projectileSpeed = 10; //Vitesse des projectiles
var defaultLeftOffset = 400; //Ecart de départ (constant) entre la grille et la gauche de l'écran
var leftOffset = 400; //Ecart actuel (et variable) entre la grille et la gauche de l'écran
var topOffset = 50; //Ecart entre la grille et le haut de l'écran
var columnOffset = 120; //Ecart des colonnes de la grille
var rowOffset = 120; //Ecart des lignes de la grille
var t = 0; //Date, en actualisations
var lastshot = 0; //Temps du dernier tir joueur (pour le délai entre les tirs)
var aliencount = gridWidth * gridHeight; //Nombre d'aliens actifs
var debugmode = false;
function setup() {
createCanvas(windowWidth, windowHeight);
rectMode(CORNERS);
frameRate(40);
noStroke();
for (var x = 0; x < gridWidth; x++) { //On crée les aliens
aliens.push([]);
for (var y = 0; y < gridHeight; y++) {
aliens[x].push(new Alien(x, y));
}
}
player.y = windowHeight - 50;
}
function draw() {
background(0);
heartDisplay(); //On affiche les coeurs
t ++; //on augmente le compteur d'actualisations
if (debugmode) {
player.lives = 3;
player.can_shoot = true;
fill(0,255,0);
text("debug mode",10,25);
}
if (t%50 == 0) { //Toutes les 50 actualisations
topOffset += 8; //On descend la grille d'aliens
}
leftOffset = defaultLeftOffset + (sin(t/100) - 0.5) * 50; //Variation cyclique de l'écart entre la grille et la gauche de l'écran
if (!player.can_shoot && t >= lastshot + 20) { //Si le joueur ne peut pas tirer et que 20 actualisations se sont écoulées depuis le dernier tir
player.can_shoot = true; //Le joueur peut tirer à nouveau
}
rectMode(CENTER);
fill(0,255,0);
rect(player.x, player.y, player.width, player.height); //On affiche le joueur
rectMode(CORNERS);
fill(255,0,0);
for (col in aliens) { //On affiche les aliens
for (row in aliens[col]) {
var alien = aliens[col][row];
if (t%70 == 0 && row == aliens[col].length-1) {
shoot(alien.x, alien.y+50, false);
}
alien.draw();
}
}
for (i in projectiles) { //On affiche les projectiles
projectiles[i].draw();
if (projectiles.length == 0) { //Si les projectiles ont été supprimé parce que le joueur a gagné
break;
}
}
if (keyIsPressed) {
if (keyCode == 37) { //Si flèche gauche appuyée
player.x -= player.speed; //Le joueur se déplace à gauche
} else if (keyCode == 39) { //Si flèche droite appuyée
player.x += player.speed; //Le joueur se déplace à droite
} else if (keyCode == 16) {
debugmode = true;
} else if (keyCode == 17) {
debugmode = false;
}
}
if (mouseIsPressed) {
shoot(player.x, player.y, true); //Le joueur tire
}
} //Draw
function shoot(x, y, up) { //Pour tirer un projectile (up = true pour un tir joueur -> projectile vers le haut et l'inverse pour un tir alien)
if (!up || player.can_shoot) { //Si le projectile est alien ou si le joueur peut tirer
projectiles.push(new Projectile(x, y, up)) //Création d'un projectile
lastshot = t; //On garde la date du dernier tir pour le délai de récupération
if (up) { //Si le tir est joueur
player.can_shoot = false; //Le joueur ne peux plus tirer
}
}
}
function collision(proj, alien) { //Retourne si il y a collision entre l'alien alien et le projectile proj
return proj.x > alien.x1
&& proj.x < alien.x2
&& proj.y > alien.y1
&& proj.y < alien.y2
}
function playerCollision(proj) { //Retourne s'il y a collision entre le joueur et le projectile proj
return proj.x > player.x - player.width/2 &&
proj.x < player.x + player.width/2 &&
proj.y > player.y - player.height/2 &&
proj.y < player.y + player.height/2;
}
function death() { //Lorsque le joueur meurt
background(0);
fill(255,0,0);
textAlign(CENTER);
textFont("Arial", 50);
textStyle(BOLD);
text("GAME OVER", windowWidth/2, windowHeight/2);
projectiles = []; //On supprime tous les projectiles
frameRate(0); //on fige l'écran
}
function win() { //Lorsque le joueur gagne
background(0);
fill(0,255,0);
textAlign(CENTER);
textFont("Arial", 50);
textStyle(BOLD);
text("YOU WON", windowWidth/2, windowHeight/2);
projectiles = []; //On supprime tous les projectiles
frameRate(0); //On fige l'écran
}
function heartDisplay() {
fill(255,0,0);
if (player.lives >= 1) {
ellipse(50,50,20,20);
}
if (player.lives >= 2) {
ellipse(100,50,20,20);
}
if (player.lives >= 3) {
ellipse(150,50,20,20);
}
fill(255);
}