Annonce

>>> Bienvenue sur codelab! >>> Première visite ? >>> quelques mots sur codelab //// une carte des membres//// (apéros) codelab


#1 2015-08-06 16:24:09 Problème de changement de fond

PHIFO
membre
Date d'inscription: 2014-04-27
Messages: 91

Problème de changement de fond



Bonjour,
   j'ai développé ce petit logiciel qui me sert pour dessiner avec la souris. Le but est de travailler en fonction d'une musique qui passe soit sur tv soit sur mapping.
   Je fais varier la couleur, l'épaisseur et la position du trait.
   J'aimerais faire changer aussi la couleur du fond.

   Le problème c'est que je ne peux agir au niveau du background car il est dans le setup.
   Dans le draw j'ai mis un rectangle de fond qui lui peut changer effectivement de couleur, mais le problème c'est que comme il se réaffiche à chaque fois je perds les tracés précédents alors que c'est ça qui fait le dessin. Si je met le background dans le draw j'ai bien sur toujours le même problème

  J'ai essayé diverses solutions mais elles n'ont jamais été positives.
  Je pense que ça doit être possible, si quelqu'un peut me donner la solution je le remercie d'avance



//variable d'épaisseur trait
float ep =0.2;

//variable de position
float x; float y;

//variables couleurs
float r=0; float g=0; float bl=0;

//variable fond
float fd1=255; float fd2=255; float fd3=255;

void setup()
{ background(255);
  size(1280, 720);
  smooth();

}

void draw() {
 
    //RECTANGLE FOND
    //translate(0,0);
    //noStroke();
    //fill(fd1,fd2,fd3);
    //rect(0,0,1280,720);
 
 
  //COMMANDE BOUTON GAUCHE - POSITION
   if (mouseButton==RIGHT){
     x = pmouseX;
     y = pmouseY;
   }


// COMMANDE DU BOUTON GAUCHE - AFFICHAGE TRAIT

  if(mouseButton==LEFT)
  {
   stroke(r,g,bl);
   strokeWeight(ep);
  }
else
  {
    noFill();
    noStroke();
  }
  line( mouseX, mouseY, x, y);
 
// SELECTION
  if(keyPressed) {
    switch(key){
     
    // COULEURS DESSIN
    case ('a'): r=255; g=0; bl=0; break;
    case ('z'): r=255; g=255; bl=0; break;
    case ('e'): r=0; g=0; bl=255; break;
    case ('r'): r=0; g=255; bl=0; break;
    case ('t'): r=255; g=3; bl=239; break;
    case ('y'): r=3; g=255; bl=232; break;
    case ('u'): r=255; g=133; bl=3; break;
    case ('i'): r=17; g=211; bl=4; break;
    case ('o'): r=211; g=2; bl=138; break;
    case ('q'): r=255; g=255; bl=255; break;
    case ('s'): r=0; g=0; bl=0; break;
   
    // EPAISSEUR
    case ('1'): ep=0.2; break;
    case ('2'): ep=0.4; break;
    case ('3'): ep=0.6; break;
    case ('4'): ep=1; break;
    case ('5'): ep=1.5; break;
    case ('6'): ep=2; break;
   
    //COULEUR FOND
    case ('<'): fd1 =255; fd2 =0; fd3 =0; break;
    case ('w'): fd1 =255; fd2 =255; fd3 =0; break;
    case ('x'): fd1 =0; fd2 =0; fd3 =255; break;
    case ('c'): fd1 =0; fd2 =255; fd3 =0; break;
   
    }
  }

}

Hors ligne

 

#2 2015-08-06 17:46:51 Re : Problème de changement de fond

Mushussu
membre
Lieu: Orléans
Date d'inscription: 2012-05-24
Messages: 802

Re: Problème de changement de fond



Bonjour,

L'astuce est de passer par le dessin en offline dans un PGraphics et de l'afficher par la suite :

Hors ligne

 

#3 2015-08-06 22:18:01 Re : Problème de changement de fond

PHIFO
membre
Date d'inscription: 2014-04-27
Messages: 91

Re: Problème de changement de fond



Je n'avais jamais bien compris à quoi servait le PGraphics. Je viens de repotasser  ça.

  Mais il y a deux précisions que je voudrais avoir:

