Salut tout le monde,
Je m'entraîne actuellement aux objets et je bute sur un problème dont je n'arrive pas à trouver la cause. J'essaie de créer plusieurs instances d'un objets avec une boucle for, le sketch s'exécute bien, mais il ne semble pas prendre en compte ma condition de sortie et s'exécute indéfiniment. J'ai essayé en remplaçant la boucle for par une boucle if mais le problème n'est pas totalement résolu.
Quelqu'un aurait-il une idée sur l'origine du problème?
Par avance merci,
Ars Robota
Hors ligne
Salut,
Quelle est exactement ta condition de sortie ?
Hors ligne
Ça ne pourrait pas être un nom de variable utilisé deux fois ? Genre dans la création des objets ?
Hors ligne
Pouvons nous voir le code en question ? Cela serait plus parlant
Hors ligne
Salut les gars et merci de vos réponses,
C'est bizarre, j'avais joint le fichier pde mais il n'apparaît pas... Je vous met le code:
Pollen myPollen=new Pollen(3); void setup() { size(300,300); background(255); smooth(); } void draw() { myPollen.spread(); myPollen.display(); } class Pollen { int i; float a; float j; float s; float xoff; float grayCol; int nbr; Pollen(int tempNbr) { xoff=0.0; i=0; nbr=tempNbr; } void spread() { for(i=0;i<nbr;i++) { j=noise(xoff)*height; s=random(2, 20); grayCol=noise(xoff)*255; xoff+=0.1; a+=width/30; } // if(i<5) { // s=random(5, 30); // grayCol=noise(xoff)*255; // j=noise(xoff)*height; // xoff+=0.1; // a+=width/5; // i++; // } } void display() { noStroke(); fill(grayCol, grayCol*2); ellipse(a, j, s, s); float wh=s*1.5; stroke(0); noFill(); stroke(grayCol, grayCol*2); ellipse(a, j, wh, wh); } }
Merci!
Hors ligne
Si tu mets println(i); dans la boucle tu verras que la boucle recommence sans cesse.
Ta boucle draw() est exécutée en boucle.
Pollen myPollen=new Pollen(3); int exec = 0; void setup() { size(300,300); background(255); smooth(); } void draw() { if (exec<1) { myPollen.spread(); myPollen.display(); exec=1; } } class Pollen { int i; float a; float j; float s; float xoff; float grayCol; int nbr; Pollen(int tempNbr) { xoff=0.0; i=0; nbr=tempNbr; } void spread() { for(i=0;i<nbr;i++) { j=noise(xoff)*height; s=random(2, 20); grayCol=noise(xoff)*255; xoff+=0.1; a+=width/30; println(i); } // if(i<5) { // s=random(5, 30); // grayCol=noise(xoff)*255; // j=noise(xoff)*height; // xoff+=0.1; // a+=width/5; // i++; // } } void display() { noStroke(); fill(grayCol, grayCol*2); ellipse(a, j, s, s); float wh=s*1.5; stroke(0); noFill(); stroke(grayCol, grayCol*2); ellipse(a, j, wh, wh); } }
La condition "exec" permet de ne faire le dessin qu'une fois. Je ne sais pas si c'est ce que tu cherchais à faire...
Dernière modification par pob (2010-07-30 11:48:36)
Hors ligne
Salut pob et merci du tuyau.
Effectivement, c'est ce que je cherche à faire; il me semblait bien que draw() allait exécuter ma boucle en continu, j'ai donc essayé en appelant la fonction spread() dans setup(): plusieurs instances de mon objet ont bien été créées mais elles se trouvaient toutes aux même coordonnées.
Deuxième petite question: sachant tout ça, j'essaie d'automatiser la boucle if(exec<myPollen.length) mais p5 me renvoie un message d'erreur "myPollen.length cannot be resolved or is not a field"...
Pollen myPollen=new Pollen(5); int exec=0; void setup() { size(300,300); background(255); smooth(); } void draw() { if(exec<myPollen.length) { myPollen.spread(); myPollen.display(); exec++; } } class Pollen { int i; float a; float j; float s; float xoff; float grayCol; int nbr; Pollen(int tempNbr) { xoff=0.0; i=0; nbr=tempNbr; } void spread() { for(i=0;i<nbr;i++) { j=noise(xoff)*height; s=random(2, 20); grayCol=noise(xoff)*255; xoff+=0.1; a+=width/30; } // if(i<5) { // s=random(5, 30); // grayCol=noise(xoff)*255; // j=noise(xoff)*height; // xoff+=0.1; // a+=width/5; // i++; // } } void display() { noStroke(); fill(grayCol, grayCol*2); ellipse(a, j, s, s); float wh=s*1.5; stroke(0); noFill(); stroke(grayCol, grayCol*2); ellipse(a, j, wh, wh); } }
Dernière modification par Ars Robota (2010-07-30 12:29:30)
Hors ligne
Il faut juste déplacer ton appel pour display() dans la boucle de spread() et tu auras tes trois points, sinon tu as juste un seul point vu qu'il n'y a pas de boucle dans display() et que ça n'affiche que le premier point dans ce cas.
Pollen myPollen=new Pollen(3); int exec = 0; void setup() { size(300,300); background(255); smooth(); } void draw() { if (exec<1) { myPollen.spread(); exec=1; } } class Pollen { int i; float a; float j; float s; float xoff; float grayCol; int nbr; Pollen(int tempNbr) { xoff=0.0; i=0; nbr=tempNbr; } void spread() { for(i=0;i<nbr;i++) { j=noise(xoff)*height; s=random(2, 20); grayCol=noise(xoff)*255; xoff+=0.1; a+=width/30; myPollen.display(); println(i); println(j); println(s); } // if(i<5) { // s=random(5, 30); // grayCol=noise(xoff)*255; // j=noise(xoff)*height; // xoff+=0.1; // a+=width/5; // i++; // } } void display() { noStroke(); fill(grayCol, grayCol*2); ellipse(a, j, s, s); float wh=s*1.5; stroke(0); noFill(); stroke(grayCol, grayCol*2); ellipse(a, j, wh, wh); } }
Sinon tu peux sortir ta boucle de spread pour la mettre dans draw().
Dernière modification par pob (2010-07-30 13:54:12)
Hors ligne
il y a quelques réflexes de vvvv-istes quand même
@Ars : tu ne peux effectivement pas appeller if(exec<myPollen.length)
car length est un attribut de tableau -> int[] par exemple
Je te rappelle vite fait le paradigme de p5:
ta fonction setup() exécutée une seule fois au début de l'exécution
puis ta fonction draw() qui est elle-même une boucle exécutée suivant le frameRate initialisé dans la fonction setup()
Bon courage
Hors ligne
@pob: Super, c'est exactement ce qu'il me faut! Je vais étudier ça de plus près (histoire de capter pourquoi ça fonctionne). Saint-Cloud very moche!
@22_:
citation :
il y a quelques réflexes de vvvv-istes quand même
aaargh... Damned, je suis démasqué!
citation :
length est un attribut de tableau
C'est pourtant vrai, j'avais oublié ça.
Merci pour toutes ces précisions, gentlemen.
aR
Hors ligne
Salut,
Maintenant que j'arrive à dessiner mes objets, je voudrai les faire bouger selon un genre de champ vectoriel simple. Problème: je ne sais pas où placer l'animation de noise(), vu que l'ensemble des objets n'est dessiné qu'une fois dans draw() grâce à l'utilisation d'un compteur exec...
Quelqu'un pourrait-il m'aider?
Merci beaucoup
Ars Robota
Hors ligne
Tu peux peut-être sortir la fonction qui dessine et lui intégrer sa boucle à elle pour la séparer de celle qui détermine les paramètres.
A ce moment le dessin peut être fait à chaque cycle et sera modifié par ta fonction de champ...
Dernière modification par pob (2010-07-31 15:47:42)
Hors ligne
Oui mais c'est ce que j'ai essayé de faire au départ mais, du coup, ma fonction de dessin tourne indéfiniment... Résultat: j'ai 100 instances qui s'affichent bien et une infinité d'objets mal positionnés.
Ou alors, je met n=n+d sans boucle dans draw() ?
Hors ligne
Avec background() tu peux effacer avant de redessiner.
Et exec ne servait qu'à placer les éléments. Si tu veux les animer, il faut mettre à jour leur position, donc on laisse tomber cette condition.
Tu peux mettre un delay(100) dans ta boucle pour laisser le temps de voir les grains que tu dessines.
Pour les histoires de boucles, dans ce cas il aurait fallu créer un matrice pour stocker toutes les coordonnées et les passer de la routine de détermination des positions à celle d'affichage. Mais ça marche tout aussi bien à ce moment de revenir à la version où on appelle display() depuis spread().
Je regarderai ça un peu mieux demain. Il est tard...
Hors ligne
ah oui, j'oublais background()... Merci du rappel!
Hors ligne