Поделиться через


Относительное перемещение мыши и CoreWindow

В играх мышь — это распространенный вариант управления, знакомый многим игрокам, и также очень важен для многих жанров игр, включая стрелок первого и третьего человека, и игры стратегии в режиме реального времени. Здесь мы обсудим реализацию относительных элементов управления мышью, которые не используют системный курсор и не возвращают абсолютные координаты экрана; вместо этого они отслеживают разностность пикселей между движениями мыши.

Некоторые приложения, такие как игры, используют мышь в качестве более общего устройства ввода. Например, модель 3-D может использовать входные данные мыши для ориентации трехмерного объекта путем имитации виртуального трекбола; или игра может использовать мышь для изменения направления камеры просмотра с помощью элементов управления мыши.

В этих сценариях приложению требуются относительные данные мыши. Относительные значения мыши представляют, насколько далеко мышь перемещается с последнего кадра, а не абсолютные значения координат x-y в окне или экране. Кроме того, приложения часто скрывают курсор мыши, так как позиция курсора относительно координат экрана не имеет значения при обработке трехмерного объекта или сцены.

Когда пользователь принимает действие, которое перемещает приложение в относительный режим обработки объектов или сцены, приложение должно:

  • Игнорировать обработку мыши по умолчанию.
  • Включите относительную обработку мыши.
  • Скрыть курсор мыши, задав для него указатель NULL (nullptr).

Когда пользователь принимает действие, которое перемещает приложение из относительного режима обработки объектов или сцены, приложение должно:

  • Включите обработку мыши по умолчанию или абсолютной мыши.
  • Отключите относительную обработку мыши.
  • Присвойте курсору мыши значение, отличное от NULL (что делает его видимым).

Примечание
При использовании этого шаблона расположение абсолютного курсора мыши сохраняется при вводе относительного режима без курсоров. Курсор снова отображается в том же расположении координат экрана, что и раньше, чтобы включить относительный режим перемещения мыши.

Обработка относительного перемещения мыши

Чтобы получить доступ к относительным значениям разностности мыши, зарегистрируйтесь для события MouseDevice::MouseMoved , как показано здесь.



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

Обработчик событий в этом примере кода OnMouseMoved отображает представление на основе движений мыши. Позиция указателя мыши передается обработчику в качестве объекта MouseEventArgs .

Пропустите обработку абсолютных данных мыши из события CoreWindow::P ointerMoved , когда приложение изменяется на обработку относительных значений перемещения мыши. Однако пропустить этот вход только в том случае, если событие CoreWindow::P ointerMoved произошло в результате ввода мыши (в отличие от сенсорного ввода). Курсор скрыт, задав CoreWindow::P ointerCursor значение nullptr.

Возврат к абсолютному перемещению мыши

Когда приложение выходит из режима обработки трехмерных объектов или сцен и больше не использует относительное перемещение мыши (например, когда оно возвращается на экран меню), вернитесь к нормальной обработке абсолютного перемещения мыши. В настоящее время остановите чтение относительных данных мыши, перезапустите обработку стандартных событий мыши (и указателя) и задайте Для CoreWindow::P ointerCursor значение, отличное от NULL.

Примечание
Если приложение находится в режиме обработки трехмерных объектов или сцен (обработка относительных движений мыши с помощью курсора), мышь не может вызывать граничный пользовательский интерфейс, например шармы, стек назад или панель приложений. Поэтому важно предоставить механизм выхода из этого конкретного режима, например часто используемый ключ ESC .