CODE: Séance 3
- Voici la troisième étape de notre codage. L'objectif de cette étape sera de :
- Gerer les collisions entre le tir et les cibles.
- Mettre une musique de fond.
- Mettre une musique lorsque l'on tire.
- Mettre une musique lors de la collision.
- Faire apparaître "l'affichage général" ( score, chronomètre ).
- CODE:
import ddf.minim.*; // importation de la bibliothèque audioimport ddf.minim.analysis.*;import ddf.minim.effects.*;import ddf.minim.signals.*;import ddf.minim.spi.*;import ddf.minim.ugens.*;Minim minim;AudioPlayer SI;AudioPlayer Tir;AudioPlayer Hit;PImage espace; //image du fond d'ecranPImage vaisseau; //image du tireurPImage invaders; //image des ciblesint monTableauX [] = new int [60];int [] monTableauY = new int [60];int [] monTableauR = new int [60];int [] monTableauVitesse = new int [60];int x = 370; //position initiale en x du tireurint y = 530; //position initiale en y du tireurint z = 20; //nombre de ballesint low = 0; // position la plus basse ( en y )int compteur = 0; // compteur de cibles détruitesint Total = 0;int Niveaux = 1;float s =second();boolean tir = false;void setup() {size(800, 600); //taille de la fenêtreframeRate(20);textSize(20);vaisseau = loadImage("vaisseau.png");espace = loadImage("espace.jpg");invaders = loadImage("invaders.png");minim = new Minim(this);SI = minim.loadFile("SI.mp3");Tir = minim.loadFile("Tir.mp3");Hit = minim.loadFile("Hit.mp3");for (int i=0; i{monTableauY[i] = (int)random(20, 300);monTableauR[i] = 20; //(int)random(5, 35);monTableauVitesse[i] = (int)random(1, 10);}}void draw() {image(espace, 0, 0, width, height);dessinerTireur();deplacerTireur();dessinerCibles();deplacerCibles();dessinerTir();detruireCibles();afficherScore();menu();chronometre();SI.play();text("Space Invaders", 5, 5, 200, 100);}void keyPressed() {if (keyCode == LEFT) {x=x-10;} else {if (keyCode == RIGHT) {x=x+10;} else {if (key == ' ' ) {tir = true;//Tir.play();//Tir.rewind();println("true");}}}}void keyReleased() {if ( key == ' ') {tir = false;println("false");}}void dessinerTireur() {image(vaisseau, x, y, 70, 70);}void deplacerTireur() {if ( x > 730) {x = 730;}if ( x<10) {x = 25;}}void dessinerCibles() {for (int i=0; i{fill(#FFFCFC);image(invaders, monTableauX[i], monTableauY[i], monTableauR[i], monTableauR[i]);}}void deplacerCibles() {for (int i=0; i{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;}}}void dessinerTir() {if (tir ==true) {rect(x+33, low, 2, 532);}}void detruireCibles() {low = 0;for (inti=0; i{if (tir==true) {if (monTableauX[i]x+10) { monTableauX[i] = -60;compteur = compteur + 1;Total = Total + 1;println(z);if ( monTableauY[i] > low) {low = monTableauY[i];}Hit.play();Hit.rewind();}}}}void afficherScore() {text("Score Total:" +Total, 20, 575, 200, 100);}void menu (){rect ( 700, 5, 90, 20);fill (#0004BF);text ("quitter", 710, 22);if (mousePressed){if (mouseX > 700 && mouseX < 780){if (mouseY > 5 && mouseY < 25){exit(); //ferme le programme}}}}void chronometre() {text("Temps :"+second(), 530, 10, 200, 100);}void stop() {Tir.close();minim.stop();super.stop();}-
Nous nous sommes attaqué à une des parties les plus compliquées du codage de notre jeux : gerer les collisions. C'est-à-dire, gérer une zone de collision. Pour notre cas, nous avons délimité une zone autour de notre tir et lorsque la cible entrera dans cette zone alors il y aura collision et elle disparaîtra. Il a pour cela fallu dans un « void detruireCibles » utiliser une boucle for et un structure conditionnelle « if ». Premièrement, on affecte à la variable entière « low » la valeur 0. Ensuite, on utilise une boucle for comme expliqué précedémment afin que faire apparaître nos balle grâce à la variable « i » qui s'incrémente de une unité jusqu'à atteindre la valeur de la variable entière « z ». Ainsi, on utilise trois structures conditionnelles afin de rendre notre tir le plus précis possible. Donc lorsque la variable booléen « tir » est vraie, que l'abscisse des cibles soit compris entre « x+10 » et « x+25 » ( avec « monTableauX[i] » qui gère les abscisses des cibles et « x » qui gère l'abscisse du tireur) et que l'ordonnée des cibles soit supérieure à la variable « low » alors les cibles dans cet intervalle auront pour abscisse -60 ( elles sortiront de la fenêtre afin d'imiter leur destruction ).
---> Travail effectué par Christopher.
-
Pour mettre des musiques, il a fallu tout d'abord importer la bibliothhèque audio « minim » contenu dans processing grâce à « import ddf.minim* ».
- Pour mettre une musique de fond, il a fallu déclarer un objet audio appelé minim. Ensuite glisser le fichier audio dans le sketch pour l'intégrer. Cet objet objet stockera le fichier musique qui sera éxécuté par l'objet « AudioPlayer Player » suivi du nom du fichier musique. Ensuite, on charge l'objet musique dans la case mémoire grâce à la fonction « minim.loadFile » suivi du nom du fichier musique ainsi que son format (.mp3).
- Afin de déclencher certains sons à un moment précis, comme un bruit de collisions quand une cible est détruite il a fallu intégrer dans la structure conditionnelle comme instruction la méthode « Hit.play() » afin de déclencher le son.
- Nous sommes tombés face à un problème, une fois le son joué il ne se rejoue plus. Nous avons donc cherché sur l'aide de processing et trouvé une technique pour rembobiner le son : le ".rewind" . Ainsi en dessous de « Hit.play() » nous avons mis « Hit.rewind() ».
- Nous avons décider de ne pas mettre de son lorsque l'on tire quand cela cache le son lors de la collision et cela est désagréable pour jouer. L'important est d'avoir essayer et d'avoir réussir à générer ce son lorsque l'on tire.
▬►Travail effectué par Nicolas.
- Pour afficher le score, c'est-à-dire, afficher le nombre total de cibles tuées ainsi que le nombre de cibles tuées par niveau. Pour cela il a fallu déclarer deux variables entières appelée « Total » et « compteur ». La variable Total sera pour le score total et la variable compteur pour le score par niveau. Ensuite on affecte a ces deux variables la valeurs 0. Elles devront s'incrémenter de une unité lorsque une cible est touchée, soit lors de la collision entre le tir et la cible. Pour cela, dans le « void détruireCibles » dans la structure conditionnelle « if ». Lorsque que la condition de destruction de cible est remplie, on incrémente de 1 unité les deux variables. Deplus, pour le score par niveau, a chaque changement de niveau, la variable « compteur » est réinitialisée à 0. Enfin, pour afficher ces variables dans la fenêtre, on utilise la méthode « text » prédéfinie dans processing pour afficher respectivement « Score Total » et « Score par niveau » et on intègre les variables dans cette méthode « text » avec la méthode « + Total ». Il nous suffira ensuite, de régler les paramètres d'affichage de la méthode « text » pour afficher le texte où l'on veut. Pour finir, nous avons utiliser la méthode « textSize » , elle aussi prédéfinie dans processing, qui permer de régler la taille de l' écriture et nous lui avons affecté la valeur 12.
---> Travail effectué par Nicolas.
- Nous avons commencé à réfléchir afin de faire apparaître le chronomètre. Nicolas a su faire appaître les secondes de l'horloge de l'ordinateur grâce à la fonction "second()". C'est un bon début, il faudra chercher comment initialiser cette valeur à 0 pour compter uniquer les secondes depuis l'ouverture du programme.
- Le but de notre prochaine séance sera de :
- Faire apparaître un/des niveau(x). ( deuxième partie la plus compliquée du codage de notre jeux)
- Affiner la précision de la zone de collision.
- Faire apparaître le chronomètre.
- Mettre un mode 'souris' et un mode 'clavier' afin de se déplacer et de tirer.
- Gerer l'activité du programme lorsque l'on perd ou lorsque l'on gagne, ainsi qu'afficher une message dans ces deux cas.
-