Inserire uno stato su processing

di il
11 risposte

Inserire uno stato su processing

Ciao a tutti,

avrei bisogno di un aiutino.
Sto scrivendo un codice su Processing che deve far visualizzare un'immagine.Alla prima pressione del tasto M bisognerà visualizzare l'immagine originale senza modifiche.Alla seconda pressione del tasto M bisogna visualizzare l'immagine modificata.Alla terza pressione del tasto M,di nuovo l'immagine originale e così via...In pratica mi serve uno stato che si incrementi alla prima pressione di M e si azzeri dopo la seconda.
Attualmente il programma mi funziona ma non riesco ad inserire correttamente lo stato.Infatti,alla prima pressione di M visualizza l'immagine già modificata,saltando così un passaggio.
Mi aiutate ? Questa è la parte di codice da correggere,in cui cerco di inserire lo stato :
void setup() 
{
  
  surface.setResizable(true); 
  imgOrig= getImage();
  surface.setSize(imgOrig.width, imgOrig.height); 


}
void draw()
{
  
  if(key=='m')
  {
    image(imgOrig,0,0);
  }
  
  if(key=='m')
  {
    
    imgMod=imgOrig.copy();
    quadrato1(pmouseX,pmouseY,70,70);
    quadrato2(mouseX,mouseY,40,40);
    image(imgMod,0,0);
  }
}


void keyPressed()
{
  stato=0;
  
  if(stato==0 && key=='m')
  {
    
    stato=stato+1;
  }
  
  else
  
  {
    stato=stato-1;
  }
    
}

