Bonjour,
Je cherche à modifier un programme afin que lorsque que je change la couleur des confettis, ceux crées avant le changement gardent leurs couleurs initiales et que seuls ceux crées après le changement aient les nouvelles couleurs.
Pour afficher les couleurs j'ai crée une liste " pal = {p1,p2,p3,p4,p5,p6} " dans laquelle les variables p1, p2 ....... changent lorsque j’appuie sur les bouton "a" ou "z". Ces variables peuvent elles représenter des code hexadécimaux?
Le premier problème que je rencontre est en ligne 18 où j'ai le message d'erreur " le constructeur "Particle (int,int, int,int, int[]" n'existe pas. Pourtant il est bien déclaré en ligne 2?
ArrayList<Particle> pts;
boolean onPressed;
int p1 = #ff00ff, p2 = #00ffff, p3 = #00ff00,p4 = #7920ff,p5 = #ff3300,p6 = #ffff00;
color[] pal = {p1, p2, p3, p4, p5, p6 };
float dim=1; float diam=40;
void setup() {
size(1280, 720);
frameRate(30);
pts = new ArrayList<Particle>();
}
void draw() {
background(0);
if (onPressed) {
for (int i=0; i<10; i++) {
Particle newP = new Particle(mouseX, mouseY, i+pts.size(), i+pts.size(), pal);
pts.add(newP);
}
}
for (int i=0; i<pts.size (); i++) {
Particle p = pts.get(i);
p.update();
p.display();
}
for (int i=pts.size ()-1; i>-1; i--) {
Particle p = pts.get(i);
if (p.dead) {
pts.remove(i);
}
}
}
void mousePressed() {
onPressed = true;
}
void mouseReleased() {
onPressed = false;
}
class Particle {
color palette;
PVector loc, vel, acc;
int lifeSpan, passedLife;
boolean dead;
float alpha, weight, weightRange, decay, xOffset, yOffset;
int c;
Particle(float x, float y, float _xOffset, float _yOffset,int let ) {
palette =let;
loc = new PVector(x, y);
float randDegrees = random(360);
vel = new PVector(cos(radians(randDegrees)), sin(radians(randDegrees)));
vel.mult(random(5));
acc = new PVector(0, 0);
lifeSpan = int(random(30, 90));
decay = random(0.85, 0.95);
weightRange = random(3, diam);
c = (int) random(pal.length);
xOffset = _xOffset;
yOffset = _yOffset;
}
void update() {
if (passedLife>=lifeSpan) {
dead = true;
} else {
passedLife++;
}
alpha = float(lifeSpan-passedLife)/lifeSpan * 70+50;
// dim = float(lifeSpan-passedLife)/lifeSpan * weightRange;
acc.set(0, 0);
float rn = (noise((loc.x+frameCount+xOffset)*0.01, (loc.y+frameCount+yOffset)*0.01)-0.5)*4*PI;
float mag = noise((loc.y+frameCount)*0.01, (loc.x+frameCount)*0.01);
PVector dir = new PVector(cos(rn), sin(rn));
acc.add(dir);
acc.mult(mag);
float randDegrees = random(360);
PVector randV = new PVector(cos(radians(randDegrees)), sin(radians(randDegrees)));
randV.mult(0.5);
acc.add(randV);
vel.add(acc);
vel.mult(decay);
vel.limit(3);
loc.add(vel);
}
void display() {
dim = float(lifeSpan-passedLife)/lifeSpan * weightRange;
strokeWeight(dim+1.5+2);
stroke(0,alpha);
point(loc.x, loc.y);
strokeWeight(dim*.5+2);
//stroke(#6FFF00);
stroke(pal[c]);
if(keyCode==38){
diam +=0.002;
}
if(keyCode==40){
diam -=0.002;
}
if (keyPressed=true) {
switch(key) {
case ('a'): p1 = #ff00ff;p2 = #00ffff;p3 = #00ff00;p4 = #7920FF;p5 = #FF3300;p6 = #ffff00 ; break;
case ('z'): p1 = #ff00ff;p2 = #00ffff;p3 = #00ff00;p4 = #7920FF;p5 = #FF3300;p6 = #ffff00 ; break;
}
}
point(loc.x, loc.y);
}
}
Il me semble que le constructeur est bien déclaré?
Merci d'avance
Hors ligne
Dans ta class, Particle est déclaré de la sorte :
Particle(float x, float y, float _xOffset, float _yOffset,int let )
Alors que toi, tu l'initialises avec pal comme 5ème argument qui n'est pas un int mais un int[] (un tableau avec tes 6 valeurs, p1, p2...).
Je n'ai pas le temps de regarder le code pour résoudre ton pb, mais cela te permettra peut-être d'avancer.
Par ailleurs, ligne 2, ce n'est Particle que tu déclares, mais pts, qui est un ArrayList qui peut accueillir des Particle.
Bon courage.
Hors ligne
Ok j'ai pu corriger grâce à tes indications
sur la ligne 51 Particle(float x, float y, float _xOffset, float _yOffset,int let[])
afin que le constructeur déclaré soit du même format que la Particle de la ligne 18 (je m'exprime mal peut-être).
sur la ligne 52 j'ai déclaré
palette =let[c];
je n'ai plus de message d'erreur et ça fonctionne.....
sauf que lorsque je tape sur "a" ou "z" je n'ai pas de changement de couleur.
Je vais réfléchir à ça
Hors ligne
C'est bon tout est solutionné, ce n'est pas évident lorsqu'on démarre sur la programmation objet de faire varier les classes mais entre les indications données et les messages d'erreur de Processing on y arrive.
Processing3 est un plus à ce niveau là et aide bien à comprendre les erreurs.
Merci pour le coup de main
Philippe
Hors ligne
Bonjour,
Quand on trouve une solution par ses propres moyens, ce qui est souvent le cas, il est bon dans un forum de publier le résultat. Nous ne t'aidons pas seulement toi, mais tout ceux qui en cherchant leur problème consulteront cette page.
Je te propose une solution :
ArrayList<Particle> pts; boolean onPressed; color[] pal = { #ff00ff, #00ffff, #00ff00, #7920ff, #ff3300, #ffff00 }; float dim=1; float diam=40; void setup() { size(1280, 720); frameRate(30); pts = new ArrayList<Particle>(); } void draw() { background(0); if (onPressed) { for (int i=0; i<10; i++) { Particle newP = new Particle(mouseX, mouseY, i+pts.size(), i+pts.size(), pal[(int) random(pal.length)]); pts.add(newP); } } for (int i=0; i<pts.size (); i++) { Particle p = pts.get(i); p.update(); p.display(); } for (int i=pts.size ()-1; i>-1; i--) { Particle p = pts.get(i); if (p.dead) { pts.remove(i); } } } void mousePressed() { onPressed = true; } void mouseReleased() { onPressed = false; } void keyPressed() { switch(key) { case ('a'): pal[0] = #ff0000; pal[1] = #ff3300; pal[2] = #ff6600; pal[3] = #ff9900; pal[4] = #ffcc00; pal[5] = #ffff00 ; break; case ('z'): pal[0] = #00ff00; pal[1] = #00ff33; pal[2] = #00ff66; pal[3] = #00ff99; pal[4] = #00ffcc; pal[5] = #00ffff ; break; } } class Particle { color palette; PVector loc, vel, acc; int lifeSpan, passedLife; boolean dead; float alpha, weight, weightRange, decay, xOffset, yOffset; Particle(float x, float y, float _xOffset, float _yOffset, int let) { loc = new PVector(x, y); float randDegrees = random(360); vel = new PVector(cos(radians(randDegrees)), sin(radians(randDegrees))); vel.mult(random(5)); acc = new PVector(0, 0); lifeSpan = int(random(30, 90)); decay = random(0.85, 0.95); weightRange = random(3, diam); palette =let; xOffset = _xOffset; yOffset = _yOffset; } void update() { if (passedLife>=lifeSpan) { dead = true; } else { passedLife++; } alpha = float(lifeSpan-passedLife)/lifeSpan * 70+50; // dim = float(lifeSpan-passedLife)/lifeSpan * weightRange; acc.set(0, 0); float rn = (noise((loc.x+frameCount+xOffset)*0.01, (loc.y+frameCount+yOffset)*0.01)-0.5)*4*PI; float mag = noise((loc.y+frameCount)*0.01, (loc.x+frameCount)*0.01); PVector dir = new PVector(cos(rn), sin(rn)); acc.add(dir); acc.mult(mag); float randDegrees = random(360); PVector randV = new PVector(cos(radians(randDegrees)), sin(radians(randDegrees))); randV.mult(0.5); acc.add(randV); vel.add(acc); vel.mult(decay); vel.limit(3); loc.add(vel); } void display() { dim = float(lifeSpan-passedLife)/lifeSpan * weightRange; strokeWeight(dim+1.5+2); stroke(0, alpha); point(loc.x, loc.y); strokeWeight(dim*.5+2); //stroke(#6FFF00); stroke(palette); point(loc.x, loc.y); } }
Il faut que tu fasses attention à ne pas "croiser les effluves", c'est-à-dire ne pas utiliser des variables globales dans les classes.
Hors ligne
Ok pas de problème , je ne connais pas les usages mais je le fais volontiers bien que je ne pense pas être d'un grand secoure vu mon niveau.
Voici donc comment j'ai résolu le problème après quelques heures de travail......
Il me reste à résoudre le problème des flèches qui n'arrêtent pas la croissance ou la décroissance lorsque je cesse d'appuyer dessus.
ArrayList<Particle> pts;
boolean onPressed;
color[] pal = { #ff00ff, #00ffff, #00ff00, #7920ff, #ff3300, #ffff00};
float dim=1; float diam=40;
color[] pal1 = { #ff00ff, #00ffff, #00ff00, #7920ff, #ff3300, #ffff00};
color[] pal2 = {255,255,255,255,255,255};
color[] pal3 = { #03FFFD, #6B03FF, #FA03FF, #C303FF, #6B03FF, #03FFEC};
color[] pal4 = { #FFDA03, #FAFF03, #FF8E03, #FF1803, #D8FF03, #FF5303};
color[] pal5 = { #0EFF03, #FFEB03, #00E533, #FFC903, #03FF7A, #EAFF4D};
color[] pal6 = { #FF5A08, #FFAD08, #F2476F, #FF0582, #F27F5F, #FCB052};
color[] pal7 = { #FC5257, #F952FC, #DFB2E8, #FF0F03, #E8B7E7, #F0A4FA};
color[] pal8 = { #230427, #C6C2C6, #B6BFED, #CECCCD, #E3E5E4, #EAEAE3};
void setup() {
size(1280, 720);
frameRate(30);
pts = new ArrayList<Particle>();
}
void draw() {
background(0);
if (onPressed) {
for (int i=0; i<10; i++) {
Particle newP = new Particle(mouseX, mouseY, i+pts.size(), i+pts.size(), pal);
pts.add(newP);
}
}
for (int i=0; i<pts.size (); i++) {
Particle p = pts.get(i);
p.update();
p.display();
}
for (int i=pts.size ()-1; i>-1; i--) {
Particle p = pts.get(i);
if (p.dead) {
pts.remove(i);
}
}
}
void mousePressed() {
onPressed = true;
}
void mouseReleased() {
onPressed = false;
}
class Particle {
color[] palette;
PVector loc, vel, acc;
int lifeSpan, passedLife;
boolean dead;
float alpha, weight, weightRange, decay, xOffset, yOffset;
int c;
Particle(float x, float y, float _xOffset, float _yOffset,color[] let) {
palette =let;
loc = new PVector(x, y);
float randDegrees = random(360);
vel = new PVector(cos(radians(randDegrees)), sin(radians(randDegrees)));
vel.mult(random(5));
acc = new PVector(0, 0);
lifeSpan = int(random(30, 90));
decay = random(0.85, 0.95);
weightRange = random(3, diam);
c = (int) random(pal.length);
xOffset = _xOffset;
yOffset = _yOffset;
}
void update() {
if (passedLife>=lifeSpan) {
dead = true;
} else {
passedLife++;
}
alpha = float(lifeSpan-passedLife)/lifeSpan * 70+50;
dim = float(lifeSpan-passedLife)/lifeSpan * weightRange;
acc.set(0, 0);
float rn = (noise((loc.x+frameCount+xOffset)*0.01, (loc.y+frameCount+yOffset)*0.01)-0.5)*4*PI;
float mag = noise((loc.y+frameCount)*0.01, (loc.x+frameCount)*0.01);
PVector dir = new PVector(cos(rn), sin(rn));
acc.add(dir);
acc.mult(mag);
float randDegrees = random(360);
PVector randV = new PVector(cos(radians(randDegrees)), sin(radians(randDegrees)));
randV.mult(0.5);
acc.add(randV);
vel.add(acc);
vel.mult(decay);
vel.limit(3);
loc.add(vel);
}
void display() {
dim = float(lifeSpan-passedLife)/lifeSpan * weightRange;
strokeWeight(dim+1.5+2);
stroke(0,alpha);
point(loc.x, loc.y);
strokeWeight(dim*.5+2);
//stroke(#6FFF00);
stroke(palette[c]);
if(keyCode==38){
diam +=0.01;
}
if(keyCode==40){
diam -=0.01;
}
point(loc.x, loc.y);
}
}
void keyPressed() {
switch(key) {
case ('a'): pal = pal1; break;
case ('z'): pal = pal2; break;
case ('e'): pal = pal3; break;
case ('r'): pal = pal4; break;
case ('t'): pal = pal5; break;
case ('y'): pal = pal6; break;
case ('u'): pal = pal7; break;
case ('i'): pal = pal8; break;
}
}
Hors ligne