Fragmentations

De Centre de Ressources Numériques - Labomedia
Révision de 20 septembre 2013 à 12:18 par Olivier (discussion | contributions)

(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)
Aller à : navigation, rechercher

Petit sketch Processing à base de carrés qui se déplacent et de rollover.

Visible ici via OpenProcessing.

Fragmentations-processing.png


// Copyright 2013 - Olivier Baudu.
// Publié sous termes de la licence publique GPL v3.0.

Cluster[] clusters;
int taillePuce, tailleParcours, nbClusters, nbPuce;
int bord, nbCLusterParLigne, nbLignes;

void setup() {

  taillePuce =10;
  nbPuce = 10;
  bord = 1;
  tailleParcours = 50;
  nbLignes = 8;  
  nbCLusterParLigne = 4;
  
  nbClusters = nbCLusterParLigne * nbLignes;
  noStroke();

  size(nbCLusterParLigne*(taillePuce+bord)*nbPuce, nbLignes*(tailleParcours+taillePuce+bord));

  clusters = new Cluster[nbClusters];
  for (int i=0; i<clusters.length; i++) {
    clusters[i] = new Cluster(i%nbCLusterParLigne, i/nbCLusterParLigne);
  }
}

void draw() {
  background(0);

  for (int i=0; i < clusters.length; i++) {
    clusters[i].dessine();
  }
}

class Cluster {

  int initIA, decalage;
  Puce[] puces;

  Cluster (int posX, int posY) {

    puces = new Puce[nbPuce];
    initIA = 0;
    decalage = int(random(20));

    for (int i=0; i<puces.length; i++) {
      puces[i] = new Puce(i*(taillePuce+bord) + posX*(nbPuce*(taillePuce+bord)) + 1, 
      (tailleParcours + taillePuce + bord)*posY + 1);
    }
  }

  void dessine() {

    actionIA();

    for (int i=0; i < puces.length; i++) {
      puces[i].dessine();
    }
  }

  void actionIA() { 

    if (frameCount%(nbPuce+500+decalage) == 1) {
      initIA = 0;
    }
    if (frameCount%int(random(nbPuce*2)+1) == 0) {
      if (initIA >=0 && initIA < nbPuce) {
        puces[initIA].choixIA = true;
      }
      initIA++;
    }
  }
}

class Puce {

  int x, y, initX, initY;
  int vitesse, direction;
  boolean testAction, posHaut, choixIA;

  Puce (int posX, int posY) {

    initX = posX;
    initY = posY;
    x = posX;
    y = posY;

    direction = 1;
    vitesse = 2;
    testAction = false;
    posHaut = true;
    choixIA = false;
  }

  void dessine() {
    testRollOver(x, y);
    deplace();
    rect(x, y, taillePuce, taillePuce);
  }

  void deplace() {
    if (testAction) {

      if (posHaut && y <= initY+tailleParcours+vitesse  ) {
        direction = 1;
        if (y == initY+tailleParcours+vitesse) {
          posHaut = false;
          testAction = false;
          choixIA = false;
        }
      }
      if (!posHaut && y >= initY+vitesse  ) {
        direction = -1;
        if (y == (initY+vitesse)) {
          posHaut = true;
          testAction = false;
          choixIA = false;
        }
      }
      y += direction*vitesse;
    }
  }

  void testRollOver(int posX, int posY) {

    if (mouseX >= posX && mouseX <= posX+taillePuce && 
      mouseY >= posY && mouseY <= posY+taillePuce && 
      testAction == false || choixIA) {
      testAction = true;
    }
  }
}