2013-02-02 11 views
5

Sto lavorando con bambini disabili, con paralisi cerebrale. Un bambino ha un controllo motorio limitato, quindi attualmente usa un joystick per controllare il mouse, e la velocità trasversale è impostata su un valore molto basso. Funziona bene per lei, dato che può fare clic su tutti i pulsanti sullo schermo, ma penso che potremmo fare di meglio - quando vuole attraversare l'intero schermo ci vuole un'età per farlo (circa 10 secondi).sovrascrive le impostazioni della velocità del mouse. Creazione del mio algoritmo di velocità del mouse

La mia ipotesi è che il suo cervello stia bene, e solo il suo controllo motorio è scadente. Se è vero, credo che un topo che partisse a bassa velocità, ma avesse un'accelerazione costante, sarebbe stato meglio per lei, poiché avrebbe aumentato la velocità e diventare veloce quando attraversava l'intero schermo. Se funziona, potremmo modificare il controllo PID e l'impostazione di velocità/accelerazione per un gran numero di persone disabili, accelerando il loro accesso e quindi il loro apprendimento e sviluppo.

Ma io non conosco il modo migliore per costruire questo - tutti i suggerimenti, pensieri, collegamenti e suggerimenti sono benvenuti.

Per cominciare, ho provato a utilizzare Processing e Java e utilizzando un mouseListener e un Robot per controllare il cursore. Non sono convinto che questo sia il modo migliore, visto che sto leggendo la posizione del cursore e poi scrivendo su di esso, quindi i miei migliori tentativi fanno ancora saltare il cursore, e non c'è movimento fluido. È realizzabile in Java? Devo leggere l'input del mouse da USB usando un qualche tipo di driver, e quindi sostituire il tracciamento del cursore sullo schermo con il mio?

Ho realizzato un paio di video per illustrare l'effetto che sto cercando di realizzare.

lo status quo (la mia illustrazione sta guidando il cursore fuori i tasti freccia) http://www.youtube.com/watch?v=3ZhQCg5DJt8

Il nuovo comportamento che voglio (topo accelera) http://www.youtube.com/watch?v=JcBK_ZCFGPs

se si tratta di qualche utilità, il codice Processing che ho usato per fare quelle demo viene copiato in seguito:

Status quo demo:

import java.awt.AWTException; 
import jav 
a.awt.Robot; 

Robot robot; 
int i = 0; 
int j = 0; 

void setup() { 
    setupDotgame(); 
    try { 
    robot = new Robot(); 
    } 
    catch (AWTException e) { 
    e.printStackTrace(); 
    } 
    robot.mouseMove(screenWidth/2, screenHeight/2); 
} 

void draw() { 
    //println(frameCount); 
    robot.mouseMove(screenWidth/2+8*i, screenHeight/2+8*j); 
    drawDotgame(); 
} 

void keyPressed() { 
    if (keyCode == UP) { 
    j--; 
    } 
    else if (keyCode == DOWN) { 
    j++; 
    } 
    else if (keyCode == RIGHT) { 
    i++; 
    } 
    else if (keyCode == LEFT) { 
    i--; 
    } 
} 
comportamento 451.515.053.691,36321 milioni

desiderata:

import java.awt.AWTException; 
import java.awt.Robot; 

Robot robot; 
int i = 0; 
int j = 0; 
int delta = 8; 
int time = 0; 

void setup() { 
    setupDotgame(); 
    try { 
    robot = new Robot(); 
    } 
    catch (AWTException e) { 
    e.printStackTrace(); 
    } 
    robot.mouseMove(screenWidth/2, screenHeight/2); 
} 

void draw() { 



    //println(frameCount); 
    robot.mouseMove(screenWidth/2+i, screenHeight/2+j); 
    drawDotgame(); 

} 

void keyPressed() { 
    if (millis() - time < 90) { 
    delta += 8; 
    } 
    else { delta = 8; } 
    time = millis(); 


    if (keyCode == UP) { 
    j-=delta; 
    } 
    else if (keyCode == DOWN) { 
    j+=delta; 
    } 
    else if (keyCode == RIGHT) { 
    i+=delta; 
    } 
    else if (keyCode == LEFT) { 
    i-=delta; 
    } 
} 

E il codice DotGame entrambi di riferimento:

void setupDotgame() { 
    size(1000, 600); 
    background(255); 
    fill(255, 0, 0); 
    noStroke(); 
    smooth(); 
    drawCircle(); 
} 

void drawDotgame() { 
    if (get(mouseX, mouseY) != color(255)) { 
    background(255); 
    drawCircle(); 
    } 
} 

void drawCircle() { 
    int x = round(random(50, width-50)); 
    int y = round(random(50, height-50)); 
    int rad = round(random(20, 80)); 
    ellipse(x, y, rad, rad); 
} 

Grazie in anticipo

+0

Avete considerato di utilizzare un pulsante sul joystick per accelerare il movimento. Ad esempio Ctrl + freccia fa muovere il mouse rapidamente quando si utilizza MouseKeys. Allo stesso modo qualcosa che potrebbe farlo saltare se necessario ma ha ancora la bassa velocità richiesta dalla regolazione fine? – cjds

+0

Grazie per il suggerimento. Lo studente in questione può fare solo una cosa alla volta con le sue mani, quindi non sono così ottimista riguardo alla sua capacità di fare due cose contemporaneamente. Come ho detto, penso che il suo cervello stia bene, ma è un sacco di spasmi muscolari che rendono le cose davvero difficili. – samjewell

+1

Non voglio sembrare uno stronzo, ma è una domanda di programmazione a cui vuoi rispondere o stai cercando di ottenere una discussione sul modo migliore per farlo? E poi su una nota costruttiva: non risolvere questo per "il tuo programma", ma risolverlo per il dispositivo di input. Fai in modo che il joystick spari più delta al secondo, in base a quanto tempo è stato trattenuto (relativamente semplice con un arduino, ecc.) E il problema di "come farlo in java" scompare, perché ora hai una soluzione universale per tutti i programmi su tutti i sistemi operativi. –

risposta

0

come suggerito Carl, credo che la migliore risposta breve di rendere il mouse in realtà hanno questo comportamento è una sorta di comportamento di salto che porterà il mouse abbastanza vicino a dove devi andare, quindi usa il joystick da lì.

Mi è capitato di sapere che un programma chiamato AutoItv3 può fare questo genere di cose. È possibile impostarlo per riconoscere i tasti di scelta rapida speciali, quindi fare in modo che il tasto di scelta rapida sposti il ​​mouse sulla regione desiderata.

I comandi utili per questo sono HotKeySet, MouseMove e Func/EndFunc.

Problemi correlati