Mouvement relatif de la souris et CoreWindow

Dans les jeux, la souris est une option de contrôle commune qui est familière à de nombreux joueurs, et est également essentielle à de nombreux genres de jeux, y compris les tireurs de première et troisième personne, et les jeux de stratégie en temps réel. Ici, nous abordons l’implémentation des contrôles de souris relatifs, qui n’utilisent pas le curseur système et ne retournent pas de coordonnées d’écran absolues ; Au lieu de cela, ils suivent le delta de pixels entre les mouvements de la souris.

Certaines applications, telles que les jeux, utilisent la souris comme appareil d’entrée plus général. Par exemple, un modélisateur 3D peut utiliser l’entrée de la souris pour orienter un objet 3D en simulant un trackball virtuel ; ou un jeu peut utiliser la souris pour modifier la direction de l’appareil photo d’affichage via des contrôles d’apparence de la souris.

Dans ces scénarios, l’application nécessite des données relatives à la souris. Les valeurs relatives de la souris représentent la distance de déplacement de la souris depuis le dernier cadre, plutôt que les valeurs de coordonnées x-y absolues dans une fenêtre ou un écran. En outre, les applications masquent souvent le curseur de la souris, car la position du curseur par rapport aux coordonnées de l’écran n’est pas pertinente lors de la manipulation d’un objet ou d’une scène 3D.

Lorsque l’utilisateur effectue une action qui déplace l’application en mode de manipulation d’objet/scène 3D relatif, l’application doit :

  • Ignorez la gestion de la souris par défaut.
  • Activez la gestion relative de la souris.
  • Masquez le curseur de la souris en lui définissant un pointeur Null (nullptr).

Lorsque l’utilisateur effectue une action qui déplace l’application hors d’un mode de manipulation d’objet/scène 3D relatif, l’application doit :

  • Activez la gestion par défaut/absolue de la souris.
  • Désactivez la gestion relative de la souris.
  • Définissez le curseur de la souris sur une valeur non null (ce qui le rend visible).

Remarque
Avec ce modèle, l’emplacement du curseur absolu de la souris est conservé lors de l’entrée du mode relatif sans curseur. Le curseur apparaît à nouveau dans le même emplacement de coordonnées d’écran qu’il était antérieur à l’activation du mode de déplacement de la souris relative.

Gestion du mouvement relatif de la souris

Pour accéder aux valeurs delta relatives de la souris, inscrivez-vous à l’événement MouseDevice ::MouseMoved , comme indiqué ici.



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

Le gestionnaire d’événements dans cet exemple de code, OnMouseMoved, affiche la vue en fonction des mouvements de la souris. La position du pointeur de la souris est passée au gestionnaire en tant qu’objet MouseEventArgs .

Ignorez le traitement des données absolues de la souris à partir de l’événement CoreWindow ::P ointerMoved lorsque votre application passe à la gestion des valeurs de mouvement de souris relatives. Toutefois, ignorez cette entrée uniquement si l’événement CoreWindow ::P ointerMoved s’est produit à la suite de l’entrée de la souris (par opposition à l’entrée tactile). Le curseur est masqué en définissant CoreWindow ::P ointerCursor sur nullptr.

Retour au mouvement absolu de la souris

Lorsque l’application quitte le mode de manipulation d’objet ou de scène 3D et n’utilise plus le mouvement relatif de la souris (par exemple, lorsqu’elle retourne à un écran de menu), revenez au traitement normal du mouvement absolu de la souris. À ce stade, arrêtez la lecture des données relatives de la souris, redémarrez le traitement des événements de souris standard (et pointeur), puis définissez CoreWindow ::P ointerCursor sur une valeur non null.

Remarque
Lorsque votre application est en mode de manipulation d’objets/scène 3D (traitement des mouvements de souris relatifs avec le curseur désactivé), la souris ne peut pas appeler l’interface utilisateur de bord telle que les icônes, la pile arrière ou la barre d’application. Par conséquent, il est important de fournir un mécanisme pour quitter ce mode particulier, tel que la clé échap couramment utilisée.