11 Risposte

  • Re: Inserire uno stato su processing

    La variabile stato e', ovviamente, nel posto sbagliato: la devi mettere a livello di form, NON di metodo, visto che a livello di metodo, viene creata quando il metodo viene chiamato, e distrutta all'uscita dello stesso.
  • Re: Inserire uno stato su processing

    migliorabile ha scritto:


    La variabile stato e', ovviamente, nel posto sbagliato: la devi mettere a livello di form, NON di metodo, visto che a livello di metodo, viene creata quando il metodo viene chiamato, e distrutta all'uscita dello stesso.
    La variabile stato l'ho dichiarata di tipo float e globale (non si vede nella parte di codice inserita).
    Perdonami,non ho capito il concetto.Puoi essere più chiaro?
    In pratica quando stato è uguale a 0,alla pressione di M deve mostrare l'immagine originale e incrementare stato.
    Di conseguenza,quando stato è uguale a 1,alla pressione di M deve visualizzare le modifiche e azzerare nuovamente stato.
  • Re: Inserire uno stato su processing

    Mai sentito parlare di variabili booleane?
  • Re: Inserire uno stato su processing

    Non ho mai usato Processing, e spero di non sparare boiate, ma a me questo codice pare sbagliato:
    
    if(stato==0 && key=='m')
      {
        
        stato=stato+1;
      }
      
      else
      
      {
        stato=stato-1;
      }
    
    Cosa succede se key != 'm'? Passi nell'else, ma stando a quando dicevi volevi cambiare lo stato dell'immagine solo alla pressione del tasto M.

    Non è possibile usare una variabile di tipo boolean? Ne cambieresti lo stato semplicemente con:
    
    statoImmagineOriginale = !statoImmagineOriginale;
    
    evitandoti l'if else. Per quanto riguarda lo stato alla prima pressione di M, beh se la variabile relativa allo stato fosse inizializzata al valore corretto non dovresti avere questo problema, ma di più non saprei dire.
  • Re: Inserire uno stato su processing

    LeleFT ha scritto:


    Mai sentito parlare di variabili booleane?

    Ansharja ha scritto:


    Non ho mai usato Processing, e spero di non sparare boiate, ma a me questo codice pare sbagliato:
    
    if(stato==0 && key=='m')
      {
        
        stato=stato+1;
      }
      
      else
      
      {
        stato=stato-1;
      }
    
    Cosa succede se key != 'm'? Passi nell'else, ma stando a quando dicevi volevi cambiare lo stato dell'immagine solo alla pressione del tasto M.

    Non è possibile usare una variabile di tipo boolean? Ne cambieresti lo stato semplicemente con:
    
    statoImmagineOriginale = !statoImmagineOriginale;
    
    evitandoti l'if else. Per quanto riguarda lo stato alla prima pressione di M, beh se la variabile relativa allo stato fosse inizializzata al valore corretto non dovresti avere questo problema, ma di più non saprei dire.
    Non mi sono chiare le booleane.Conosco il loro scopo,ma non le so utilizzare?Io stavo progettando il tutto sotto forma di condizione IF.Ecco perché stavo scrivendo quel codice.Quindi non serve dichiarare la variabile stato di tipo float?
    Questo è il codice intero,in cui si vede anche la dichiarazione delle variabili globali :
    PImage imgOrig,imgMod;
    float stato;
    
    void setup() 
    {
      
      surface.setResizable(true); 
      imgOrig= getImage();
      surface.setSize(imgOrig.width, imgOrig.height); 
    
    }
    void draw()
    {
      
      if(key=='m')
      {
        image(imgOrig,0,0);
      }
      
      if(key=='m')
      {
        
        imgMod=imgOrig.copy();
        quadrato1(pmouseX,pmouseY,70,70);
        quadrato2(mouseX,mouseY,40,40);
        image(imgMod,0,0);
      }
    }
    
    void keyPressed()
    {
      stato=0;
      
      if(stato==0 && key=='m')
      {
        
        stato=stato+1;
      }
      
      else
      
      {
        stato=stato-1;
      }
        
    }
    
    Il risultato è che ,alla prima pressione di M ,mi fa vedere subito le modifiche.Salta un passaggio.
  • Re: Inserire uno stato su processing

    Ciao...sono un "non esperto" e quindi non vorrei sbagliare ma:
    se digiti un tasto della tua tastiera "key" acquisisce quel valore e lo mantiene fino alla sua variazione.
    il draw() si ripete, diciamo, come il main() od il loop() in altri ambienti.
    Da qui i due if() nel tuo draw() verranno eseguiti subito entrambi...nel draw() non vedo una chiamata a background()...quindi la tua finestra non viene mai ripulita ma tutte le immagini/forme che ci metti si sovrappongono.
    dovresti usare un controllo keyPressed() e keyReleased()...per gestire la sequenza: premo-rilascio-premo-rilascio...etc
  • Re: Inserire uno stato su processing

    orso2001 ha scritto:


    Ciao...sono un "non esperto" e quindi non vorrei sbagliare ma:
    se digiti un tasto della tua tastiera "key" acquisisce quel valore e lo mantiene fino alla sua variazione.
    il draw() si ripete, diciamo, come il main() od il loop() in altri ambienti.
    Da qui i due if() nel tuo draw() verranno eseguiti subito entrambi...nel draw() non vedo una chiamata a background()...quindi la tua finestra non viene mai ripulita ma tutte le immagini/forme che ci metti si sovrappongono.
    dovresti usare un controllo keyPressed() e keyReleased()...per gestire la sequenza: premo-rilascio-premo-rilascio...etc
    Come modificheresti quindi il codice?Anche io non sono così tanto pratico ..sono agli inizi.
  • Re: Inserire uno stato su processing

    Ciao,

    di seguito un piccolo esempio di utilizzo keyPressed e keyReleased()...con una variabile boolean utilizzata da flag per vedere se il pulsante è stato premuto e rilasciato...e "reset" di key.
    int count;
    boolean pressed;
    
    void setup() {
      count=0;
      pressed = false;
    }
    
    void draw() {
      if (keyPressed == true && pressed==false) {
        if (key=='m') {
          println(count);
          count++;
          pressed=true;
        }
      }
    }
    void keyReleased() {
      if (pressed == true && key == 'm') {
        pressed=false;
        key=0;
      }
    }
    
    in pratica se premi il tasto m ti stampa il valore attuale di count e anche se lo tieni continuamente premuto, avendo cambiato lo stato della boolean pressed, esegue più quell'azione...devi rilasciare il pulsante, che richiamerà la funzione keyReleased() che "azzera" il tutto
  • Re: Inserire uno stato su processing

    orso2001 ha scritto:


    Ciao,

    di seguito un piccolo esempio di utilizzo keyPressed e keyReleased()...con una variabile boolean utilizzata da flag per vedere se il pulsante è stato premuto e rilasciato...e "reset" di key.
    int count;
    boolean pressed;
    
    void setup() {
      count=0;
      pressed = false;
    }
    
    void draw() {
      if (keyPressed == true && pressed==false) {
        if (key=='m') {
          println(count);
          count++;
          pressed=true;
        }
      }
    }
    void keyReleased() {
      if (pressed == true && key == 'm') {
        pressed=false;
        key=0;
      }
    }
    
    in pratica se premi il tasto m ti stampa il valore attuale di count e anche se lo tieni continuamente premuto, avendo cambiato lo stato della boolean pressed, esegue più quell'azione...devi rilasciare il pulsante, che richiamerà la funzione keyReleased() che "azzera" il tutto
    Ciao,
    ieri non ho avuto tempo di provare.Ora ho inserito il codice che mi hai detto ma non mi visualizza l'immagine modificata alla seconda pressione di M .Solo alla prima pressione mi visualizza quella originale.
    
    PImage imgOrig,imgMod;
    int count;
    boolean pressed;
    
    void setup() 
    {
      
      surface.setResizable(true); 
      imgOrig= getImage();
      surface.setSize(imgOrig.width, imgOrig.height); 
      
      count=0;
      pressed=false;
    
    }
    void draw()
    {
      
      if(keyPressed==true && pressed==false)
      {
        if(key=='m')
        {
          
          image(imgOrig,0,0);
          count++;
          pressed=true;
      }
      }
      
      void keyReleased()
    {
      if(pressed==true && key=='m')
      {
        pressed=false;
        key=0;
        
      }
    }
    
  • Re: Inserire uno stato su processing

    Ciao...e dove, nel tuo sketch, hai inserito il "comando" per visualizzare la seconda immagine?
    velocemente un abbozzo di sketch per eseguire due cose diverse a seconda se prima la 'm' la prima volta o la seconda...nella seconda inserisci tu l'immagine che vuoi (al posto della parte commentata).
    PImage imgOrig, imgMod;
    int count;
    boolean pressed;
    
    void setup() 
    {
    
      surface.setResizable(true); 
      imgOrig= getImage();
      surface.setSize(imgOrig.width, imgOrig.height); 
    
      count=0;
      pressed=false;
    }
    void draw()
    {
    
      if (keyPressed==true )
      {
        if (key=='m')
        {
          if (count==0 && pressed==false) {
            image(imgOrig, 0, 0);
            count++;
            pressed=true;
          }
          if (count==1 && pressed==false) {
            // QUI ALTRA IMMAGINE!!!
            count=0;
            pressed=true;
          }
        }
      }
    }
    
    void keyReleased()
    {
      if (pressed==true)
      {
        pressed=false;
        key=0;
      }
    }
    fammi sapere.
  • Re: Inserire uno stato su processing

    orso2001 ha scritto:


    Ciao...e dove, nel tuo sketch, hai inserito il "comando" per visualizzare la seconda immagine?
    velocemente un abbozzo di sketch per eseguire due cose diverse a seconda se prima la 'm' la prima volta o la seconda...nella seconda inserisci tu l'immagine che vuoi (al posto della parte commentata).
    PImage imgOrig, imgMod;
    int count;
    boolean pressed;
    
    void setup() 
    {
    
      surface.setResizable(true); 
      imgOrig= getImage();
      surface.setSize(imgOrig.width, imgOrig.height); 
    
      count=0;
      pressed=false;
    }
    void draw()
    {
    
      if (keyPressed==true )
      {
        if (key=='m')
        {
          if (count==0 && pressed==false) {
            image(imgOrig, 0, 0);
            count++;
            pressed=true;
          }
          if (count==1 && pressed==false) {
            // QUI ALTRA IMMAGINE!!!
            count=0;
            pressed=true;
          }
        }
      }
    }
    
    void keyReleased()
    {
      if (pressed==true)
      {
        pressed=false;
        key=0;
      }
    }
    fammi sapere.

    Risolto!! Ti ringrazio molto per la pazienza!
Devi accedere o registrarti per scrivere nel forum
11 risposte