first commit
This commit is contained in:
BIN
10ptsBis.jpg
Normal file
BIN
10ptsBis.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 18 KiB |
BIN
20ptsBis.jpg
Normal file
BIN
20ptsBis.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 19 KiB |
BIN
30ptsBis.jpg
Normal file
BIN
30ptsBis.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 17 KiB |
934
Projet.html
Normal file
934
Projet.html
Normal file
@@ -0,0 +1,934 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>Space Invaders sauce CMI</title>
|
||||||
|
<script>
|
||||||
|
|
||||||
|
|
||||||
|
// 2D context : objet dans lequel on va réaliser les dessins (en 2D)
|
||||||
|
// --> voir http://www.w3schools.com/jsref/dom_obj_canvas.asp
|
||||||
|
// pour connaître les fonctions offertes par cet objet
|
||||||
|
|
||||||
|
//canvas
|
||||||
|
let context = null;
|
||||||
|
|
||||||
|
//variables rectangle et munition
|
||||||
|
let colorR = "green";
|
||||||
|
let rectangle = { x: 0, y: 0, hauteur: 0, largeur: 0, couleur: colorR, vies : 3, score : 0 };
|
||||||
|
let munition = { x : 0, y: 0, hauteur: 10, largeur: 3, couleur: "white", exist : false};
|
||||||
|
|
||||||
|
// Variables/constantes qui repères l'état du jeu
|
||||||
|
let MENU=0;
|
||||||
|
let INGAME=1;
|
||||||
|
let GAME_OVER=2;
|
||||||
|
let PAUSE = 3;
|
||||||
|
let GAME_STATE=MENU;
|
||||||
|
|
||||||
|
|
||||||
|
// clic sur la zone de jeu (coordonnées relatives au canvas)
|
||||||
|
let clic = { x: 0, y: 0 };
|
||||||
|
|
||||||
|
// vecteur mouvement et vitesse
|
||||||
|
let vecMove=0;
|
||||||
|
let speed = 0.4;
|
||||||
|
|
||||||
|
// variable de type alien
|
||||||
|
let colorA = "White";
|
||||||
|
|
||||||
|
// variable de la vitesse des aliens
|
||||||
|
let speedAlien=1.5;
|
||||||
|
|
||||||
|
// variable compteur
|
||||||
|
let compteur=0;
|
||||||
|
|
||||||
|
// variables utiles pour calculer le delta T
|
||||||
|
let dt=0;
|
||||||
|
let lastD=0;
|
||||||
|
|
||||||
|
//variable qui insique si les aliens se déplacent de gauche à droite
|
||||||
|
let direction = "D";
|
||||||
|
|
||||||
|
// variable qui enregistre le x et le y de l'alien ou de la défense qui a été touché par le tir du vaisseau(joueur)
|
||||||
|
let coord;
|
||||||
|
|
||||||
|
// variable qui enregistre si une touche est appuyée et/ou relachée
|
||||||
|
let touches = {gauche : false, droite : false, espace : false};
|
||||||
|
|
||||||
|
// constante max comp
|
||||||
|
let MAX_COMPTEUR=140;
|
||||||
|
|
||||||
|
// variable qui aligne le texte du menu
|
||||||
|
let COORD_TEXT=120;
|
||||||
|
|
||||||
|
//variable pour le changement après le game_over
|
||||||
|
let comptOver =0;
|
||||||
|
|
||||||
|
//liste servant pour les tirs aliens
|
||||||
|
let munitionAlien=[];
|
||||||
|
let attaque;
|
||||||
|
|
||||||
|
let animationFrame=1;
|
||||||
|
|
||||||
|
// initialisation (appelée au chargement du corps du document <body onload="init">)
|
||||||
|
function init() {
|
||||||
|
// instanciation de la variable globale contenant le contexte
|
||||||
|
context = document.getElementById("cvs").getContext("2d");
|
||||||
|
context.width = document.getElementById("cvs").width;
|
||||||
|
context.height = document.getElementById("cvs").height;
|
||||||
|
|
||||||
|
// on associe au document des écouteurs d'événements
|
||||||
|
// --> voir http://www.w3schools.com/js/js_events.asp
|
||||||
|
|
||||||
|
// 2 écouteurs pour le clavier (appui/relâchement d'une touche)
|
||||||
|
document.addEventListener("keydown", captureAppuiToucheClavier)
|
||||||
|
document.addEventListener("keyup", captureRelacheToucheClavier)
|
||||||
|
// on associe au document un écouteur d'événements souris
|
||||||
|
document.addEventListener("click", captureClicSouris)
|
||||||
|
// --> ces événements vont appeler les fonctions captureXYZ définies après.
|
||||||
|
|
||||||
|
//intialisation du rectangle
|
||||||
|
rectangle.hauteur=25;
|
||||||
|
rectangle.largeur= 50;
|
||||||
|
rectangle.x=(context.width-rectangle.largeur)/2;
|
||||||
|
rectangle.y=context.height-rectangle.hauteur*2;
|
||||||
|
|
||||||
|
//initialisation des tableaux
|
||||||
|
Ennemi = [];
|
||||||
|
Defense = [];
|
||||||
|
|
||||||
|
|
||||||
|
// lancement de la boucle de jeu
|
||||||
|
boucleDeJeu();
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function boucleDeJeu() {
|
||||||
|
if(GAME_STATE==INGAME){
|
||||||
|
// mise à jour de l'état du jeu
|
||||||
|
update(Date.now());
|
||||||
|
// affichage de l'état du jeu
|
||||||
|
render();
|
||||||
|
|
||||||
|
}else if(GAME_STATE==GAME_OVER){
|
||||||
|
OverDraw();
|
||||||
|
if(comptOver == 0){
|
||||||
|
setTimeout(passerAuMenu,3000);
|
||||||
|
comptOver = 1;
|
||||||
|
}
|
||||||
|
rectangle.score=0;
|
||||||
|
//passerAuMenu();
|
||||||
|
} else if(GAME_STATE==MENU){
|
||||||
|
effacerCanvas();
|
||||||
|
afficherMenu();
|
||||||
|
resetAlien();
|
||||||
|
resetDefense();
|
||||||
|
comptOver = 0;
|
||||||
|
rectangle.vies=3;
|
||||||
|
} else if(GAME_STATE==PAUSE){
|
||||||
|
render();
|
||||||
|
|
||||||
|
}
|
||||||
|
// rappel de la boucle de jeu
|
||||||
|
// requestAnimationFrame est une fonction JS servant à pré-calculer le prochain affichage
|
||||||
|
// http://www.html5canvastutorials.com/advanced/html5-canvas-animation-stage/
|
||||||
|
requestAnimationFrame(boucleDeJeu);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mise à jour de l'état du jeu
|
||||||
|
* @param d date courante
|
||||||
|
*/
|
||||||
|
function update(d) {
|
||||||
|
|
||||||
|
// conditions pour le game over à faire ---------------------------------------------------------------------------------------------------------
|
||||||
|
if(maxY(Ennemi)>rectangle.y-rectangle.hauteur*6 || rectangle.vies<1){
|
||||||
|
GAME_STATE=GAME_OVER;
|
||||||
|
}
|
||||||
|
|
||||||
|
// mise à jour du delta T
|
||||||
|
dt=d-lastD;
|
||||||
|
lastD=d;
|
||||||
|
|
||||||
|
// permet d'éviter le lag de déplacement si on appuie sur les deux touches de direction en même temps
|
||||||
|
antiLagg();
|
||||||
|
|
||||||
|
// condition pour que le joueur ne sorte pas de l fenetre de jeu
|
||||||
|
antiNoClip();
|
||||||
|
|
||||||
|
// gestion de la munition
|
||||||
|
gestionMunition();
|
||||||
|
|
||||||
|
//collision munition & alien
|
||||||
|
collisionMunitionAlien();
|
||||||
|
|
||||||
|
//collision munition et defense
|
||||||
|
collisionMunitionDefense();
|
||||||
|
|
||||||
|
// boucle de déplacement des aliens
|
||||||
|
deplacementAliens();
|
||||||
|
|
||||||
|
// tir de la munition si elle n'existe pas déjà
|
||||||
|
tirJoueur();
|
||||||
|
|
||||||
|
//tout ce qui concerne le tir des aliens
|
||||||
|
gestionMunitionAliens();
|
||||||
|
randomTirIndiceAlien();
|
||||||
|
collisionTirAlienJoueur();
|
||||||
|
|
||||||
|
gestionAlienRouge();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction réalisant le rendu de l'état du jeu
|
||||||
|
*/
|
||||||
|
function render() {
|
||||||
|
// effacement de l'écran
|
||||||
|
effacerCanvas();
|
||||||
|
|
||||||
|
//affichage joueur
|
||||||
|
affichageJoueur();
|
||||||
|
|
||||||
|
// affichage munition
|
||||||
|
affichageMunition();
|
||||||
|
|
||||||
|
// affichage aliens
|
||||||
|
affichageAliens();
|
||||||
|
|
||||||
|
//affichage défense
|
||||||
|
affichageDefense();
|
||||||
|
|
||||||
|
// affichage des tirs des aliens
|
||||||
|
affichageTirAlien();
|
||||||
|
|
||||||
|
//affichage du score
|
||||||
|
afficherScore();
|
||||||
|
//affichage de la vie
|
||||||
|
afficherVies();
|
||||||
|
if(alienRouge.exist){
|
||||||
|
afficherAlienRouge('randompts.jpg',alienRouge.x, alienRouge.y, alienRouge.width, alienRouge.height);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ----------------------------------------------fonctions d'affichage------------------------------------------------------------------
|
||||||
|
// fonction qui permet de passer au menu
|
||||||
|
function passerAuMenu(){
|
||||||
|
GAME_STATE=MENU;
|
||||||
|
}
|
||||||
|
// fonction qui affiche game over
|
||||||
|
function OverDraw(){
|
||||||
|
context.font = '50px Paskowy';
|
||||||
|
context.fillStyle = 'BLUE';
|
||||||
|
context.textAlign="center";
|
||||||
|
context.fillText("Game Over", context.width/2, context.height/2);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//fonction qui affiche le menu
|
||||||
|
function afficherMenu(){
|
||||||
|
context.fillStyle='white';
|
||||||
|
context.font = '60px Arial';
|
||||||
|
context.textAlign="center";
|
||||||
|
context.fillText("SPACE INVADERS", context.width/2, COORD_TEXT );
|
||||||
|
context.font = '46px Arial';
|
||||||
|
context.fillText("= 10 pts", context.width/2, COORD_TEXT*2.1 );
|
||||||
|
context.fillText("= 20 pts", context.width/2, COORD_TEXT*2.7 );
|
||||||
|
context.fillText("= 30 pts", context.width/2, COORD_TEXT*3.3 );
|
||||||
|
context.fillText(" = ??? pts", context.width/2, COORD_TEXT*3.9 );
|
||||||
|
afficherAlienBlanc('10pts.png',330 ,COORD_TEXT*1.8 , 50, 50);
|
||||||
|
afficherAlienBlanc('20pts.jpg',330 ,COORD_TEXT*2.4 , 50, 50);
|
||||||
|
afficherAlienBlanc('30pts.jpg',330 ,COORD_TEXT*3 , 50, 50);
|
||||||
|
afficherAlienRouge('randompts.jpg',320,COORD_TEXT*3.6, 70,40 );
|
||||||
|
}
|
||||||
|
|
||||||
|
//fonction qui affiche le score
|
||||||
|
function afficherScore(){
|
||||||
|
context.fillStyle ='white';
|
||||||
|
context.font = '30px Arial';
|
||||||
|
context.fillText("score : " + rectangle.score, 90, 25)
|
||||||
|
}
|
||||||
|
|
||||||
|
//fonction qui affiche les points de vie
|
||||||
|
function afficherVies(){
|
||||||
|
context.fillStyle='white';
|
||||||
|
context.font='30px Arial';
|
||||||
|
context.fillText("LIVES : ", 600, 25);
|
||||||
|
let x = 660;
|
||||||
|
let y = rectangle.hauteur-15;
|
||||||
|
for (let i = 0; i<rectangle.vies;i++){
|
||||||
|
context.fillStyle =colorR;
|
||||||
|
context.fillRect(x+i*70, y, rectangle.largeur, rectangle.hauteur);
|
||||||
|
let tailleCanon = {largeur : 6, hauteur : 5};
|
||||||
|
context.fillRect(x+(rectangle.largeur-tailleCanon.largeur)/2+i*70 , y-tailleCanon.hauteur, tailleCanon.largeur, tailleCanon.hauteur);
|
||||||
|
//penser à faire reculer le x si le perso perd une vie
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//fonctiin qui permet d'effacer le canvas
|
||||||
|
function effacerCanvas(){
|
||||||
|
context.clearRect(0, 0, context.width, context.height);
|
||||||
|
context.fillStyle='black';
|
||||||
|
context.fillRect(0,0,context.width,context.height);
|
||||||
|
}
|
||||||
|
|
||||||
|
//fonction qui empeche le lague déplacement si on appuie sur 2 touches en meme temps
|
||||||
|
function antiLagg(){
|
||||||
|
if(touches.droite && !touches.gauche){
|
||||||
|
vecMove=1;
|
||||||
|
} else if (touches.gauche && !touches.droite){
|
||||||
|
vecMove=-1;
|
||||||
|
} else if(!touches.gauche && !touches.droite){
|
||||||
|
vecMove=0;
|
||||||
|
}
|
||||||
|
rectangle.x+=speed*vecMove*dt;
|
||||||
|
}
|
||||||
|
|
||||||
|
// function qui affiche la munition
|
||||||
|
function affichageMunition(){
|
||||||
|
if(munition.exist==true){
|
||||||
|
context.fillStyle=munition.couleur;
|
||||||
|
context.fillRect(munition.x, munition.y, munition.largeur, munition.hauteur);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//fonction qui affiche les alien
|
||||||
|
function affichageAliens(){
|
||||||
|
if (Ennemi.length == 0 ){
|
||||||
|
resetAlien();
|
||||||
|
}
|
||||||
|
if(maxX(Ennemi)<context.width-65 && minX(Ennemi)>20){
|
||||||
|
for (i in Ennemi){
|
||||||
|
if(animationFrame==1){
|
||||||
|
if(Ennemi[i].score==10){
|
||||||
|
afficherAlienBlanc('10pts.png',Ennemi[i].x,Ennemi[i].y,Ennemi[i].width,Ennemi[i].height);
|
||||||
|
}else if(Ennemi[i].score==20){
|
||||||
|
afficherAlienBlanc('20pts.jpg',Ennemi[i].x,Ennemi[i].y,Ennemi[i].width,Ennemi[i].height);
|
||||||
|
}else if(Ennemi[i].score==30){
|
||||||
|
afficherAlienBlanc('30pts.jpg',Ennemi[i].x,Ennemi[i].y,Ennemi[i].width,Ennemi[i].height);
|
||||||
|
}
|
||||||
|
}else {
|
||||||
|
if(Ennemi[i].score==10){
|
||||||
|
afficherAlienBlanc('10ptsBis.jpg',Ennemi[i].x,Ennemi[i].y,Ennemi[i].width,Ennemi[i].height);
|
||||||
|
}else if(Ennemi[i].score==20){
|
||||||
|
afficherAlienBlanc('20ptsBis.jpg',Ennemi[i].x,Ennemi[i].y,Ennemi[i].width,Ennemi[i].height);
|
||||||
|
}else if(Ennemi[i].score==30){
|
||||||
|
afficherAlienBlanc('30ptsBis.jpg',Ennemi[i].x,Ennemi[i].y,Ennemi[i].width,Ennemi[i].height);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//fonction qui affiche un alien en fonction des parametres
|
||||||
|
function afficherAlienBlanc(source,x,y,width,height){
|
||||||
|
//création de l'élément image
|
||||||
|
let img = new Image();
|
||||||
|
img.addEventListener('load', function() {
|
||||||
|
|
||||||
|
}, false);
|
||||||
|
img.src = source; //
|
||||||
|
context.drawImage(img, x, y, width, height);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//fonction qui affiche les défenses
|
||||||
|
function affichageDefense(){
|
||||||
|
if ( Defense.length == 0){
|
||||||
|
Defense = tabDefense();
|
||||||
|
}
|
||||||
|
for (i in Defense){
|
||||||
|
context.fillStyle = Defense[i].color;
|
||||||
|
context.fillRect(Defense[i].x,Defense[i].y,Defense[i].width,Defense[i].height);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// fonction qui affiche l'avatar du joueur
|
||||||
|
function affichageJoueur(){
|
||||||
|
context.fillStyle =colorR;
|
||||||
|
context.fillRect(rectangle.x, rectangle.y, rectangle.largeur, rectangle.hauteur);
|
||||||
|
let tailleCanon = {largeur : 6, hauteur : 5};
|
||||||
|
context.fillRect(rectangle.x+(rectangle.largeur-tailleCanon.largeur)/2 , rectangle.y-tailleCanon.hauteur, tailleCanon.largeur, tailleCanon.hauteur);
|
||||||
|
}
|
||||||
|
|
||||||
|
//fonction qui affiche le tir des aliens
|
||||||
|
function affichageTirAlien(){
|
||||||
|
for ( i = 0; i<munitionAlien.length; i++){
|
||||||
|
if (munitionAlien[i].exist){
|
||||||
|
context.fillStyle = 'yellow';
|
||||||
|
context.fillRect(munitionAlien[i].x, munitionAlien[i].y, munitionAlien[i].largeur, munitionAlien[i].hauteur);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//fonction qui affiche un alien en fonction des parametres
|
||||||
|
function afficherAlienRouge(source,x,y,width,height){
|
||||||
|
//création de l'élément image
|
||||||
|
let redimg = new Image();
|
||||||
|
redimg.addEventListener('load', function() {
|
||||||
|
|
||||||
|
}, false);
|
||||||
|
redimg.src = source; //
|
||||||
|
context.drawImage(redimg, x, y, width, height);
|
||||||
|
|
||||||
|
}
|
||||||
|
// ---------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------Alien Rouge---------------------------------------------------------
|
||||||
|
let alienRouge={x:0, y:0, width:60, height:30, exist:false};
|
||||||
|
|
||||||
|
//fonction qui fait spawn l'alien rouge de façon aléatoire
|
||||||
|
function randomRandSpawnAlienRouge(){
|
||||||
|
if (1+Math.random()*(1000-1)+1>999){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//gestion de l'alien rouge, collision/deplacement/spawn
|
||||||
|
function gestionAlienRouge(){
|
||||||
|
if(alienRouge.exist){
|
||||||
|
collisionAlienRouge();
|
||||||
|
alienRouge.x-=1.5;
|
||||||
|
|
||||||
|
if(alienRouge.x<-alienRouge.width){
|
||||||
|
alienRouge.exist=false;
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
if(randomRandSpawnAlienRouge()){
|
||||||
|
alienRouge.y=90;
|
||||||
|
alienRouge.x=context.width;
|
||||||
|
alienRouge.exist=true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//détection de la collision
|
||||||
|
function collisionAlienRouge(){
|
||||||
|
if(munition.exist&&alienRouge.exist){
|
||||||
|
if( alienRouge.x<munition.x && alienRouge.x+width>munition.x && alienRouge.y<munition.y && alienRouge.y+height>munition.y){
|
||||||
|
|
||||||
|
munition.exist=false;
|
||||||
|
alienRouge.exist=false;
|
||||||
|
|
||||||
|
let temp=1+Math.random()*(6-1)+1;
|
||||||
|
temp=Math.floor(temp);
|
||||||
|
rectangle.score+=50*temp;
|
||||||
|
}//endIf
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// --------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ------------------------------------------------------création et reset des matrices d'alien et de defneses----------------------------
|
||||||
|
// fonction qui créé la matrice d'aliens aliens
|
||||||
|
function tabAlien(){
|
||||||
|
munitionAlien=[];
|
||||||
|
x=25;
|
||||||
|
y=145;
|
||||||
|
width=40;
|
||||||
|
height=40;
|
||||||
|
tab = [];
|
||||||
|
for(i = 0; i<5; i++){
|
||||||
|
for(j=0; j<11;j++){
|
||||||
|
if ( i == 0){
|
||||||
|
tab.push({x: x, y:y, width : width, height : height, score : 30, num : j});
|
||||||
|
munitionAlien.push( {exist: false, x : 0, y : 0, largeur : 3, hauteur : 9});
|
||||||
|
|
||||||
|
}else{
|
||||||
|
if ( i == 1 || i == 2){
|
||||||
|
tab.push({x: x, y:y, width : width, height : height, score : 20});
|
||||||
|
}else{
|
||||||
|
tab.push({x: x, y:y, width : width, height : height, score : 10});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
x+=(width+12);
|
||||||
|
}
|
||||||
|
y+=(height+12);
|
||||||
|
x=25;
|
||||||
|
}
|
||||||
|
return tab;
|
||||||
|
}
|
||||||
|
|
||||||
|
//fonction qui crée les matrices des défenses
|
||||||
|
function tabDefense(){
|
||||||
|
x = 125;
|
||||||
|
y = 630;
|
||||||
|
width = 25;
|
||||||
|
height = 20;
|
||||||
|
tab = [];
|
||||||
|
for ( i = 0; i<4; i++){
|
||||||
|
for (j=0; j<4; j++){
|
||||||
|
if ( j == 0 || j == 3){
|
||||||
|
for (k=0;k<3;k++){
|
||||||
|
tab.push({ x : x, y :y, height : height, width : width, color : "Green", vies : 4})
|
||||||
|
y +=height;
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
for (k=0;k<2;k++){
|
||||||
|
tab.push({ x : x, y :y, height : height, width : width, color : "Green", vies : 4})
|
||||||
|
y +=height;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
y=630;
|
||||||
|
x+=width;
|
||||||
|
}
|
||||||
|
x = x+4*width;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
return tab;
|
||||||
|
}
|
||||||
|
|
||||||
|
// reset le déplacement des aliens
|
||||||
|
function resetAlien(){
|
||||||
|
speedAlien=1.5;
|
||||||
|
direction="D";
|
||||||
|
Ennemi = tabAlien();
|
||||||
|
rectangle.vies+=1;
|
||||||
|
alienRouge.exist = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//reset des défenses
|
||||||
|
function resetDefense(){
|
||||||
|
Defense = []
|
||||||
|
}
|
||||||
|
// --------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ----------------------------------------------fonctions qui gère tout ce qui est en rapport avec le joueur-----------------------------------
|
||||||
|
// fonction qui empeche le joueur de sortir du canvas
|
||||||
|
function antiNoClip(){
|
||||||
|
if (rectangle.x<=0){
|
||||||
|
rectangle.x=0;
|
||||||
|
|
||||||
|
}
|
||||||
|
if (rectangle.x>=context.width-rectangle.largeur){
|
||||||
|
rectangle.x=context.width-rectangle.largeur;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// fonction qui gere l'apparition/disparition de la muntition
|
||||||
|
function gestionMunition(){
|
||||||
|
if(munition.y< -munition.hauteur && munition.exist==true){
|
||||||
|
munition.exist=false;
|
||||||
|
}
|
||||||
|
if(munition.exist== true){
|
||||||
|
munition.y-=6;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// fonction qui permet de tirer une munition
|
||||||
|
function tirJoueur(){
|
||||||
|
if(touches.espace && munition.exist==false){
|
||||||
|
munition.exist=true;
|
||||||
|
munition.x=rectangle.x+(rectangle.largeur/2);
|
||||||
|
munition.y=rectangle.y-munition.hauteur;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// fonction qui gere la collision entre la munition et l'alien
|
||||||
|
function collisionMunitionAlien(){
|
||||||
|
if(collisionA(munition) && munition.exist){
|
||||||
|
for(let i=0;i<Ennemi.length;i++){
|
||||||
|
if(Ennemi[i].x==coord.x && Ennemi[i].y==coord.y){
|
||||||
|
rectangle.score += Ennemi[i].score;
|
||||||
|
munition.exist=false;
|
||||||
|
Ennemi.splice(i, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//fonction qui gère la collision entre la munition et la défense
|
||||||
|
function collisionMunitionDefense(){
|
||||||
|
if(( collisionD(munition) != null ) && munition.exist){
|
||||||
|
for (let i=0;i<Defense.length;i++){
|
||||||
|
if(Defense[i].x==collisionD(munition).x && Defense[i].y == collisionD(munition).y ){
|
||||||
|
Defense[i].vies-=1;
|
||||||
|
|
||||||
|
if(Defense[i].color=="Green"){
|
||||||
|
Defense[i].color="yellow";
|
||||||
|
}else if(Defense[i].color=="yellow"){
|
||||||
|
Defense[i].color="orange";
|
||||||
|
}else if(Defense[i].color=="orange"){
|
||||||
|
Defense[i].color="red";
|
||||||
|
}
|
||||||
|
|
||||||
|
if(Defense[i].vies==0){
|
||||||
|
Defense.splice(i,1);
|
||||||
|
|
||||||
|
}
|
||||||
|
munition.exist=false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (collTirsAlienObstacle() != null){
|
||||||
|
for ( let i = 0; i<Defense.length; i++){
|
||||||
|
if(Defense[i].x == collTirsAlienObstacle().x && Defense[i].y == collTirsAlienObstacle().y){
|
||||||
|
|
||||||
|
Defense[i].vies-=1;
|
||||||
|
|
||||||
|
if(Defense[i].color=="Green"){
|
||||||
|
Defense[i].color="yellow";
|
||||||
|
}else if(Defense[i].color=="yellow"){
|
||||||
|
Defense[i].color="orange";
|
||||||
|
}else if(Defense[i].color=="orange"){
|
||||||
|
Defense[i].color="red";
|
||||||
|
}
|
||||||
|
|
||||||
|
if(Defense[i].vies==0){
|
||||||
|
Defense.splice(i,1);
|
||||||
|
|
||||||
|
}
|
||||||
|
attaque.y=0;
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// fonction qui détecte la collision
|
||||||
|
function collisionA(r1){
|
||||||
|
let col=false;
|
||||||
|
for (let r2 of Ennemi){
|
||||||
|
if( (r1.x+r1.largeur > r2.x && r1.x<r2.x+r2.width) && (r1.y+r1.hauteur > r2.y && r1.y<r2.y+r2.height) ){
|
||||||
|
col=true;
|
||||||
|
coord={x : r2.x, y: r2.y};
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return col;
|
||||||
|
}
|
||||||
|
|
||||||
|
//fonction qui détecte si la munition touche une défense
|
||||||
|
function collisionD(r1){
|
||||||
|
for (let r2 of Defense){
|
||||||
|
if( (r1.x+r1.largeur > r2.x && r1.x<r2.x+r2.width) && (r1.y+r1.hauteur > r2.y && r1.y<r2.y+r2.height) ){
|
||||||
|
return r2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
// --------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//---------------------------------------------------déplacement des aliens--------------------------------------------------------------------
|
||||||
|
// fonction qui gere le déplacement des aliens
|
||||||
|
function deplacementAliens(){
|
||||||
|
//pr aller de gauche à droite
|
||||||
|
deplacementVersDroite();
|
||||||
|
// pr aller de droite à gauche
|
||||||
|
deplacementVersGauche();
|
||||||
|
}
|
||||||
|
//fonction pour gérer le déplacement vers la droite des aliens
|
||||||
|
function deplacementVersDroite(){
|
||||||
|
if(maxX(Ennemi)<context.width-65 && direction=="D"){
|
||||||
|
compteur+=speedAlien;
|
||||||
|
if(compteur>MAX_COMPTEUR){
|
||||||
|
for(let temp of Ennemi){
|
||||||
|
temp.x+=MAX_COMPTEUR/7;
|
||||||
|
}
|
||||||
|
compteur=0;
|
||||||
|
animationFrame=-animationFrame;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if(direction=="D"){
|
||||||
|
for(let temp of Ennemi){
|
||||||
|
temp.y+=45;
|
||||||
|
temp.x-= 20;
|
||||||
|
}
|
||||||
|
speedAlien+=1;
|
||||||
|
}
|
||||||
|
direction="G";
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//fonction pour gérer le déplacement vers la gauche des aliens
|
||||||
|
function deplacementVersGauche(){
|
||||||
|
if(minX(Ennemi)>20 && direction=="G"){
|
||||||
|
compteur+=speedAlien;
|
||||||
|
if(compteur>MAX_COMPTEUR){
|
||||||
|
for(let temp of Ennemi){
|
||||||
|
temp.x-=MAX_COMPTEUR/7;
|
||||||
|
}
|
||||||
|
compteur=0;
|
||||||
|
animationFrame=-animationFrame;
|
||||||
|
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if(direction=="G"){
|
||||||
|
for(let temp of Ennemi){
|
||||||
|
temp.y+=45;
|
||||||
|
temp.x+= 20;
|
||||||
|
}
|
||||||
|
speedAlien+=1;
|
||||||
|
}
|
||||||
|
direction="D";
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
// --------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//-------------------------------------------------fonctions qui cherches les X,Y min et max----------------------------------------------------
|
||||||
|
// fonction qui cherche la valeur de x maximale d'un tableau d'alien
|
||||||
|
function maxX(Ennemi){
|
||||||
|
let max = 0;
|
||||||
|
for(let temp of Ennemi){
|
||||||
|
if(temp.x>max){
|
||||||
|
max=temp.x;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return max;
|
||||||
|
}
|
||||||
|
//fonction qui cherche la valeur x minimale d'un tableau d'alien
|
||||||
|
function minX(Ennemi){
|
||||||
|
let min = context.width;
|
||||||
|
for(let temp of Ennemi){
|
||||||
|
if(temp.x<min){
|
||||||
|
min=temp.x
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return min;
|
||||||
|
}
|
||||||
|
// fonction qui cherche la valeur y max d'un tableau d'aliens
|
||||||
|
function maxY(Ennemi){
|
||||||
|
let min = 0;
|
||||||
|
for(let temp of Ennemi){
|
||||||
|
if(temp.y>min){
|
||||||
|
min=temp.y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return min;
|
||||||
|
}
|
||||||
|
// fonction qui cherche la valeur de y maximale d'un tableau d'alien
|
||||||
|
function minY(Ennemi){
|
||||||
|
let min = context.width;
|
||||||
|
for(let temp of Ennemi){
|
||||||
|
if(temp.y<min){
|
||||||
|
min=temp.y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return min;
|
||||||
|
}
|
||||||
|
// --------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ---------------------------------------------------------Tirs des aliens------------------------------------------------------------
|
||||||
|
// fonction qui gere les munitions tirées par les aliens
|
||||||
|
function gestionMunitionAliens(){
|
||||||
|
for(let temp of munitionAlien){
|
||||||
|
if(temp.exist){
|
||||||
|
temp.y+=3;
|
||||||
|
}
|
||||||
|
if(temp.y>context.height){
|
||||||
|
temp.exist=false;
|
||||||
|
temp.y=0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//fonction qui permet de vérifier si un des tirs alien a touché une défense ou non
|
||||||
|
function collTirsAlienObstacle(){
|
||||||
|
for(let r1 of munitionAlien){
|
||||||
|
for (let r2 of Defense){
|
||||||
|
|
||||||
|
if( (r1.x+r1.largeur > r2.x && r1.x<r2.x+r2.width) && (r1.y+r1.hauteur > r2.y && r1.y<r2.y+r2.height) ){
|
||||||
|
attaque = r1;
|
||||||
|
attaque.exist = false;
|
||||||
|
return r2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// fonction qui détecte si un tir d'alien a touché le joueur
|
||||||
|
function collisionTirAlienJoueur(){
|
||||||
|
let col=false;
|
||||||
|
for(let r1 of munitionAlien){
|
||||||
|
if( (r1.x+r1.largeur > rectangle.x && r1.x<rectangle.x+rectangle.largeur) && (r1.y+r1.hauteur > rectangle.y && r1.y<rectangle.y+rectangle.hauteur) ){
|
||||||
|
col=true;
|
||||||
|
for(let r1 of munitionAlien){
|
||||||
|
r1.exist=false;
|
||||||
|
r1.y = 0;
|
||||||
|
}
|
||||||
|
rectangle.vies-=1;
|
||||||
|
GAME_STATE=PAUSE;
|
||||||
|
setTimeout(function(){ GAME_STATE=INGAME; rectangle.x=(context.width-rectangle.largeur)/2},2000)
|
||||||
|
r1.exist=false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return col;
|
||||||
|
}
|
||||||
|
|
||||||
|
//fonction qui permet de remplir le tableau des aliens qui peuvent tirer
|
||||||
|
function remplirTabIndiceAlienTir(){
|
||||||
|
tab = [];
|
||||||
|
for (i = 0; i<Ennemi.length; i++){
|
||||||
|
if(Ennemi[i].y == minY(Ennemi)){
|
||||||
|
tab.push(Ennemi[i].num);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
return tab;
|
||||||
|
}
|
||||||
|
|
||||||
|
//qui fait tirer les aliens
|
||||||
|
function randomTirIndiceAlien(){
|
||||||
|
let tab=remplirTabIndiceAlienTir();
|
||||||
|
let compteur=0;
|
||||||
|
for(let temp of tab){
|
||||||
|
if(randomTirAlien() && !munitionAlien[temp].exist){
|
||||||
|
munitionAlien[temp].exist=true;
|
||||||
|
munitionAlien[temp].y=minY(Ennemi)+Ennemi[0].height;
|
||||||
|
munitionAlien[temp].x=Ennemi[compteur].x+(Ennemi[compteur].width/2);
|
||||||
|
}
|
||||||
|
compteur+=1;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//fonction qui génère le random des tirs
|
||||||
|
function randomTirAlien(){
|
||||||
|
if (1+Math.random()*(1000-1)+1>999){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
//------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction appelée lorsqu'une touche du clavier est appuyée
|
||||||
|
* Associée à l'événement "keyDown"
|
||||||
|
*/
|
||||||
|
function captureAppuiToucheClavier(event) {
|
||||||
|
// pratique pour connaître les keyCode des touches du clavier :
|
||||||
|
// --> http://www.cambiaresearch.com/articles/15/javascript-key-codes
|
||||||
|
|
||||||
|
|
||||||
|
//Lancement du jeu si on appuie sur ENTER
|
||||||
|
if(event.code=="Enter" && GAME_STATE==MENU){
|
||||||
|
GAME_STATE=INGAME;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// gestion du tir
|
||||||
|
if(event.code=="Space" ){
|
||||||
|
touches.espace=true;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//gestion du déplacement
|
||||||
|
if(event.code=="ArrowRight" ){
|
||||||
|
touches.droite=true;
|
||||||
|
}
|
||||||
|
if(event.code=="ArrowLeft" ){
|
||||||
|
touches.gauche=true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(event.code=="KeyP"&& GAME_STATE==INGAME){
|
||||||
|
GAME_STATE=PAUSE;
|
||||||
|
} else if(event.code=="KeyP" && GAME_STATE==PAUSE){
|
||||||
|
GAME_STATE=INGAME;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction appelée lorsqu'une touche du clavier est relâchée
|
||||||
|
* Associée à l'événement "keyUp"
|
||||||
|
*/
|
||||||
|
function captureRelacheToucheClavier(event) {
|
||||||
|
|
||||||
|
// gestion mouvement
|
||||||
|
if(event.code=="ArrowRight"){
|
||||||
|
touches.droite=false;
|
||||||
|
}
|
||||||
|
if(event.code=="ArrowLeft"){
|
||||||
|
touches.gauche=false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(speed<0.1 && (event.code=="ArrowUp"|| event.code=="ArrowDown")){
|
||||||
|
speed=0.1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// gestion du tirJoueur
|
||||||
|
if(event.code =="Space"){
|
||||||
|
touches.espace=false;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction appelée lorsqu'une touche du clavier est relâchée
|
||||||
|
* Associée à l'événement "click"
|
||||||
|
*/
|
||||||
|
function captureClicSouris(event) {
|
||||||
|
// calcul des coordonnées de la souris dans le canvas
|
||||||
|
if (event.target.id == "cvs") {
|
||||||
|
clic.x = event.pageX - event.target.offsetLeft;
|
||||||
|
clic.y = event.pageY - event.target.offsetTop;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body onload="init()">
|
||||||
|
|
||||||
|
<canvas id="cvs" width="1000" height="800" style="margin: 10px auto; border: solid 1px #000;"></canvas>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
||||||
BIN
randompts.jpg
Normal file
BIN
randompts.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 26 KiB |
Reference in New Issue
Block a user