Freigeben über


Relative Mausbewegung und CoreWindow

Bei Spielen ist die Maus eine gängige Steuerungsoption, die vielen Spielern vertraut ist und ebenso wichtig für viele Genres von Spielen ist, einschließlich First- und Third-Person-Shootern und Echtzeit-Strategiespielen. Hier besprechen wir die Implementierung relativer Maussteuerelemente, die nicht den Systemcursor verwenden und keine absoluten Bildschirmkoordinaten zurückgeben; Stattdessen verfolgen sie das Pixeldelta zwischen Mausbewegungen.

Einige Apps, z. B. Spiele, verwenden die Maus als allgemeineres Eingabegerät. Beispielsweise kann ein 3D-Modellierer Mauseingaben verwenden, um ein 3D-Objekt zu orientieren, indem ein virtueller Trackball simuliert wird; oder ein Spiel kann die Maus verwenden, um die Richtung der Anzeigekamera über Maus-Blick-Steuerelemente zu ändern.

In diesen Szenarien erfordert die App relative Mausdaten. Relative Mauswerte stellen dar, wie weit die Maus seit dem letzten Frame verschoben wurde, anstatt die absoluten x-y-Koordinatenwerte innerhalb eines Fensters oder Bildschirms. Außerdem blenden Apps häufig den Mauszeiger aus, da die Position des Cursors in Bezug auf die Bildschirmkoordinaten beim Bearbeiten eines 3D-Objekts oder einer Szene nicht relevant ist.

Wenn der Benutzer eine Aktion ausführt, die die App in einen relativen 3D-Objekt-/Szenenbearbeitungsmodus verschiebt, muss die App:

  • Standard-Mausbehandlung ignorieren.
  • Aktivieren Sie die relative Mausbehandlung.
  • Blenden Sie den Mauscursor aus, indem Sie ihn als Nullzeiger (nullptr) festlegen.

Wenn der Benutzer eine Aktion ausführt, die die App aus einem relativen 3D-Objekt-/Szenenbearbeitungsmodus verschiebt, muss die App:

  • Aktivieren Sie die Standard-/absolute Mausbehandlung.
  • Deaktivieren Sie die relative Mausbehandlung.
  • Legen Sie den Mauscursor auf einen Wert ungleich Null fest (wodurch er sichtbar wird).

Hinweis
Bei diesem Muster wird die Position des absoluten Mauscursors beim Eingeben des cursorlosen relativen Modus beibehalten. Der Cursor wird wieder an derselben Bildschirmkoordinatenposition angezeigt wie zuvor, um den relativen Mausbewegungsmodus zu aktivieren.

Behandeln relativer Mausbewegungen

Um auf relative Mausdeltawerte zuzugreifen, registrieren Sie sich wie hier gezeigt für das MouseDevice::MouseMoved-Ereignis .



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

Der Ereignishandler in diesem Codebeispiel, OnMouseMoved, rendert die Ansicht basierend auf den Bewegungen der Maus. Die Position des Mauszeigers wird als MouseEventArgs-Objekt an den Handler übergeben.

Überspringen Sie die Verarbeitung absoluter Mausdaten aus dem CoreWindow::P ointerMoved-Ereignis , wenn sich Die App ändert, um relative Mausbewegungswerte zu behandeln. Überspringen Sie diese Eingabe jedoch nur, wenn das CoreWindow::P ointerMoved-Ereignis als Ergebnis der Mauseingabe (im Gegensatz zur Toucheingabe) aufgetreten ist. Der Cursor wird ausgeblendet, indem der CoreWindow::P ointerCursor auf nullptr festgelegt wird.

Zurück zur absoluten Mausbewegung

Wenn die App den Bearbeitungsmodus für 3D-Objekte oder Szenen verlässt und keine relative Mausbewegung mehr verwendet (z. B. wenn sie zu einem Menübildschirm zurückkehrt), kehren Sie zur normalen Verarbeitung der absoluten Mausbewegung zurück. Beenden Sie das Lesen relativer Mausdaten, starten Sie die Verarbeitung von Standard-Mausereignissen (und Zeigerereignissen) neu, und legen Sie "CoreWindow::P ointerCursor " auf einen Wert ungleich NULL fest.

Hinweis
Wenn sich Ihre App im Bearbeitungsmodus für 3D-Objekte/Szenen befindet (die verarbeitung relativer Mausbewegungen mit dem Cursor deaktiviert), kann die Maus keine Randbenutzeroberfläche wie Charms, Hintergrundstapel oder App-Leiste aufrufen. Daher ist es wichtig, einen Mechanismus zum Beenden dieses bestimmten Modus bereitzustellen, z. B. den häufig verwendeten ESC-Schlüssel .