/* UTF-8 * * © Jacques Duma * 14 mai 2009 * * Tir à la Cible avec Trajectoire Parabolique */ // === CONSTANTES === couleurs de base color rouge = color(255, 0, 0); color bleu = color(0, 0, 255); color jaune = color(255, 255, 0); color fondDebut = color(180, 255, 255); // bleu clair color fondActif = color(255, 255, 149); // jaune clair color fondCfini = color(221, 221, 204); // gris color fondBravo = color(255, 195, 127); // orange // ===== GUI : Interface Graphique Utilisateur ===== // Origine et Axes int x0, y0, x1, y1; // polices de caractères PFont policeStandard, policeTitre, policeFantaisie; // ===== ÉTATS DE FONCTIONNEMENT DE L'INTERFACE ===== // initEnCours == true : INITIALISATION fond bleu clair // on peut déplacer la balle et modifier le vecteur vitesse // initEnCours == false : JEU // jeuActif == true : JEU ACTIF le clic fait avancer la balle fond jaune clair // jeuActif == false : JEU TERMINÉ /// bravo == true : JEU TERMINÉ CIBLE ATTEINTE fond orange /// bravo == false : JEU TERMINÉ BALLE PERDUE fond gris boolean initEnCours = true; boolean jeuActif = true; boolean bravo = false; // ===== setup ===== exécuté une seule fois au lancement du programme void setup() { // Dimensions fenêtre size(800, 600); // Origine et Axes x0 = 25; y0 = height - 25; x1 = width - 25; y1 = height - y0; // position initiale de la balle xDepartBalle = x0; yDepartBalle = y0 - 200; smooth(); // lissage des dessins // chargement des polices de caractères policeStandard = loadFont("Helvetica-Bold-12.vlw"); policeTitre = loadFont("Times-Roman-48.vlw"); policeFantaisie = loadFont("Apple-Chancery-14.vlw"); // initialisation du jeu raz(); nouvelleCible(); } // ===== draw ===== exécuté en boucle perpétuelle void draw() { // Couleur selon l'état background(initEnCours ? fondDebut : (jeuActif ? fondActif : (bravo ? fondBravo : fondCfini))); dessinerAxes(); line(x0, y1, x0 + 4, y1 + 4); // interface de jeu dessinerCible(); drawBoutonInitJeu(); dessinerLaBalle(); afficherInformations(); if (initEnCours) { // INITIALISATION balle et vecteur vitesse modifiables drawGlisseurBalle(); drawGlisseurVecteur(); drawEtiquette("1. Pointer : Déplacer la position initiale de la Balle et ajuster sa Vitesse. 2. Tirer : Lancer la Balle", width / 2, 5, CENTER, TOP, policeFantaisie, bleu); // les boutons de contrôle de position de la balle et de la vitesse drawPlusMoinsX(); drawPlusMoinsY(); drawPlusMoinsA(); drawPlusMoinsV(); return; } // les messages du JEU if (jeuActif){ // JEU ACTIF : le temps passe (la balle avance) t = t + dt; drawEtiquette("Tir effectué !", width / 2, 5, CENTER, TOP, policeFantaisie, bleu); } else { // JEU TERMINÉ : le clic dans la fenêtrene fait rien (la balle est immobile) if (bravo) { // JEU TERMINÉ CIBLE ATTEINTE fond orange drawEtiquette("BRAVO ! La Balle a touché la Cible ! Pour obtenir une nouvelle Cible : Rejouer", width / 2, 5, CENTER, TOP, policeFantaisie, rouge); } else { // JEU TERMINÉ BALLE PERDUE fond gris drawEtiquette("La Balle est sortie du terrain de jeu ! Pour une nouvelle tentative : Corriger le Tir", width / 2, 5, CENTER, TOP, policeFantaisie, bleu); } } } // ================ EVENEMENT : mousePressed ================ void mousePressed() { mousePressedPlusMoinsX(); mousePressedPlusMoinsY(); mousePressedPlusMoinsA(); mousePressedPlusMoinsV(); } // ================ EVENEMENT : mouseReleased ================ void mouseReleased() { // bascule si Clic dans BoutonInitJeu if (mouseInBoutonInitJeu()) mouseReleasedBoutonInitJeu(); } // ================ EVENEMENT : mouseDragged ================ void mouseDragged() { if (! initEnCours) return; // balle et vecteur vitesse ne sont modifiables que si initEnCours == true if (mouseInGlisseurBalle()) mouseDraggedGlisseurBalle(); else if (mouseInGlisseurVecteur()) mouseDraggedGlisseurVecteur(); } //===== UTILITAIRE : couleur complémentaire de c ==== color negatif (color c) { return color(255 - red(c), 255 - green(c), 255 - blue(c)); } //===== UTILITAIRE : dessiner les axes ==== void dessinerAxes() { // grille stroke(fondBravo); for (int k = 0; k < 18; k++) line(x0 + 50 * k, 0, x0 + 50 * k, height); for (int k = 0; k > -14; k--) line(0, y0 + 50 * k, width, y0 + 50 * k); stroke(bleu); // abscisses line(25, y0, x1, y0); line(x1, y0, x1 - 4, y0 + 4); line(x1, y0, x1 - 4, y0 - 4); // ordonnées line(x0, y0, x0, y1); line(x0, y1, x0 - 4, y1 + 4); }