◆ Portail Antalaha

Annuaire › Code ouvert

Pirogue d'Antalaha - jeu de vanille (p5.js)

tutorial · Voir le site ↗
Connectez-vous pour copier ce site

Code publié par son auteur, en lecture seule. « Copier dans mon espace » crée un nouveau site à vous (non publié) que vous pouvez modifier librement.

js/gousse.js · 3.3 Ko

/* ============================================================
   gousse.js - la classe Gousse (la vanille à ramasser)
   ============================================================
   La vanille est la grande richesse de la région d'Antalaha !
   Les gousses tombent depuis le haut de l'écran (en réalité, c'est
   la pirogue qui avance : tout défile vers le bas).
   Une gousse DORÉE rapporte plus de points.
   ============================================================ */

class Gousse {

  /* ----------------------------------------------------------
     constructor(x, y, doree)
     Paramètres :
       x, y  : position de départ
       doree : true pour une gousse dorée (valeur spéciale)
     ---------------------------------------------------------- */
  constructor(x, y, doree) {
    this.x = x;
    this.y = y;
    this.doree = doree;
    this.angle = random(TWO_PI);          // orientation de départ au hasard
    this.rotation = random(-1.5, 1.5);    // vitesse de rotation (radians par seconde)
    this.rx = 16;                         // demi-largeur, utilisée pour éviter les chevauchements
    this.mort = false;                    // passe à true quand elle est ramassée
  }

  /* ----------------------------------------------------------
     mettreAJour(dt, vitesse)
     But : faire descendre la gousse avec le défilement et la faire tourner.
     Paramètres : dt = secondes écoulées ; vitesse = vitesse de l'eau
     ---------------------------------------------------------- */
  mettreAJour(dt, vitesse) {
    this.y += vitesse * dt;
    this.angle += this.rotation * dt;
  }

  /* ----------------------------------------------------------
     estSortie()
     Retour : true si la gousse est passée sous l'écran (on peut l'oublier).
     ---------------------------------------------------------- */
  estSortie() {
    return this.y > HAUTEUR_JEU + 40;
  }

  /* ----------------------------------------------------------
     boite()
     But : rectangle de collision, généreux (facile à ramasser).
     Retour : {x, y, l, h}
     ---------------------------------------------------------- */
  boite() {
    return { x: this.x - 14, y: this.y - 14, l: 28, h: 28 };
  }

  /* ----------------------------------------------------------
     dessiner()
     But : dessiner la gousse (une longue courbe sombre, ou dorée),
           avec un contour clair pour bien la voir sur l'eau.
     ---------------------------------------------------------- */
  dessiner() {
    push();
    translate(this.x, this.y);
    rotate(this.angle);
    noFill();
    strokeCap(ROUND);

    if (this.doree) {
      // Halo lumineux qui "pulse" avec le temps (sin de millis()).
      const pulse = 0.5 + 0.5 * Math.sin(millis() / 180);
      noStroke();
      fill(255, 215, 0, 50 + 40 * pulse);
      circle(0, 0, 38 + 6 * pulse);
      noFill();
    }

    // 1) contour clair (dessiné en premier, plus épais)
    stroke(255, 255, 255, 200);
    strokeWeight(8);
    bezier(0, -16, 9, -6, -9, 6, 0, 16);
    // 2) la gousse elle-même, par-dessus
    stroke(this.doree ? COULEURS.gousseDoree : COULEURS.gousse);
    strokeWeight(5);
    bezier(0, -16, 9, -6, -9, 6, 0, 16);
    // 3) petite queue à une extrémité
    strokeWeight(2);
    line(0, -16, 2, -21);
    pop();
  }
}