Est-on obligé de mettre un background dans le setup puisqu'on en met un au début du draw?

Grossièrement ça fonctionne comme si on dessinait sur des "fenetres" transparentes  qui se superposent les unes sur les autres donnant le dessin alors que le background reste au fond?

  Je vais tester ça demain sur un autre petit programme pour voir si j'ai bien compris.

Merci Mushussu

Hors ligne

 

#4 2015-08-07 00:45:45 Re : Problème de changement de fond

Mushussu
membre
Lieu: Orléans
Date d'inscription: 2012-05-24
Messages: 802

Re: Problème de changement de fond



Bonsoir,

Bien sûr tu peux enlever le background du setup.

En fait c'est dans une seule fenêtre que les lignes sont inscrites au fur et à mesure. Tant que la fenêtre est active et non recouverte, les éléments précédemment affichés restent visibles.

Hors ligne

 

#5 2015-08-08 17:32:03 Re : Problème de changement de fond

PHIFO
membre
Date d'inscription: 2014-04-27
Messages: 91

Re: Problème de changement de fond



Super j'ai fait un autre programme en utilisant PGraphics et ça m'a permis de comprendre son fonctionnement qui est simple finalement.

   J'ai modifié pour qu'en tapant une touche le programme se lance. Je l'ai appelé "LM". Le but est d'appeler plusieurs microprogramme que se superposent au niveau du dessin.

   Dans le draw j'ai placé la commande   
   if(keyPressed){
    switch(key){
    case ('l'): LM(); break;
  }
  }

pour appeler  le programme , cela fonctionne avec deux restrictions:
1°) je suis obligé de maintenir la touche l pour faire fonctionner
2°) les changements d'epaisseur, de couleurs et de fonds ne sont pas actifs.

  //variable d'épaisseur trait
float ep =0.2;

//variable de position
float x;
float y;

//variables couleurs
float r=0;
float g=0;
float bl=0;

//variable fond
float fd1=255;
float fd2=255;
float fd3=255;
PGraphics fenetre;

void setup()
{
  background(255);
  size(1280, 720);
  smooth();
  fenetre = createGraphics(width, height);
}

void draw() {
   background(fd1, fd2, fd3);
  if(keyPressed){
    switch(key){
    case ('l'): LM(); break;
  }
  }
   
}

void LM() {
 
  //COMMANDE BOUTON GAUCHE - POSITION
  if (mouseButton==RIGHT) {
    x = pmouseX;
    y = pmouseY;
  }
 
  // COMMANDE DU BOUTON GAUCHE - AFFICHAGE TRAIT
  fenetre.beginDraw();
  if (mouseButton==LEFT) {
    fenetre.stroke(r, g, bl);
    fenetre.strokeWeight(ep);
  } else {
    fenetre.noFill();
    fenetre.noStroke();
  }   
  fenetre.line( mouseX, mouseY, x, y);
  fenetre.endDraw();
  image(fenetre, 0, 0);
 
  // SELECTION
  if (keyPressed) {
    switch(key) {

      // COULEURS DESSIN
      case ('a'): r=255; g=0; bl=0; break;
      case ('z'): r=255; g=255;  bl=0; break;
      case ('e'): r=0; g=0; bl=255; break;
      case ('r'): r=0; g=255; bl=0; break;
      case ('t'): r=255; g=3; bl=239; break;
      case ('y'): r=3; g=255; bl=232; break;
      case ('u'): r=255; g=133; bl=3; break;
      case ('i'): r=17; g=211; bl=4; break;
      case ('o'): r=211; g=2; bl=138; break;
      case ('q'): r=255; g=255; bl=255; break;
      case ('s'): r=0; g=0; bl=0; break;

      // EPAISSEUR
      case ('1'): ep=0.2; break;
      case ('2'): ep=0.4; break;
      case ('3'): ep=0.6; break;
      case ('4'): ep=1; break;
      case ('5'): ep=1.5; break;
      case ('6'): ep=2; break;

      //COULEUR FOND
      case ('<'): fd1 =255; fd2 =0; fd3 =0; break;
      case ('w'): fd1 =255; fd2 =255; fd3 =0; break;
      case ('x'): fd1 =0; fd2 =0; fd3 =255; break;
      case ('c'): fd1 =0; fd2 =255; fd3 =0; break;
    }
  }
}

