Share via


Movimento relativo do mouse e CoreWindow

Em jogos, o mouse é uma opção de controle comum que é familiar para muitos jogadores, além de ser essencial para muitos gêneros de jogos, incluindo atiradores em primeira e terceira pessoas, e jogos de estratégia em tempo real. Aqui discutimos a implementação de controles relativos de mouse, que não usam o cursor do sistema e não retornam coordenadas absolutas da tela; em vez disso, rastreiam o delta de pixel entre os movimentos do mouse.

Alguns apps, como jogos, usam o mouse como um dispositivo de entrada mais geral. Por exemplo, um modelador 3D pode usar a entrada de mouse para orientar um objeto 3D simulando um trackball virtual; ou um jogo pode usar o mouse para mudar a direção da câmera de visualização por meio de controles de mouse-look.

Nesses cenários, o aplicativo requer dados relativos do mouse. Os valores relativos do mouse representam a distância que o mouse se moveu desde o último quadro, em vez de valores absolutos da coordenada x-y em uma janela ou tela. Além disso, os aplicativos geralmente ocultam o cursor do mouse desde que a posição do cursor com relação às coordenadas da tela não seja relevante durante a manipulação de um objeto ou cena 3D.

Quando o usuário coloca o aplicativo em um modo de manipulação relativa de objeto/cena 3D, o aplicativo deve:

  • Ignorar a manipulação padrão do mouse.
  • Habilitar a manipulação relativa do mouse.
  • Ocultar o cursor do mouse definindo-o como ponteiro nulo (nullptr).

Quando o usuário retira o aplicativo de um modo de manipulação relativa de objeto/cena 3D, o aplicativo deve:

  • Habilitar a manipulação padrão/absoluta do mouse.
  • Desativar a manipulação relativa do mouse.
  • Definir o cursor do mouse como um valor que não seja nulo (o que o torna visível).

Observação
Com esse padrão, o local do cursor do mouse absoluto é preservado ao entrar no modo relativo sem cursor. O cursor reaparece no mesmo local da coordenada da tela como era antes da habilitação do modo de movimento relativa do mouse.

Manipulando o movimento relativo do mouse

Para acessar os valores delta relativos do mouse, registre o evento MouseDevice::MouseMoved conforme mostrado aqui.



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

O manipulador de eventos neste exemplo de código, OnMouseMoved, renderiza a visualização com base nos movimentos do mouse. A posição do ponteiro do mouse é transmitida para o manipulador como um objeto MouseEventArgs.

Pule o processamento de dados absolutos do mouse do evento CoreWindow::PointerMoved quando o aplicativo mudar para manipular valores de movimentos relativos do mouse. Entretanto, só pule essa entrada se o evento CoreWindow::PointerMoved tiver ocorrido como resultado da entrada do mouse (em oposição à entrada por toque). O cursor é ocultado ao definir o CoreWindow::PointerCursor como nullptr.

Retornando para o movimento absoluto do mouse

Quando o aplicativo sai do modo de manipulação de objeto ou cena 3D e deixa de usar o movimento relativo do mouse (como quando retorna para uma tela de menu), retorna para o processamento normal do movimento absoluto do mouse. Neste momento, para de ler os dados relativos do mouse, reinicia o processamento de eventos do mouse padrão (e ponteiro) e define o CoreWindow::PointerCursor como um valor que não é nulo.

Observação
Quando o aplicativo está no modo de manipulação de objeto/cena 3D (processamento de movimentos relativos do mouse com o cursor desativado), o mouse não pode chamar a interface do usuário da borda como os botões, pilha voltar ou barra de aplicativos. Portanto, é importante fornecer um mecanismo para sair desse modo específico, como a tecla Esc normalmente usada.