2012-05-13 38 views
9

Estoy desarrollando un shooter en primera persona en Java y quiero implementar controles en los que el movimiento del mouse haga girar el reproductor. Sin embargo, en Java, solo puedo obtener las coordenadas del mouse usando los eventos MouseListener, por lo que las coordenadas dejarán de cambiar una vez que el cursor del mouse deje el borde del monitor y no podré girar la vista del reproductor.Ubicación del mouse en java

¿Algún consejo/sugerencia sobre cómo hacer eso? Gracias.

+0

.. pero también sabrá que el ratón _isn't_ en movimiento, ¿verdad? – sarnold

+0

@sarnold: Creo que el punto es que el * mouse * aún se puede mover, pero el * cursor * no lo está. –

+0

@GregHewgill: ¡exactamente! – user1391664

Respuesta

3

En algunos juegos, en cada evento de movimiento del mouse, el cursor se mueve de regreso al centro de la pantalla, y la vista se mueve con la magnitud y dirección correspondientes del evento del mouse. Puede obtener ese vector calculando el desplazamiento de la posición del cursor al centro de la pantalla antes de centrar el cursor. Para mover el cursor de vuelta al centro de la pantalla, puede intentar usar la clase java.awt.Robot.

Dado que está construyendo un shooter en primera persona, probablemente quiera ocultar el cursor central cerrado y dibujar su propia cruz donde el jugador intenta apuntar. Eso también implicará hacer un seguimiento de dónde se debe tomar el cursor basándose en el total acumulado de eventos previos de movimiento del mouse.

Si desea lograr un comportamiento en el que la vista continúe moviéndose en relación con la posición de inicio del mouse (incluso una vez que el mouse se haya detenido), puede mantener una suma móvil de todos los vectores de movimiento anteriores del mouse y mover la vista correspondiente una vez cada cuadro. Sin embargo, esto probablemente se aplica más a algo así como un simulador de vuelo que un tirador en primera persona.

+0

Da la casualidad, hice exactamente lo mismo mientras esperaba una respuesta. No sabía que los juegos realmente lo hicieran de esa manera. Gracias – user1391664

+0

¡Cosas geniales, de nada! Esto generalmente se llama bloqueo de mouse/cursor/puntero. – AerandiR

3

Intenté usar un java.awt.Robot como sugiere AerandiR, pero hubo un par de problemas con los que me encontré, y es posible que otras personas se topen con ellos también, así que lo detallaré.

Si su objetivo es mantener el cursor en una posición (preferiblemente en el centro de la pantalla), entonces querrá llamar a algo como robot.mouseMove(width/2, height/2); al final de su método mouseMoved(). Con esta implementación, cada vez que se mueve el mouse fuera del centro, el Robot lo moverá de nuevo al centro.

Sin embargo, cuando el Robot vuelve a centrar el mouse, el reproductor volverá a estar donde estaba. En efecto, el jugador tartamudeará entre la posición original y una posición girada.

Para solucionar esto, en lugar de definir qué tan lejos su jugador activa la diferencia entre dónde está el mouse ahora y dónde estaba, defínalo como la distancia desde el centro.

así: turnAmountX += e.getX() - width/2;

Ahora bien, si los Robot Vuelve a centrar el ratón, e.getX() - width/2 siempre dará cero.

Resumen:

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

¡Gracias! Esta era la información adicional que necesitaba y no pude encontrar en ninguna parte ... Genio. – LucidObscurity

Cuestiones relacionadas