2012-05-13 18 views
9

Sto sviluppando uno sparatutto in prima persona in Java e voglio implementare controlli in cui il movimento del mouse ruota il lettore. Tuttavia, in Java, posso ottenere solo le coordinate del mouse usando gli eventi MouseListener, quindi le coordinate smetteranno di cambiare una volta che il cursore del mouse lascia il bordo del monitor e io non sarò in grado di girare la vista del giocatore.Posizione del mouse in java

Eventuali suggerimenti/suggerimenti su come farlo? Grazie.

+0

.. ma si sa anche che il mouse _isn't_ in movimento, giusto? – sarnold

+0

@sarnold: Penso che il punto * sia che il * mouse * potrebbe ancora muoversi ma il * cursore * non lo è. –

+0

@GregHewgill: esattamente! – user1391664

risposta

3

In alcuni giochi, in ogni evento di spostamento del mouse il cursore viene spostato indietro al centro dello schermo e la vista si sposta con la grandezza e la direzione corrispondenti dell'evento del mouse. È possibile ottenere quel vettore calcolando l'offset della posizione del cursore sul centro dello schermo prima di centrare il cursore. Per spostare il cursore al centro dello schermo, puoi provare a utilizzare la classe java.awt.Robot.

Dato che stai costruendo uno sparatutto in prima persona, probabilmente vorrai nascondere il cursore bloccato centrale e disegnare il tuo mirino nel mirino del giocatore. Ciò implicherà anche tenere traccia di dove il cursore deve essere basato sul totale parziale di eventi di movimento del mouse precedenti.

Se si desidera ottenere un comportamento in cui la vista continuerà a spostarsi rispetto alla posizione di partenza del mouse (anche una volta che il mouse si è fermato), è possibile mantenere una somma mobile di tutti i precedenti vettori di movimento del mouse e spostare la vista corrispondentemente una volta ogni fotogramma. Tuttavia, questo probabilmente si applica più a qualcosa come un simulatore di volo che a uno sparatutto in prima persona.

+0

Accade così, ho fatto esattamente la stessa cosa mentre aspettavo una risposta. Non sapevo che i giochi effettivamente lo facessero in quel modo. Grazie – user1391664

+0

Grandi cose, prego! Questo è solitamente chiamato un blocco mouse/cursore/puntatore. – AerandiR

3

Ho provato ad usare un java.awt.Robot come suggerisce AerandiR, ma ci sono stati un paio di problemi in cui mi sono imbattuto, ed è possibile che anche altre persone li incontrino, quindi mi occuperò di elaborare.

Se il tuo obiettivo è mantenere il cursore in una posizione (preferibilmente al centro dello schermo), allora dovrai chiamare qualcosa come robot.mouseMove(width/2, height/2); alla fine del tuo metodo mouseMoved(). Con questa implementazione, ogni volta che il mouse viene spostato dal centro, lo Robot lo sposta di nuovo al centro.

Tuttavia, quando lo Robot ricentrerà il mouse, il lettore tornerà a dove era. In effetti, il giocatore balbetterà tra la posizione originale e una posizione girata.

Per risolvere questo problema, invece di definire fino a che punto il tuo giocatore attiva la differenza tra dove si trova il mouse e dove si trovava, definirlo come la distanza dal centro.

Come così: turnAmountX += e.getX() - width/2;

Ora, se i Robot re-centri il mouse, e.getX() - width/2 sarà sempre cedere a zero.

Recap:

void mouseMoved(MouseEvent e) { 
     turnAmountX += e.getX() - width/2; 
     turnAmountY += e.getY() - height/2; 
     robot.mouseMove(this.getLocationOnScreen().x + width/2, 
      this.getLocationOnScreen().y + height/2; 
    } 
+0

Grazie! Questa era l'informazione extra di cui avevo bisogno e non potevo trovare da nessuna parte. Genius. – LucidObscurity

Problemi correlati