Leonardo - Mouse e movimento assoluto

Beh oddio... A parte il #define il resto è praticamente tutto codice che sarebbe identico anche in Java 8), per cui se hai dimestichezza con quest'ultimo, dovrebbe esserti chiaro. Comunque...

  • DELTA è il movimento massimo che si può fare ad ogni chiamata di Mouse.move(), ovvero il massimo numero rappresentabile con un signed char. Quella riga è come se fosse DELTA = 127, insomma.
  • home() è una funzione che fa ripetuti movimenti negativi, ovvero verso l'alto e verso sinistra, al fine di portarsi nell'angolo in alto a sinistra. È un po' empirica, ma dovrebbe funzionare su tutte le risoluzioni di schermo più comuni. Funziona anche sul mio schermo Retina, per capirci. Comunque è la stessa funzione di prima, con solo un for aggiuntivo per essere sicuri di arrivare nell'angolo, come suggerito nei post precedenti.
  • Uso una variabili di tipo byte, perché è sufficiente nel contesto, ed il codice risulta più efficiente (Ricorda che l'AVR è un'architettura a 8 bit. Comunque è probabile che anche se usassi una variabile più grossa, il compilatore ottimizzi e usi un byte solo).
  • Visto che a ogni Mouse.move() non ci si può spostare di più di 127 pixel, se dobbiamo andare ad una posizione maggiore, dobbiamo fare più movimenti, tenendo traccia di dove siamo arrivati. Supponiamo ad esempio di dover andare alla colonna 200: allora possiamo spostarci di 127 una prima volta, e poi di 73 una seconda. Per cui, a ogni giro dobbiamo spostarci di una quantità che è la minore tra 127 e il numero di pixel rimasti. Da qui il min(), dx è quindi la quantità di pixel di cui spostarsi.
  • Per ricordarci di quanti pixel dobbiamo ancora spostarci, sottraiamo dx a x, che varrà quindi 73 dopo il primo spostamento, e poi 0.
  • Tutto questo viene fatto in parallelo anche in verticale, quindi su y.
  • Lo spostamento continua finché x ed y non sono entrambi 0. A quel punto, siamo arrivati a destinazione.

Chiaro? Ovviamente ci si potrebbe spostare anche di un pixel alla volta, ma sarebbe troppo lento, in questo modo ho cercato di massimizzare la velocità di spostamento.

Si scusa, dopo che ti ho scritto mi ci sono messo con più mente e avevo capito tutto, tranne il fatto che effettivamente andava a diminuire la X che veniva inizialmente passata fino a divenire nulla nel do-while e che quindi veniva, nel caso di X=200, spostata di DELTA e poi di X stesso. :sweat_smile:

Direi che è un'ottima soluzione! Se si potesse fare in modo di rendere invisibile il ritorno alla home() sarebbe perfetto, visto che sembra impazzito XD ma non mi rendo conto di cosa sarebbe influente alterare nel codice....

Ah, riguardo al commento sul tuo sketch del -128, credo non funzioni perchè andando da 127 a -127 lui vede il -128 come 0, il -129 come 1 e così via....mi pare di aver fatto delle prove e agiva così

Ma guarda che è sempre la stessa soluzione che ti avevo proposto all'inizio e che schifavi...

Per come funziona no, non è possibile togliere il salto nell'angolo. Per farlo devi tenere continuamente traccia della posizione e spostarti solo del necessario per andare a destinazione. Dovrebbe essere semplice modificare le funzioni che ti ho fornito per farlo, ma lo lascio a te per esercizio :D.

Sappi comunque che se fai così, almeno una volta all'inizio dovrai andare nell'angolo, e che se il cursore viene spostato in altro modo (tipo con un altro mouse), ovviamente tutti gli spostamenti successivi saranno sbagliati.

-128 è il valore minimo rappresentabile su un signed char, ben distinto da 0, per cui dovrebbe funzionare, ma non lo fa. Potrebbe essere un bug della libreria Mouse oppure un valore proprio non contemplato o usato con un significato particolare dal protocollo. In ogni caso in questo contesto non cambia niente.

Hai ragione, lo schifavo perchè avevo in mente un'altra idea che però poi a conti fatti non andava bene :frowning: e perchè dovrei riuscire ad evitare la "visione" del viaggio verso home (infatti, come ti ho scritto, va bene ma ho bisogno che sia invisibile lo spostamento, cosa che risulta invece con la libreria modificata che ho postato più su).

certo, ovviamente la prima volta dovrà andare nell'angolo, ma riguardo un mouse secondario che dovrebbe dare problemi, non credo ce ne saranno perchè l'idea è di non toccarlo affatto il mouse e di agire tramite un altro oggetto.

Proverò a far sì che venga memorizzata la posizione così da eseguire lo spostamento solo se necessario grazie alle tue funzioni.

Comunque, perchè l'idea della libreria modificata non ti garba? Mi sembrava una valida soluzione ::slight_smile: