Je débute sur prosessing. Et déjà une question : si j'ai bien compris, seule la fonction draw() permet de redessiner ? Donc :
- est-ce qu'il y a une autre fonction pour rafraichir l'écran, par exemple quand on est dans une autre fonction qui doit afficher des formes, mais sans repasser par draw() ?
- ou bien sinon, est-ce que l'on peut aller d'un sketch à un autre ?
Dans mon programme, j'ai en effet un premier choix pour le style d'animation (des cercles ou bien des lignes ou autre chose), et ensuite je boucle sur cette animation (qui est interactive avec la souris). Quelle serait la structure à faire ? (sinon j'ai bien l'idée de tout faire dans draw(), mais usine à gaz si je ne peux pas programmer les types d'animations dans une fonction propre à chaque fois).
Merci de votre aide.
Julien
Hors ligne
Ton draw() va rafraichir 60x par seconde.
Ce que tu peux faire tu créer tes deux fonctions à part.
Puis tu mets ta condition dans le draw().
void animation1(){ tatata } void animation2(){ tututu } void draw(){ if(choix){ animation1(); }else animation2(); }
Expliquer du code n'est pas aisé, n'hésites pas à le poster.
Hors ligne
Je suis effectivement parti sur une telle structure de code : mais si je reste dans animation1, rien n'est rafraichit à l'écran, tant que je ne repasse pas par Draw() (enfin il me semble). Donc on peut "écrire sur l'écran" dans animation1, mais comment voir ces changements à l'écran (sans sortir de animation1) ?
void animation1(){
ICI on boucle sur les touches pressées pour changer l'image
{
on affiche des formes, en fonction de la position de la souris
}
// RIEN ne se passe à l'écran.
}
void animation2(){
ICI on boucle sur les touches pressées pour changer l'image
{
on affiche d'AUTRES formes, en fonction de la position de la souris et d'autres actions
}
// RIEN ne se passe à l'écran.
}
void draw(){
if(choix){
animation1();
}else animation2();
}
Et si pas possible, peut-on enchainer, depuis un sketch vers un autre ? ce qui permettrait de structurer le code). Sinon, faut-il construire le code pour toujours repasser par draw() pour mettre à jour l'écran ?
Hors ligne
Oui, il faut que tu structure ton code pour passer chaque fois par le draw.
On le fait par soucis de lisibilité et par aspect pratique.
Rien ne t'empêche de mettre le résultat de ton choix dans une variable et de switcher dans le draw vers
l'animation choisie.
Ce que tu veux faire ne fait penser à l'exemple 9-04 du processing book.
Que tu peux installer facilement avec la nouvelle interface de Processing 3.
Je peux encore t'aider toute cette soirée.
Hors ligne
Merci de ton aide.
Je me suis orienté effectivement vers la solution avec une variable contenant le type d'animation, puis dans chaque fonction draw(), keyPressed(), mousePressed(), je refais un aiguillage vers les bonnes règles d'animation en fonction du type d'animation.
Je suis cependant sous processing 2 car j'utilise une kinect, et la lib simpleOpenNI ne marche pas encore sous Pro 3.0.
Merci encore pour l'aide.
Hors ligne
Je serais curieux de voir ton code car selon ce que tu dis il aurait moyen de le simplifier
en mettant tes évenements hors du draw().
Sinon j'ai trouvé ça pour Passer à P3 http://www.instructables.com/id/Easy-co … essing-30/
avec une kinect. Tu as à y gagner point de vue performance et pour le futur de ton projet.
Hors ligne
Voici à titre d'info le code source. Pas de très haut niveau, mais je suis preneur de conseils sur la structuration, rapport à la question initiale.
Je mets tout le code, un peu long mais au moins il y a tout !
Hors ligne
Ok, aujourd'hui j'ai pas le temps mais je regarde demain fin d'après-midi.
Hors ligne
Ne possédans pas de kinect, je ne peux compiler ton code
mais voici quelques petites modifications à apporter après lecture:
Il vaudrait mieux dans tes fonctions ne plus intitialiser
tes PVector, fait le une fois pour toutes au début de ton programme
et utilise la fonction .set() pour leur assigner une valeur
On utilise le switch quand il y beaucoup d'élements à vérifier
au lieu de
switch(e) { case 1: angle=angle-(PI/90); break; case -1: angle=angle+(PI/90); break; }
il suffit de mettre
if(e==1) angles -= PI/90; else if(e==-1) angle += PI/90; //ou encore mieux toujours dans l'optique de faire le moins de test possible else angle += PI/90;
dans ta fonction action_corps()
il faudrait simplifier les conditions en mieux les hiérarchisant
par example au lieu de :
if ( (positionBrasGauche>4)&&(angleBrasGauche>25)&&(angleBrasGauche<70) ) { rayon+=5; if (rayon>=700) rayon = 700 ; } if ( (positionBrasGauche<-3)&&(angleBrasGauche>25)&&(angleBrasGauche<70)) { rayon-=5; if (rayon<10) rayon = 10 ; } //utilise : if ((angleBrasGauche>25)&&(angleBrasGauche<70)){ if(positionBrasGauche>4) rayon = min(rayon+5, 700); else if(positionBrasGauche<-3) rayon = max(rayon-5, 10); }
et n'oublie pas d'utilser des else et else if, ainsi si la condition est bonne il saute toutes les autres conditons. Dans ton code il les vérifie toutes ce qui le ralentit.
Il y a un gros travail à faire à ce niveau
supprimer les 4 conditons ligne 390 et suivante, à la place ligne 387 et 388 :
posX = constrain((jointPosMainDroite.x ... etc), 0, width);
à partir de la ligne 422 : tu peux remplacer tous les x=x+ par x+=, etc
Voilà pour un débutant, ne n'est pas mal du tout
Hors ligne
Merci pour tous ces conseils, c'est sympa de prendre du temps pour cela. Je vais nettoyer tout ceci.
Si tout marche bien, je posterais un message sur cette question si on fait une démo un jour en live !
Hors ligne
Je reviens sur ta proposition de passer en processing 3.0 avec OpenKinect. Si cela semble fonctionner avec processing 3, pour faire de la détection de squelette, il faut la lib KinectPV2, qui ne marche elle qu'avec la kinect Microsoft V2... que je n'ai pas, et qui est plus du triple à l'achat...
Me trompe-je ?
Hors ligne
Selon ce lien ça fonctionne avec toutes les kinects : http://www.instructables.com/id/Easy-co … -ejemplos/
Ca vaudrait le coup d'essayer
Hors ligne
C'est bien ce lien que j'ai suivi (dans notre autre sujet), mais ensuite pour faire de la détection de squelette, il faut une autre lib, qui elle est uniquement sous microsoft kinect V2.
Hors ligne