Spostamento relativo del mouse e CoreWindowRelative mouse movement and CoreWindow

Nei giochi il mouse costituisce un'opzione di controllo comune, familiare alla maggior parte dei giocatori. Costituisce un controllo essenziale anche in molti generi di gioco, inclusi gli sparatutto in prima e terza persona e i giochi di strategia in tempo reale.In games, the mouse is a common control option that is familiar to many players, and is likewise essential to many genres of games, including first- and third-person shooters, and real-time strategy games. In questo argomento vengono illustrati i controlli del mouse relativi, che non utilizzano il puntatore di sistema e non restituiscono coordinate dello schermo assolute, ma tengono traccia del delta di pixel tra gli spostamenti del mouse.Here we discuss the implementation of relative mouse controls, which don't use the system cursor and don't return absolute screen coordinates; instead, they track the pixel delta between mouse movements.

Alcune app, come i giochi, utilizzano il mouse come dispositivo di input generico.Some apps, such as games, use the mouse as a more general input device. Ad esempio, un'utilità di modellazione 3D può utilizzare l'input tramite mouse per orientare un oggetto 3D simulando un trackball virtuale, oppure un gioco può utilizzare il mouse per modificare la direzione della telecamera di visualizzazione tramite i controlli di movimento e visuale.For example, a 3-D modeler might use mouse input to orient a 3-D object by simulating a virtual trackball; or a game might use the mouse to change the direction of the viewing camera via mouse-look controls.

In questi scenari l'app richiede i dati relativi del mouse.In these scenarios, the app requires relative mouse data. I valori relativi del mouse rappresentano la distanza percorsa dal mouse rispetto al fotogramma precedente, anziché le coordinate x-y assolute di una finestra o schermata.Relative mouse values represent how far the mouse moved since the last frame, rather than the absolute x-y coordinate values within a window or screen. Inoltre, le app spesso nascondono il puntatore del mouse perché la posizione del puntatore rispetto alle coordinate dello schermo non è rilevante quando si manipola una scena o un oggetto 3D.Also, apps often hide the mouse cursor since the position of the cursor with respect to the screen coordinates is not relevant when manipulating a 3-D object or scene.

Se l'utente inizia un'attività che determina il passaggio dell'app a una modalità di manipolazione relativa di una scena o un oggetto 3D, l'app deve:When the user takes an action that moves the app into a relative 3-D object/scene manipulation mode, the app must:

  • Ignorare la gestione predefinita del mouse.Ignore default mouse handling.
  • Abilitare la gestione relativa del mouse.Enable relative mouse handling.
  • Nascondere il puntatore del mouse impostandolo come puntatore NULL (nullptr).Hide the mouse cursor by setting it a null pointer (nullptr).

Se l'utente inizia un'attività che determina l'uscita dell'app da una modalità di manipolazione relativa di una scena o un oggetto 3D, l'app deve:When the user takes an action that moves the app out of a relative 3-D object/scene manipulation mode, the app must:

  • Abilitare la gestione predefinita o assoluta del mouse.Enable default/absolute mouse handling.
  • Disattivare la gestione relativa del mouse.Turn off relative mouse handling.
  • Impostare il puntatore del mouse su un valore non NULL, per renderlo visibile.Set the mouse cursor to a non-null value (which makes it visible).

NotaNote
Con questo modello, quando si passa alla modalità relativa senza puntatore la posizione assoluta del puntatore del mouse viene mantenuta.With this pattern, the location of the absolute mouse cursor is preserved on entering the cursorless relative mode. Il puntatore ricompare nelle stesse coordinate dello schermo del punto in cui si trovava prima dell'abilitazione della modalità di spostamento relativo del mouse.The cursor re-appears in the same screen coordinate location as it was previous to enabling the relative mouse movement mode.

Gestione dello spostamento relativo del mouseHandling relative mouse movement

Per accedere ai valori delta dello spostamento relativo del mouse, è necessario registrare l'evento MouseDevice::MouseMoved come mostrato di seguito.To access relative mouse delta values, register for the MouseDevice::MouseMoved event as shown here.



// 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;
}

In questo esempio di codice, il gestore eventi OnMouseMoved esegue il rendering della visualizzazione in base agli spostamenti del mouse.The event handler in this code example, OnMouseMoved, renders the view based on the movements of the mouse. La posizione del puntatore del mouse viene passata al gestore come oggetto MouseEventArgs.The position of the mouse pointer is passed to the handler as a MouseEventArgs object.

Quando l'app passa alla gestione dello spostamento relativo del mouse puoi ignorare l'elaborazione dei dati assoluti del mouse inviati dall'evento CoreWindow::PointerMoved.Skip over processing of absolute mouse data from the CoreWindow::PointerMoved event when your app changes to handling relative mouse movement values. Tali dati devono essere ignorati solo se l'evento CoreWindow::PointerMoved si è verificato in seguito a un'operazione di input tramite mouse e non tramite tocco.However, only skip this input if the CoreWindow::PointerMoved event occurred as the result of mouse input (as opposed to touch input). Per nascondere il puntatore è necessario impostare CoreWindow::PointerCursor su nullptr.The cursor is hidden by setting the CoreWindow::PointerCursor to nullptr.

Ritorno allo spostamento assoluto del mouseReturning to absolute mouse movement

Quando l'app esce dalla modalità di manipolazione relativa di una scena o un oggetto 3D e non utilizza più lo spostamento relativo del mouse, ad esempio perché torna a una schermata con menu, puoi tornare alla normale elaborazione dello spostamento assoluto del mouse.When the app exits the 3-D object or scene manipulation mode and no longer uses relative mouse movement (such as when it returns to a menu screen), return to normal processing of absolute mouse movement. In questo caso, è necessario interrompere la lettura dei dati relativi del mouse, riavviare l'elaborazione degli eventi standard del mouse (e del puntatore), quindi impostare CoreWindow::PointerCursor su un valore non NULL.At this time, stop reading relative mouse data, restart the processing of standard mouse (and pointer) events, and set CoreWindow::PointerCursor to non-null value.

NotaNote
Quando l'app è nella modalità di manipolazione relativa di una scena o un oggetto 3D (elaborazione degli spostamenti relativi del mouse con il puntatore disattivato), il mouse non può richiamare l'interfaccia utente basata su bordi, come i pulsanti di accesso rapido, lo stack delle operazioni precedenti o la barra dell'app.When your app is in the 3-D object/scene manipulation mode (processing relative mouse movements with the cursor off), the mouse cannot invoke edge UI such as the charms, back stack, or app bar. Di conseguenza, è importante fornire un meccanismo per uscire da questa particolare modalità, ad esempio il tasto ESC utilizzato comunemente.Therefore, it is important to provide a mechanism to exit this particular mode, such as the commonly used Esc key.