Annonce

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


#1 2014-12-08 15:58:40 Premier post, et Fonctions loop/noLoop/redraw

tchilaviek
nouveau membre
Date d'inscription: 2014-12-08
Messages: 4

Premier post, et Fonctions loop/noLoop/redraw



Bonjour à tous

voici mon premier message sur ce forum


j'utilise Processing depuis un an environ, après avoir commencé la programmation sous Pure Data et Arduino

je ne suis pas programmeur ni informaticien, mais musicien, et je m'interesse à Processing pour les applications interactives A/V

j'ai réussi à progresser grâce à differents livres bien connus dans le milieu ("Getting Started with processing", "The Nature of Code", et plus recemment "Generative Art", que je vous conseille vivement)

je suis aujourd'hui bloqué avec un problème concernant les fonctions loop/noLoop/redraw

mon problème est le suivant:
je ne parviens pas à trouver d'autres exemples pour noLoop et redraw, que ceux avec l'activation d'une touche du clavier, ou bien du bouton de la souris

par exemple (utiliser la touche " i " ou " s " pour stopper ou reprendre la boucle draw(),

--------------------------------------------------------------------------------------------------------------------------------------

float x = 0;

void setup() {
  size(200, 200);
  noLoop();
}

void draw() {
  background(204);
  x = x + 5;
  if (x > width) {
    x = 0;
  }
  line(x, 0, x, height);
}

void keyTyped(){
  if (key=='i') {
    loop();
  } else if (key=='s') {
           noLoop();
           redraw();
         } else {
           noLoop();
         }
}

--------------------------------------------------------------------------------------------------------

ma question est de savoir s'il serait possible de capter d'autres evenements par exemple le Mouvement de la souris, en selectionant des valeurs

quelque chose du type:

--------------------------------------------------
float x = 0;
int s = 0;

void setup() {
  size(200, 200);
 
}

void draw() {
 
  background(204);
  x = x + 5;
  if (x > width) {
    x = 0;
  }
  line(x, 0, x, height);
  if (mouseX >10){
    noLoop();
  }
}




---------------------------------------------------

(exemple un peu maladroit parce qu'il faut faire venir le curseur par la gauche de la fenêtre pour que la boucle ne s'arrete pas tout de suite)

je suis déjà parvenu à stopper une boucle en indiquant une valeur "inférieure à", ou supérieure,

mais impossible de relancer la boucle draw après noLoop(), 
(avec un
Else if (mouseX >= 10 {
redraw(); }

)

j'ai l'impression que Processing ne peux plus recevoir de données "dynamiquement" après l'arret de la boucle autrement qu'avec un bouton du clavier ou de la souris

mais je pense bien que je fais erreur


voilà donc ma question,

à la fois sur ce fonctions noloop, loop, redraw
mais également sur la structure du code et les emplacements corrects de If et Else


merci pour vos lumières

Hors ligne

 

#2 2014-12-08 17:50:23 Re : Premier post, et Fonctions loop/noLoop/redraw

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

Re: Premier post, et Fonctions loop/noLoop/redraw



Bonjour,

Pour la gestion avec la souris :

float x = 0;

void setup() {
  size(200, 200);
  rectMode(CENTER);
}

void draw() {
  background(255);
  fill(255, 0, 0);
  rect(width / 2, height / 2, 40, 40);
  x = x + 5;
  if (x > width) {
    x = 0;
  }
  line(x, 0, x, height);
}

void mouseMoved() {
  if ((mouseX > width / 2 - 20) && (mouseX < width / 2 + 20) && 
    (mouseY > height / 2 - 20) && (mouseY < height / 2 + 20)) {
    noLoop();
  } else {
    loop();
  }
}

Avec la méthode noLoop(), la méthode draw() n'est plus appelé, donc ce sont simplement les interruptions qui peuvent interagir. Le clavier et la souris en sont des exemples, mais il pourrait y avoir la réception de données, une nouvelle image vidéo qui arrive …
Si tu souhaites que ton programme tourne encore mais que l'affichage se "gèle" il faut ne pas afficher ta scène :

float x = 0;
boolean temoin;

void setup() {
  size(200, 200);
  rectMode(CENTER);
  temoin = false;
}

void draw() {
  if (!temoin) {
    background(255);
    fill(255, 0, 0);
    rect(width / 2, height / 2, 40, 40);
    x = x + 5;
    if (x > width) {
      x = 0;
    }
    line(x, 0, x, height);
  }
}

void mouseMoved() {
  if ((mouseX > width / 2 - 20) && (mouseX < width / 2 + 20) && 
    (mouseY > height / 2 - 20) && (mouseY < height / 2 + 20)) {
    temoin = true;
  } else {
    temoin = false;
  }
}

Hors ligne

 

#3 2014-12-08 18:48:25 Re : Premier post, et Fonctions loop/noLoop/redraw

tchilaviek
nouveau membre
Date d'inscription: 2014-12-08
Messages: 4

Re: Premier post, et Fonctions loop/noLoop/redraw



merci Mushussu pour ta réponse rapide,
et ta manière de clarifier l'écriture, ça m'en apprend sur la syntaxe des IF et ELSE ainsi que de la boucle draw() et ce qui concerne son "dedans" et son "dehors"

mais justement celà ne repond pas parfaitement à ma question parce que c'est un contrexemple en quelque sorte puisque je vois que mouseMoved() est également une fonction intégrée et reconnue "nativement" par Processing (elle s'affiche en couleur dans le programme), à l'instar de mousePressed ou la même chose avec keyboard ou keypressed je ne sais plus comment on l'écrit


en tous cas
mon projet est d'arreter et reprendre une boucle en fonction de données analogiques mesurés par une carte son ou bien un arduino via port série,
et dans ce cas je pense qu'il faudra faire autrement qu'avec un void "evenement"()

par exemple si je voulais maintenant sacader le programme
en fonction d'une valeur aléatoire, placée entre 0 et 10,
si cette valeur est en dessous de 50 on arrete si elle est au dessus on reprend

comment faire??


je veux dire que j'ai l'impression que lorsque l'on arrete la boucle draw, processing ne calcule plus rien,

et que pour le cas des données de la souris ou du clavier, il va simplement recevoir des valeurs que le système d'exploitation reçoit en temps réel et qu'il n'a pas besoin d'etre en "travail pour ça"

autrement, ma question est de savoir:
c'est bien une boucle qui peut mesure ou générer mathématiquement une valeur aléatoire , ou bien celle qui vient du port COM??

et si on arrete cette boucle il n'y a plus de mesure donc ça ne peut plus reprendre?


je ne sais pas si ma question est bien claire, mais j'avoue qu'un exemple avec une donnée autre que clavier souris serait finalement plus explicite



merci

Hors ligne

 

#4 2014-12-08 18:57:48 Re : Premier post, et Fonctions loop/noLoop/redraw

tchilaviek
nouveau membre
Date d'inscription: 2014-12-08
Messages: 4

Re: Premier post, et Fonctions loop/noLoop/redraw



float x = 0;

void setup() {
  size(200, 200);
  rectMode(CENTER);
   frameRate(10);
}

void draw() {
  background(255);
  fill(255, 0, 0);
  rect(width / 2, height / 2, 40, 40);
  x = x + 5;
  if (x > width) {
    x = 0;
  }
  line(x, 0, x, height);
  float r = random(100);
  if (r>=95) {
    noLoop();}
    else if (r<95){
      redraw();
}


  //} else {
   // loop();
// }
}


----------------------------------------------------------



voilà le genre casse tête auquel je bute alors que je n'ai pas encore parfaitement compris les structures du programme, mais pas grave on apprends comme ça aussi!

j'ai choisi la valeur 95 parce que quand je met 50 il n'y pas de mouvement perceptible

avec cet exemple
et j'ai ralenti la cadence
on voit qu'au bout d'un moment le programme s'arrete , et il le fait un un moment différent à chaque fois,

seulement il ne reprend pas et je n'ai aucune idée de comment faire ou bien meme de savoir si c'est faisable ou pas

donc un mouvement saccadé par exemple avec les valeurs 10 , 12 , 26, 49, 47, 32, le programme tourne, et ensuite la valeur 51,puis 64 il s'arrete en 2 temps, et reprends immédiatement avec la valeur 44 suivie de 25, 17 etc,
dans l'idée du >50 ou <50 de tout à l'heure

si on peut répondre à cette question pour moi ça répondra à la question de valeurs analogiques dont on fait l'acquisiton par des convertisseurs ADC par lectures consecutives... c'est un peu mon but


est ce qu'il faut faire un void pour ça comme ton void mouseMouved()??  void random(), ou void serialRead() ou quelque chose comme ça, APRES le void draw(), qui s'est arreté???



merci pour vos réponses

Hors ligne

 

#5 2014-12-08 20:22:16 Re : Premier post, et Fonctions loop/noLoop/redraw

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

Re: Premier post, et Fonctions loop/noLoop/redraw



Tu as tout à fait compris, à la suite d'un noLoop(), Processing ne calcule plus rien, c'est l'équivalent de mettre en pause. Seul un évènement extérieur peut le remettre en marche. C'est pour cela que je t'ai proposé de simuler cette pause. La pause est dans l'affichage et non dans le calcul.

float x = 0;
boolean temoin;

void setup() {
  size(200, 200);
  rectMode(CENTER);
  temoin = false;
}

void draw() {
  // Affichage
  if (!temoin) {
    background(255);
    line(x, 0, x, height);
  }
  // Calcul
  x = x + 1;
  if (x > width) {
    x = 0;
  }
  if ((x > 50)   && (x < 150)) {
    temoin = true;
  } else {
    temoin = false;
  }
}

Hors ligne

 

#6 2014-12-08 21:07:53 Re : Premier post, et Fonctions loop/noLoop/redraw

tchilaviek
nouveau membre
Date d'inscription: 2014-12-08
Messages: 4

Re: Premier post, et Fonctions loop/noLoop/redraw



ok merci! et pour l'astuce avec les valeurs booléennes très utile pour le futur



et pour noLoop(), c'est donc une fonction limitée, finalement


je me dis qu'en fait si je veux arreter puis recommencer un programme à mon aise,
il faut tricher

et ne pas l'arreter,

on peut par exemple faire disparaitre le tracé en deplaçant à des coordonnées qui sortent de l'écran ou bien utiliser quelque chose qui peut figer ou dupliquer les pixels..
il faudra que je m'y penche!


(j'ai un exemple en tete avec un pong sur lequel j'ai commencé à travailler en lien avec arduino)


il s'arrete lorsque la balle sort de l'écran, grace à un noLoop()

comment pourrait on faire pour le faire s'arreter et puis reprendre quelques secondes plus tard, avec millis, par exemple?





ici le programme , jeu avec la souris axe Y :
----------------------------------------------------------------------------


int deplacementX, deplacementY;
int x, y;
int w;
float z;
void setup()
{
size(400,400);
background(0);
x = 200;
y = 200;
deplacementX = 6;
deplacementY = -3;
w = 15;
z = 60;
}

void draw()
{
nettoyer();
bouger();
rebondir();
dessiner();
}


void nettoyer()

background(0);
}
void dessiner()
{
  smooth();
  fill(255);
  rect(w,z,25,85);
  fill(255);
  ellipse(x,y,20,20);
  line(200,0,200,400);
}
void bouger()
{
x = x + deplacementX;
y = y + deplacementY;

z = (mouseY);
}
void rebondir()
{


if (x > width-10 && deplacementX > 0)
{
   deplacementX = -deplacementX;
}



if (y > width-10 && deplacementY > 0)
{
   deplacementY = -deplacementY;
}


if (y < 10 && deplacementY < 10)
{
   deplacementY = abs(deplacementY);
}

if (x<w+35 && y>z && y<z+85)
  {
   deplacementX = -deplacementX;
}
if (x < 10)
{
  noLoop();
  println("GAME OVER");   
}
}

--------------------------------------------------------------------------------

Hors ligne

 

fil rss de cette discussion : rss

Pied de page des forums

Powered by FluxBB

codelab, graphisme & code : emoc / 2008-2024