CODE : séance 5

  • Le but de la prochaine sera de :


        - Faire apparaître les boutons "quitter" et "info".
        - Faire apparaître le fenêtre "info".
        - Faire apparaître le nombre de tirs effectués dans l'affichage final.
        - Faire apparaître le nombre de cibles tuées dans l'affichage final.
 

  • CODE (AVEC COMMENTAIRES):
    import ddf.minim.*; // importation de TOUTE la bibliothèque audio.
     
     
    Minim minim;
    AudioPlayer SI; // déclaration d'un objet AudioPlayer appelé SI
    AudioPlayer Tir; // déclaration d'un objet AudioPlayer appelé Tir
    AudioPlayer Hit; // déclaration d'un objet AudioPlayer appelé SI
     
    PImage espace; // déclaration d'un objet image appelé espace
    PImage vaisseau; // déclaration d'un objet image appelé vaisseau
    PImage invaders; // déclaration d'un objet image appelé invaders
     
    PGraphics bg; // déclaration d'un objet PGraphics nommé bg
     
    int monTableauX [] = new int [60]; // déclaration d'un tableau d'entiers contenant 60 valeurs nommé monTableauX []
    int [] monTableauY = new int [60]; // déclaration d'un tableau d'entiers contenant 60 valeurs nommé monTableauY []
    int [] monTableauR = new int [60]; // déclaration d'un tableau d'entiers contenant 60 valeurs nommé monTableauR []
    int [] monTableauVitesse = new int [60]; // déclaration d'un tableau d'entiers contenant 60 valeurs nommé monTableauVitesse []
    int x = 370; // déclaration d'une variable entière appelée x et affectation de la valeur 370
    int y = 530; // déclaration d'une variable entière appelée y et affectation de la valeur 530
    int z = 20; // déclaration d'une variable entière appelée z et affectation de la valeur 20
    int t = 0; // déclaration d'une variable entière appelée t et affectation de la valeur 0
    int lePlusBas = 0; // déclaration d'une variable entière appelée lePlusBas et affectation de la valeur 0
    int compteur = 0; // déclaration d'une variable entière appelée compteur et affectation de la valeur 0
    int total = 0; // déclaration d'une variable entière appelée total et affectation de la valeur 0
    int niveaux = 1; //déclaration d'une variable entière appelée niveaux et affectation de la valeur 1
    int s = 0 ; //  déclaration d'une variable entière appelée s et affectation de la valeur 0
     
    boolean tir = false; // déclaration d'une variable booléen et affection de la valeur "false"
     
     
     
    void setup() { // fonction qui ne s'execute qu'une fois et qui ne prend aucuns paramètres
     
      size(800, 600); // création d'une fenêtre de 800x600 pixels
      frameRate(20); // fonction permettant de régler le nombre d'execution du draw par seconde
      textSize(15); // fonction permettant de régler la taille du texte
     
      // on charge l'objet PGraphics dans la case mémoire nommée "bg"
      bg = createGraphics(400, 400); 
     
      // on charge les images dans leurs cases mémoires respectives
      vaisseau = loadImage("vaisseau.png");
      espace = loadImage("espace.jpg");
      invaders = loadImage("invaders.png");
      // on charge les sons dans leurs cases mémoires respectives
      minim = new Minim(this);
      SI = minim.loadFile("SI.mp3");
      Tir = minim.loadFile("Tir.mp3");
      Hit = minim.loadFile("Hit.mp3");
     
      // boucle for permettant d'executer 20 fois ( z=20 ) les instructions placées en accolade
      for (int i=0; i<z; i=i+1) 
      { 
        monTableauY[i] = (int)random(20, 300); // random : choisi un nombre entier aléatoire entre 20 et 300
        monTableauR[i] = (int)random(15, 20);
        monTableauVitesse[i] = (int)random(1, 10);
      }
    }
     
     
    void draw() { // fonction qui s'execute par défaut 60x / secondes ( ici 20 fois )
     
      image(espace, 0, 0, width, height); //affiche l'objet espace avec des coordonnées et tailles choisis.
     
      // Appel des fonctions qui seront codées en dehors du void draw
      dessinerTireur(); 
      deplacerTireur();
      dessinerCibles();
      deplacerCibles();
      dessinerTir();
      detruireCibles();
      afficherScore();
      afficherNiveaux();
      niveaux();
      modeSouris();
      modeClavier();
      menu();
      chronometre();
      SI.play();
      win();
      gameOver();
    }
     
    // fonction permettant d'utiliser le clavier pour intéragir et executer des instructions
    void keyPressed() { // variable booléen vraie sur une touche du clavier est appuyée
     
      if (keyCode == LEFT) { // structure conditionnelle executant une instruction si la condition est vraie
     
        x=x-10;
      } else {
        if (keyCode == RIGHT) {
     
          x=x+10;
        } else {
          if (key == ' ' ) {
            t = t + 1;
            println(t);        
            tir = true;       
            println("true");// affiche sur la console la valeur d'une variable
          }
        }
      }
    }
     
     
     
     
    void keyReleased() { // variable booléen qui est vraie lorsque l'on lache une touche du clavier
      if ( key == ' ') {
        tir = false;
        println("false");
      }
    }
     
     
    // fonction permettant d'afficher le tireur
    void dessinerTireur() {
      image(vaisseau, x, y, 70, 70);
      // on affiche l'objet image "vaisseau" de coordonnées et tailles choisis
    }
     
    // fonction permettant de déplacer le tireur
    void deplacerTireur() {
      if ( x > 730) {
        x = 730;
      }
      if ( x < 10) {
        x = 25;
      }
    }
     
    // fonction permettant de faire apparaître les cibles
    void dessinerCibles() {
      for (int i=0; i<z; i=i+1)
      { 
        fill(#FFFCFC); // méthode pour choisir la couleur de remplissage des formes
        image(invaders, monTableauX[i], monTableauY[i], monTableauR[i], monTableauR[i]);
        // on affiche l'objet image "invaders" de coordonnées et tailles choisis
      }
    }
     
    //fonction permettant le déplacement des cibles
    void deplacerCibles() {
      for (int i=0; i<z; i=i+1)
      { 
        monTableauX[i] =  monTableauX[i]+ monTableauVitesse[i];
        if (monTableauX[i] > 780 ) {
          monTableauVitesse[i] = - monTableauVitesse[i];
          monTableauY[i] = monTableauY[i] +30;
        }
        if (monTableauX[i] < 1) {
          monTableauVitesse[i] = - monTableauVitesse[i];
          monTableauY[i] = monTableauY[i] +30;
        }
      }
    }
     
    //fonction permettant d'afficher le tir
    void dessinerTir() { 
      if (tir ==true) {
        rect(x+33, lePlusBas, 2, 532);
      }
    }
     
    //fonction permettant la destrucution des cibles lors de la collision
    void detruireCibles() {
      lePlusBas = 0;
      for (int i=0; i<z; i=i+1)
      {
        if (tir==true) {
          if (monTableauX[i]<x+25 && monTableauX[i]>x+10) {
            if ( monTableauY[i] > lePlusBas) {
              lePlusBas = monTableauY[i];
     
              monTableauX[i] = -60;  
              compteur = compteur + 1;
              total = total + 1;
              println(z);
            }      
            Hit.play();
            Hit.rewind();
          }
        }
      }
     
    //fonction permettant d'afficher le score
    void afficherScore() {
      text("SCORE PAR NIVEAU:" +compteur, 600, 575, 400, 200); // "text" permet l'affiche d'un message sur une position choisie de l'écran
      text("Score Total:" +total, 5, 575, 200, 100);
      fill(#FFFFFF);
      text("Space Invaders", 5, 5, 200, 100);
    }
     
    // fonction permettant d'afficher le niveau dans lequel on joue
    void afficherNiveaux() {
      text("Niveau:" +niveaux, 350, 5, 200, 200);
     
     
    //fonction permettant de pouvoir changer de niveaux
    void niveaux() {
      if (compteur == 20) {
        compteur = 0; 
        niveaux = 2;
        z = 40;
        println(z);
        for (int i=0; i<z; i=i+1) 
        { 
          monTableauY[i] = (int)random(20, 300);
          monTableauR[i] =  20; 
          monTableauVitesse[i] = (int)random(5, 12);
          dessinerCibles();
          deplacerCibles();
        }
      }
    }
     
    //fonction permettant de pouvoir utiliser la souris afin de se déplacer et tirer
    void modeSouris() {
      if (key == 's' || key == 'S') {
        x = mouseX; // contient les abscisses du curseur de la souris
        if ( mousePressed ) { // variable booléen vraie si l'on effectue un clique avec la souris
          tir = true;
          t = t + 1;
          println(t);
        } else {
          tir = false;
        }
      }
    }
     
    // fonction permettant de pouvoir utiliser le clavier afin de se déplacer et tirer
    void modeClavier() {
      if (key == 'c' || key == 'C') {
        keyPressed();
        keyReleased();
      }
    }
     
    // fonction permettant de faire apparaître les bouton "quitter" et "option"
    void menu () {
     
      //bouton "quitter"
      rect ( 700, 5, 90, 20); //fonction qui permet de créer un rectangle de coordonnées et tailles choisies
      fill (#0004BF);
      text ("quitter", 720, 20);
      if (mousePressed)
      {
        if (mouseX > 700 && mouseX < 790)
        {
          if (mouseY > 5 && mouseY < 25)
          {
            exit(); //ferme le programme
          }
        }
      }
      fill (#FFFFFF);
     
      // bouton "option"
      rect ( 700, 28, 90, 20);
      fill (#0004BF);
      text ("option", 720, 43);
      if (mousePressed) 
      {  
        if (mouseX > 700 && mouseX < 790)
        {
          if (mouseY > 28 && mouseY < 47)
          {
     
            info();
          }
        }
      }
    }
     
     
     
    //fonction permettant de faire apparaître un chronomètre
    void chronometre() {
     
      s = millis()/1000; // millis : contient les millis-secondes passées depuis l'ouverture du programme
      fill(#FFFFFF);
      text("Temps:", 530, 5, 200, 100);
      text("00:", 585, 5, 200, 100);
      text(""+s, 608, 5, 200, 100);
    }
     
    // fonction permettant d'afficher un message lorsque l'on gagne
    void win() {
      if ( total == 40) {
        x = 370;
        fill(#F53B0C);
        text("CONGRATULATIONS YOU WIN", 280, 40, 400, 200);
        fill(#1172ED);
        text("Nombre de cibles tuées: "+total, 280, 70, 400, 200);
        text("Nombre de tirs effectués: "+t, 280, 90, 400, 200);
      }
    }
     
    // fonction permettant d'afficher un message lorsque l'on perd
    void gameOver() {
      for (int i=0; i<z; i=i+1)
      {
        if (s >= 90 ) { // supérieur ou égal = 1,30min
          fill(#0C5BF5);
          text("GAME OVER EARTH WAS INVADED!!", 260, 270, 400, 200);
          tir = false;
          monTableauVitesse[i] = monTableauVitesse[i] - monTableauVitesse[i];
          println(monTableauVitesse[i]);
        }
      }
    }
     
    // fonction permettant d'afficher l'objet PGraphics
    void info () //affiche les info sans arrêter le jeu
    {
      bg.beginDraw();
      bg.background(#ADAEAF);
      bg.fill(0);
      bg.textSize(12);
      bg.text("Uersion 1.0", 10, 13);
      bg.text("Projet ISN BAC : Space Invaders", 210, 13);
      bg.text("Commandes: ", 10, 40);
      bg.text(". Barre espace/clic droit: tirer", 30, 70);
      bg.text(". Flèches directionelles: déplacer le tireur", 30, 90);
      bg.text(". Touche 's': mode souris", 30, 110);
      bg.text(". Touche 'c': mode clavier", 30, 130);
      bg.text("But: ", 10, 160);
      bg.text("Détruire les cibles le plus rapidement possible.", 30, 190);
      bg.text("Outils: ", 10, 220);    
      bg.text(". Quitter: Ferme le jeu", 30, 250);
      bg.text("Roque Christopher TS1", 10, 290);
      bg.text("Rodrigues Nicolas TS1", 10, 310);
      bg.text("Spécialité ISN", 10, 330);
      bg.endDraw();
      image(bg, 200, 125);
    }
     
    //fonction permettant d'arrêter la musique
    void stop() {
      minim.stop();
      super.stop();
    }


 

  • Afin d'afficher deux boutons sur la fenêtre, les bouton « quitter » qui vas quitter le programme lorsque l'on cliquera dessus et le bouton « option » qui lui affichera une petite fenêtre avec différentes informations comme les commandes du jeu. Premierement, il a fallut faire apparaître les rectangles pour représenter les boutons. Nous avons donc utilisé la fonction « rect » et nous avons mis comme paramètres les coordonnées en « x » et en « y » des rectangles ainsi que la taille des ces rectangles qui nous avons choisi. Afin d'avoir un code mieux organisés nous avons regroupé cette partie du code dans un « void menu », la fonction « menu() » est écrite dans le « void draw » nous l'avons alors seulement appelée. Une fois nos rectangles crée nous avons décidé de colorer ces rectangles, pour cela nous avons utilisé la méthode « fill » prédéfinie dans processing qui permet de choisir la couleur de remplissage des formes, à différencier avec la méthode « stroke » elle aussi prédéfinie dans processing et qui permet de choisir la couleur de périmètre des formes. Ensuite il a fallu écrire respectivement dans les rectangles « quitter » et « option » pour cela, on utilise la méthode « text » de coordonnées et tailles choisis pour que ce soit bien écrit à l'intérieur des rectangles. Une fois les boutons apparu, il faut maintenant définir une zone de clic pour que l'on puisse se servir de ces boutons. Cette zone doit etre précise et ne doit passe dépasser les rectangles. Pour cela, on utilise la structure conditionnelle « if » qui a comme condition : si l'on clique dans un un intervalle en « y » et en « x » défini (les coordonnées du rectangle) alors on execute soit la fermeture du programme si l'on clique sur le bouton « quitter » soit l'apparition du menu option si l'on clique sur le bouton « option ». Afin que processing reconnaisse les clics de la souris il a fallu insérer une deuxièe structure conditionnelle dans la première avec la fonction « mousePressed » définie dans processing. Ainsi, lorsque l'on clique avec la souris et que l'on est dans l'intervalle défini alors l'instruction s'execute. Si l'on appuie sur le bouton « quitter », on execute l'instruction « exit() » qui est une méthode définie dans processing et qui quitte le programme. Si l'on appuie sur le bouton « option » on fait apparaître une fnêtre graphique sans arrêter le programme.

    ---> Travail effectué par Nicolas.

     

  • Pour faire apparaître cette interface graphique, il a fallu ce servir de nouvelles fonctions prédéfinies dans processing. Premièrement nous avons déclarer un objet graphique avec la fonction PGraphics appelé « bg » ( = BackGround ). Ensuite, dans le « void setup »,  on charge l'objet graphique dans la case mémoire nommée « bg » avec la fonction « createGraphics » et ses paramètres pour définir la taille. Une fois cette étape finis, dans un « void info » on utilise, les méthode « beginDraw » et « endDraw » pour commencer et arreter de paramétrer la fenêtre graphique qui apparaîtra sans arrêter le jeu, ainsi que les méthode classiques « fill », « text », « background » suivi de leurs paramètres pour personnaliser la fenêtre graphique. Pour finir, dans la structure conditionnelle qui vas permettre d'afficher cette fenêtre, dans l'instruction il nous suffit d'appeller la fonction « info() » .


    ---> Travail effectué par Christopher.

     

  • Une fois le jeu terminé, nous avons décider de faire apparaître lorsque l'on gagne, le nombre de cibles tuées. Pour cela, nous avons rajouté dans le « void win », dans la structure conditonnelle « if » une instruction supplémentaire celle d'afficher le texte « Nombre de cibles tuées » ainsi que la variable « Total ». Pour cela, on utilise la méthode «text » puis la méthode « + Total » pour afficher la variable, et enfin les paramètres choisis.
     

    ---> Travail effectué par Nicolas.

     

  •  Une fois le jeu terminé, nous avons décider de faire apparaître lorsque l'on gagne, le nombre de tir effectués. Pour cela, il a fallu déclarer une variable entière nommée « t » qui s'occupera de compter le nombre de tir effectué. On affecte à cette variable la valeur 0. Maintenant, pour qu'elle puisse s'incrémenter de une unité à chaque tir effectués nous avons utilisé une structure conditionnelle « if » qui a comme condition la méthode « mousePressed » définie dans processing. Lorsque l'on clique avec la souris, donc lorsque l'on tire, alors la variable t s'incrémente de une unité. Il nous suffit maintenant de faire apparaître le message suivant « Nombre de tir effectués » ainsi que la variable « t » grâce à la méthode « text » suivie de ses paramètres, dans le « void win ».

    ---> Travail effectué par Christopher.


    Cette séance fut la dernière avant de rendre une version fonctionnelle de notre programme ainsi que notre Dossier-Projet.
    Notre page HTML a été crée et consultable sur spaceinvaders-isn.shost.ca
    .