Movimiento relativo del mouse y CoreWindow
En los juegos, el mouse es una opción de control común que es familiar para muchos jugadores, y también es esencial para muchos géneros de juegos, incluidos tiradores de primera y tercera persona, y juegos de estrategia en tiempo real. Aquí se describe la implementación de controles relativos del mouse, que no usan el cursor del sistema y no devuelven coordenadas de pantalla absolutas; en su lugar, realizan un seguimiento del delta de píxeles entre los movimientos del mouse.
Algunas aplicaciones, como juegos, usan el mouse como un dispositivo de entrada más general. Por ejemplo, un modelador 3D podría usar la entrada del mouse para orientar un objeto 3D simulando un trackball virtual; o un juego podría usar el mouse para cambiar la dirección de la cámara de visualización a través de controles de aspecto del mouse.
En estos escenarios, la aplicación requiere datos relativos del mouse. Los valores relativos del mouse representan cuánto se movió el mouse desde el último fotograma, en lugar de los valores absolutos de coordenada x-y dentro de una ventana o pantalla. Además, las aplicaciones suelen ocultar el cursor del mouse, ya que la posición del cursor con respecto a las coordenadas de pantalla no es relevante al manipular un objeto o escena 3D.
Cuando el usuario realiza una acción que mueve la aplicación a un modo relativo de manipulación de objetos o escenas 3D, la aplicación debe:
- Omitir el control predeterminado del mouse.
- Habilite el control relativo del mouse.
- Oculte el cursor del mouse estableciendo un puntero nulo (nullptr).
Cuando el usuario realiza una acción que mueve la aplicación fuera de un modo relativo de manipulación de objetos o escenas 3D, la aplicación debe:
- Habilite el control predeterminado o absoluto del mouse.
- Desactive el control relativo del mouse.
- Establezca el cursor del mouse en un valor distinto de NULL (lo que hace que sea visible).
Note
Con este patrón, la ubicación del cursor absoluto del mouse se conserva al entrar en el modo relativo sin cursor. El cursor vuelve a aparecer en la misma ubicación de coordenadas de pantalla que antes para habilitar el modo de movimiento relativo del mouse.
Control del movimiento relativo del mouse
Para acceder a los valores delta relativos del mouse, regístrese para el evento MouseDevice::MouseMoved como se muestra aquí.
// register handler for relative mouse movement events
Windows::Devices::Input::MouseDevice::GetForCurrentView()->MouseMoved +=
ref new TypedEventHandler<MouseDevice^, MouseEventArgs^>(this, &MoveLookController::OnMouseMoved);
void MoveLookController::OnMouseMoved(
_In_ Windows::Devices::Input::MouseDevice^ mouseDevice,
_In_ Windows::Devices::Input::MouseEventArgs^ args
)
{
float2 pointerDelta;
pointerDelta.x = static_cast<float>(args->MouseDelta.X);
pointerDelta.y = static_cast<float>(args->MouseDelta.Y);
float2 rotationDelta;
rotationDelta = pointerDelta * ROTATION_GAIN; // scale for control sensitivity
// update our orientation based on the command
m_pitch -= rotationDelta.y; // mouse y increases down, but pitch increases up
m_yaw -= rotationDelta.x; // yaw defined as CCW around y-axis
// limit pitch to straight up or straight down
float limit = (float)(M_PI/2) - 0.01f;
m_pitch = (float) __max( -limit, m_pitch );
m_pitch = (float) __min( +limit, m_pitch );
// keep longitude in useful range by wrapping
if ( m_yaw > M_PI )
m_yaw -= (float)M_PI*2;
else if ( m_yaw < -M_PI )
m_yaw += (float)M_PI*2;
}
El controlador de eventos de este ejemplo de código, OnMouseMoved, representa la vista en función de los movimientos del mouse. La posición del puntero del mouse se pasa al controlador como un objeto MouseEventArgs .
Omita el procesamiento de datos absolutos del mouse desde el evento CoreWindow::P ointerMoved cuando la aplicación cambie para controlar los valores de movimiento relativos del mouse. Sin embargo, solo omita esta entrada si se produjo el evento CoreWindow::P ointerMoved como resultado de la entrada del mouse (en lugar de la entrada táctil). El cursor está oculto estableciendo CoreWindow::P ointerCursor en nullptr.
Volver al movimiento absoluto del mouse
Cuando la aplicación sale del modo de manipulación de escena o objeto 3D y ya no usa movimiento relativo del mouse (por ejemplo, cuando vuelve a una pantalla de menú), vuelve al procesamiento normal del movimiento absoluto del mouse. En este momento, deje de leer datos relativos del mouse, reinicie el procesamiento de eventos estándar del mouse (y puntero) y establezca CoreWindow::P ointerCursor en un valor distinto de NULL.
Note
Cuando la aplicación está en el modo de manipulación de objetos o escenas 3D (procesando movimientos relativos del mouse con el cursor desactivado), el mouse no puede invocar la interfaz de usuario perimetral, como los accesos, la pila trasera o la barra de la aplicación. Por lo tanto, es importante proporcionar un mecanismo para salir de este modo en particular, como la clave Esc usada habitualmente.