Контроллер навигации пользовательского интерфейса
На этой странице описаны основы программирования для устройств навигации пользовательского интерфейса с помощью Windows.Gaming.Input.UINavigationController и связанных API-интерфейсов для универсальная платформа Windows (UWP).
Прочитав эту страницу, вы узнаете:
- Как собрать список подключенных устройств навигации пользовательского интерфейса и пользователей
- Как определить, что устройство навигации было добавлено или удалено
- Чтение входных данных с одного или нескольких устройств навигации пользовательского интерфейса
- Как геймпады и аркадные палочки ведут себя как навигационные устройства
Обзор контроллера навигации пользовательского интерфейса
Почти все игры имеют по крайней мере некоторый пользовательский интерфейс, который отделен от игрового процесса, даже если его просто меню предварительной игры или диалоги в игре. Игроки должны иметь возможность перемещаться по этому пользовательскому интерфейсу с помощью любого выбранного устройства ввода, но он бремениет разработчикам добавить конкретную поддержку для каждого типа входного устройства, а также может привести к несоответствиям между играми и устройствами ввода, которые путают игроков. По этим причинам был создан API UINavigationController .
Контроллеры навигации пользовательского интерфейса — это логические устройства ввода, которые существуют для предоставления словаря распространенных команд навигации пользовательского интерфейса, которые могут поддерживаться различными физическими устройствами ввода. Контроллер навигации пользовательского интерфейса — это просто другой способ просмотра физического входного устройства. Мы используем устройство навигации для ссылки на любое физическое устройство ввода, которое просматривается как контроллер навигации. При программировании на устройстве навигации, а не на конкретных устройствах ввода разработчики не поддерживают разные устройства ввода и обеспечивают согласованность по умолчанию.
Так как количество и разнообразие элементов управления, поддерживаемых каждым типом устройства ввода, может быть таким разными, и поскольку некоторые устройства ввода могут поддерживать более широкий набор команд навигации, интерфейс контроллера навигации делит словарь команд на обязательный набор , содержащий самые распространенные и важные команды, и необязательный набор , содержащий удобные, но нетентичные команды. Все устройства навигации поддерживают каждую команду в требуемом наборе и могут поддерживать все, некоторые или ни одну из команд в необязательном наборе.
Обязательный набор
Устройства навигации должны поддерживать все команды навигации в требуемом наборе. Это направление (вверх, вниз, слева и справа), представление, меню, прием и отмена команд.
Команды направления предназначены для первичной навигации по фокусу XY между отдельными элементами пользовательского интерфейса. Команды представления и меню предназначены для отображения сведений о игровом процессе (часто моментально, иногда модально) и для переключения между игровым процессом и контекстами меню соответственно. Команды приема и отмены предназначены для утвердительных (да) и отрицательных ответов (нет) соответственно.
В следующей таблице приведены приведенные ниже команды и их предполагаемое использование с примерами. | Команда | Предполагаемое использование | -------:| --------------- | Вверх | Навигация по фокусу XY | Вниз | Навигация по фокусу XY вниз | Слева | Навигация по фокусу XY слева | Право | Навигация по фокусу XY справа | Вид | Отображение сведений о игровом процессе (табло, статистика игры, цели, карта мира или области) | Меню | Основное меню / Пауза (параметры, состояние, оборудование, инвентаризация, пауза) | Принять | Утвердительный ответ (принять, заранее, подтвердить, начать, да) | Отмена | Отрицательный ответ (отклонить, отменить, отклонить, остановить, нет)
Необязательный набор
Устройства навигации также могут поддерживать все, некоторые или ни одну из команд навигации в необязательном наборе. Это команды прокрутки (вверх, вниз, влево и вправо), прокрутка (вверх, вниз, влево и вправо) и контекстные (контекст 1-4).
Контекстные команды предназначены явным образом для команд для конкретных приложений и сочетаний клавиш навигации. Команды разбиения по страницам и прокрутке предназначены для быстрого перехода между страницами или группами элементов пользовательского интерфейса и для точной навигации в элементах пользовательского интерфейса соответственно.
В следующей таблице перечислены эти команды и их предполагаемое использование. | Команда | Предполагаемое использование | -----------:| ------------ | PageUp | Переход вверх (на верхнюю или предыдущую вертикальную страницу или группу) | PageDown | Переход вниз (к нижней или следующей вертикальной странице или группе) | PageLeft | Переход влево (на левую или предыдущую горизонтальную страницу или группу) | PageRight | Переход вправо (к правой или следующей горизонтальной странице или группе) | Прокрутка | Прокрутите вверх (в элементе пользовательского интерфейса или группе с прокруткой) | ScrollDown | Прокрутите вниз (в элементе пользовательского интерфейса или прокручиваемой группе) | ScrollLeft | Прокрутите влево (в элементе пользовательского интерфейса или группе с прокруткой) | ScrollRight | Прокрутка вправо (в элементе пользовательского интерфейса или группе с прокруткой) | Context1 | Основное действие контекста | Context2 | Дополнительное действие контекста | Context3 | Третье действие контекста | Context4 | Четвертое действие контекста
Обратите внимание , что игра бесплатна реагировать на любую команду с фактической функцией, отличной от ее предполагаемого использования, следует избежать удивительного поведения. В частности, не изменяйте фактическую функцию команды, если требуется его предполагаемое использование, попробуйте назначить новые функции команде, которая имеет наибольшее значение, и назначьте аналогичные функции аналогичным командам, таким как PageUp/PageDown. Наконец, рассмотрим, какие команды поддерживаются каждым типом устройства ввода и с которыми они сопоставляются, убедившись, что критически важные команды доступны на каждом устройстве.
Геймпад, аркадная палка и навигация по гоночному колесу
Все устройства ввода, поддерживаемые пространством имен Windows.Gaming.Input, — это устройства навигации пользовательского интерфейса.
В следующей таблице показано, как необходимый набор команд навигации сопоставляется с различными устройствами ввода.
Команда навигации | Входные данные геймпада | Входные данные с аркадной наклейкой | Входные данные гоночного колеса |
---|---|---|---|
Up | Левый палец вверх / D-pad up | Торчать | D-pad up |
Down | Левый палец вниз / D-pad down | Прилипнуть вниз | D-pad down |
Left | Левый палец слева / D-pad слева | Палка слева | D-pad слева |
Right | Левый палец справа / D-pad right | Палка вправо | D-pad right |
Представления | Кнопка "Просмотреть" | Кнопка "Просмотреть" | Кнопка "Просмотреть" |
Меню | Кнопка меню | Кнопка меню | Кнопка меню |
Accept | Кнопка | Кнопка "Действие 1" | Кнопка |
Отменить | Кнопка B | Кнопка "Действие 2" | Кнопка B |
В следующей таблице показано, как необязательный набор команд навигации сопоставляется с различными устройствами ввода.
Команда навигации | Входные данные геймпада | Входные данные с аркадной наклейкой | Входные данные гоночного колеса |
---|---|---|---|
PageUp | Левый триггер | не поддерживается | Различается |
PageDown | Правый триггер | не поддерживается | Различается |
PageLeft | Левый бампер | не поддерживается | Различается |
PageRight | Правый бампер | не поддерживается | Различается |
Прокрутка | Правый палец вверх | не поддерживается | Различается |
ScrollDown | Правый палец вниз | не поддерживается | Различается |
ScrollLeft | Правый палец слева | не поддерживается | Различается |
ScrollRight | Правый палец справа | не поддерживается | Различается |
Context1 | Кнопка X | не поддерживается | Кнопка X (обычно) |
Context2 | Кнопка Y | не поддерживается | Кнопка Y (обычно) |
Context3 | Нажатие левого отпечатка | не поддерживается | Различается |
Context4 | Нажатие правого отпечатка | не поддерживается | Различается |
Обнаружение и отслеживание контроллеров навигации пользовательского интерфейса
Хотя контроллеры навигации пользовательского интерфейса являются логическими устройствами ввода, они представляют собой физическое устройство и управляются системой таким же образом. Вам не нужно создавать или инициализировать их; Система предоставляет список подключенных контроллеров навигации пользовательского интерфейса и событий для уведомления о добавлении или удалении контроллера навигации пользовательского интерфейса.
Список контроллеров навигации пользовательского интерфейса
Класс UINavigationController предоставляет статическое свойство UINavigationControllers, которое является списком устройств навигации пользовательского интерфейса, подключенных только для чтения. Так как вы можете быть заинтересованы только в некоторых подключенных устройствах навигации, рекомендуется поддерживать собственную коллекцию вместо доступа к ним через UINavigationControllers
свойство.
В следующем примере все подключенные контроллеры навигации пользовательского интерфейса копируются в новую коллекцию.
auto myNavigationControllers = ref new Vector<UINavigationController^>();
for (auto device : UINavigationController::UINavigationControllers)
{
// This code assumes that you're interested in all navigation controllers.
myNavigationControllers->Append(device);
}
Добавление и удаление контроллеров навигации пользовательского интерфейса
При добавлении или удалении контроллера навигации пользовательского интерфейса возникают события UINavigationControllerAdded и UINavigationControllerRemoved . Вы можете зарегистрировать обработчик событий для этих событий, чтобы отслеживать устройства навигации, подключенные в данный момент.
В следующем примере начинается отслеживание добавленного устройства навигации пользовательского интерфейса.
UINavigationController::UINavigationControllerAdded += ref new EventHandler<UINavigationController^>(Platform::Object^, UINavigationController^ args)
{
// This code assumes that you're interested in all new navigation controllers.
myNavigationControllers->Append(args);
}
В следующем примере останавливается отслеживание аркадной палочки, которая была удалена.
UINavigationController::UINavigationControllerRemoved += ref new EventHandler<UINavigationController^>(Platform::Object^, UINavigationController^ args)
{
unsigned int indexRemoved;
if(myNavigationControllers->IndexOf(args, &indexRemoved))
{
myNavigationControllers->RemoveAt(indexRemoved);
}
}
Пользователи и гарнитуры
Каждое устройство навигации может быть связано с учетной записью пользователя, чтобы связать свое удостоверение с входными данными, и может быть подключена гарнитура для упрощения голосового чата или функций навигации. Дополнительные сведения о работе с пользователями и гарнитурами см. в статье "Отслеживание пользователей" и их устройств и гарнитуры.
Чтение контроллера навигации пользовательского интерфейса
После идентификации интересующего вас устройства навигации пользовательского интерфейса вы будете готовы собирать входные данные из него. Однако, в отличие от некоторых других типов входных данных, которые можно использовать, устройства навигации не взаимодействуют с изменением состояния, вызывая события. Вместо этого вы принимаете регулярные чтения их текущего состояния, опросив их.
Опрос контроллера навигации пользовательского интерфейса
Опрос записывает моментальный снимок устройства навигации в определенный момент времени. Такой подход к сбору входных данных подходит для большинства игр, так как их логика обычно выполняется в детерминированном цикле, а не на основе событий; его также, как правило, проще интерпретировать команды игры из входных данных, собранных одновременно, чем из многих отдельных входных данных, собранных с течением времени.
Вы опрашиваете устройство навигации путем вызова UINavigationController.GetCurrentReading. Эта функция возвращает uiNavigationReading, содержащую состояние устройства навигации.
auto navigationController = myNavigationControllers[0];
UINavigationReading reading = navigationController->GetCurrentReading();
Чтение кнопок
Каждая из кнопок навигации пользовательского интерфейса обеспечивает логическое чтение, соответствующее нажатию (вниз) или освобождению (вверх). Для повышения эффективности чтение кнопок не представлено в виде отдельных логических значений; вместо этого они все упакованы в один из двух битовых полей, представленных перечислениями RequiredUINavigationButtons и OptionalUINavigationButtons .
Кнопки, принадлежащие требуемому набору , считываются из RequiredButtons
свойства структуры UINavigationReading ; кнопки, принадлежащие к необязательному набору , считываются из OptionalButtons
свойства. Так как эти свойства являются битовых полей, побитовое маскирование используется для изоляции значения кнопки, которую вы интересуете. Кнопка нажимается (вниз) при установке соответствующего бита; в противном случае его выпущено (вверх).
В следующем примере определяется, нажимается ли кнопка "Принять" в требуемом наборе.
if (RequiredUINavigationButtons::Accept == (reading.RequiredButtons & RequiredUINavigationButtons::Accept))
{
// Accept is pressed
}
В следующем примере определяется, выпущена ли кнопка "Принять" в требуемом наборе.
if (RequiredUINavigationButtons::None == (reading.RequiredButtons & RequiredUINavigationButtons::Accept))
{
// Accept is released (not pressed)
}
Не забудьте использовать OptionalButtons
свойство и OptionalUINavigationButtons
перечисление при чтении кнопок в необязательном наборе.
В следующем примере определяется, нажимается ли кнопка Context 1 в необязательном наборе.
if (OptionalUINavigationButtons::Context1 == (reading.OptionalButtons & OptionalUINavigationButtons::Context1))
{
// Context 1 is pressed
}
Иногда может потребоваться определить, когда кнопка переходит с нажатия на нажатие или освобождение на нажатие, если несколько кнопок нажимаются или освобождаются, или если набор кнопок упорядочивается определенным способом, некоторые не нажимаются. Сведения об обнаружении этих условий см. в разделе "Обнаружение переходов кнопок" и "Обнаружение сложных параметров кнопки".
Запуск примера контроллера навигации пользовательского интерфейса
Пример InputInterfacingUWP (github) показывает, как различные устройства ввода работают в качестве контроллеров навигации пользовательского интерфейса.
См. также
Windows.Gaming.Input.GamepadWindows.Gaming.Input.ArcadeStickWindows.Gaming.Input.RacingWheelWindows.Gaming.Input.IGameController