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
Bonjour,
L'astuce est de passer par le dessin en offline dans un PGraphics et de l'afficher par la suite :
Hors ligne
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
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
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
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
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
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
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
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
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
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
ok merci
Hors ligne