Hors ligne

 

#6 2015-08-09 01:27:09 Re : Problème de changement de fond

Mushussu
membre
Lieu: Orléans
Date d'inscription: 2012-05-24
Messages: 802

Re: Problème de changement de fond



Pour cela, il faut introduire une variable globale programme et modifier le code comme cela :

void draw() {
   background(fd1, fd2, fd3);
    switch(programme){
    case ('l'): LM(); break;
  } 
}

void keyPressed() {
  if ((key == 'l') || (key == 'm')) {
    programme = key;
  }
}

Hors ligne

 

#7 2015-08-09 15:40:59 Re : Problème de changement de fond

PHIFO
membre
Date d'inscription: 2014-04-27
Messages: 91

Re: Problème de changement de fond



Merci Mushussu ,
     
     Je me doutais qu'il fallait passer par une variable mais je ne voyait pas comment

   Pour déclarer une variable globale faut-il obligatoirement lui donner la valeur  1?
int programme =1;

    Par contre sur le fonctionnement du void keyPressed():

   si j'appuie sur  "l" la variable programme devient "l" et donc LM() est appelé
   si j'appuie sur "m" la variable programme  ne correspond plus au clavier et donc LM() est stopé.

   c'est bien de cette façon qu'on peux expliquer son fonctionnement?

Hors ligne

 

#8 2015-08-09 15:45:44 Re : Problème de changement de fond

Mushussu
membre
Lieu: Orléans
Date d'inscription: 2012-05-24
Messages: 802

Re: Problème de changement de fond



Non, tu peux déclarer juste la variable, mais elle est dans un état indéfini.
Si tu as besoin de l'initialiser, je préfère le faire dans le void setup().

J'ai ajouté 'm' pour te montrer que tu peux peux enchaîner la liste de caractères qui vont correspondre à tes sous-programme.

Hors ligne

 

#9 2015-08-09 16:44:31 Re : Problème de changement de fond

PHIFO
membre
Date d'inscription: 2014-04-27
Messages: 91

Re: Problème de changement de fond



Mais si je ne l'initialise pas  j'ai le message"cannot find anything named "programme". C'est pour cela que je l'ai initialisé.

   Ok pour 'm' pour me montrer  les sous programmes, mais tel que c'est je peux l'utiliser aussi comme un marche arrêt.

Hors ligne

 

#10 2015-08-09 18:06:32 Re : Problème de changement de fond

Mushussu
membre
Lieu: Orléans
Date d'inscription: 2012-05-24
Messages: 802

Re: Problème de changement de fond



Question de vocabulaire.
Avec cette instruction, je déclare une variable :

int programme;

Plus tard, je l'initialise. Couramment je le fais dans le void setup()

Avec cette instruction je déclare ET j'initialise une variable :

int programme = 1;

Dans le post précédent j'indiquais qu'il fallait déclarer une variable globale.

Hors ligne

 

#11 2015-08-09 22:37:01 Re : Problème de changement de fond

PHIFO
membre
Date d'inscription: 2014-04-27
Messages: 91

Re: Problème de changement de fond



Je voulais dire effectivement qu'en plus de la déclarer il fallait que je l'initialise  pour que ça fonctionne. Je me suis mal exprimé.

   Quel est l'intérêt de l'initialiser dans le setup().

   Par contre j'ai un peu de mal avec cette notion de variable globale.

Hors ligne

 

#12 2015-08-12 12:06:57 Re : Problème de changement de fond

Mushussu
membre
Lieu: Orléans
Date d'inscription: 2012-05-24
Messages: 802

Re: Problème de changement de fond



Personnellement, initialiser une variable globale dans void setup(); permet d'organiser mieux son code de le rendre plus lisible.

Pour les variables globales, je t'invite à regarder ici :
https://fr.wikipedia.org/wiki/Variable_globale

Hors ligne

 

#13 2015-08-13 07:11:42 Re : Problème de changement de fond

PHIFO
membre
Date d'inscription: 2014-04-27
Messages: 91

Re: Problème de changement de fond



ok merci

Hors ligne

 

fil rss de cette discussion : rss

Pied de page des forums

Powered by FluxBB

codelab, graphisme & code : emoc / 2008-2024