Compartir a través de


Controlador de navegación de la interfaz de usuario

En esta página se describen los conceptos básicos de la programación para dispositivos de navegación de la interfaz de usuario mediante Windows.Gaming.Input.UINavigationController y las API relacionadas para la Plataforma universal de Windows (UWP).

Al leer esta página, aprenderá lo siguiente:

  • Recopilación de una lista de dispositivos de navegación de la interfaz de usuario conectados y sus usuarios
  • Cómo detectar que se ha agregado o quitado un dispositivo de navegación
  • Cómo leer la entrada de uno o varios dispositivos de navegación de la interfaz de usuario
  • Cómo se comportan los controladores para juegos y los sticks arcade como dispositivos de navegación

Introducción al controlador de navegación de la interfaz de usuario

Casi todos los juegos tienen al menos alguna interfaz de usuario que es independiente del juego, incluso si solo tiene menús previos o diálogos en el juego. Los jugadores deben poder navegar por esta interfaz de usuario con el dispositivo de entrada que hayan elegido, pero supone que los desarrolladores agreguen compatibilidad específica para cada tipo de dispositivo de entrada y también pueden introducir incoherencias entre juegos y dispositivos de entrada que confundan a los jugadores. Por estas razones, se creó la API UINavigationController .

Los controladores de navegación de la interfaz de usuario son dispositivos de entrada lógicos que existen para proporcionar un vocabulario de comandos comunes de navegación de la interfaz de usuario que pueden ser compatibles con una variedad de dispositivos de entrada físicos . Un controlador de navegación de la interfaz de usuario es simplemente una manera diferente de mirar un dispositivo de entrada físico; usamos el dispositivo de navegación para hacer referencia a cualquier dispositivo de entrada físico que se vea como un controlador de navegación. Al programar en un dispositivo de navegación en lugar de dispositivos de entrada específicos, los desarrolladores evitan la carga de admitir diferentes dispositivos de entrada y lograr la coherencia de forma predeterminada.

Dado que el número y la variedad de controles admitidos por cada tipo de dispositivo de entrada pueden ser tan diferentes y porque determinados dispositivos de entrada pueden querer admitir un conjunto más completo de comandos de navegación, la interfaz del controlador de navegación divide el vocabulario de los comandos en un conjunto necesario que contiene los comandos más comunes y esenciales, y un conjunto opcional que contiene comandos cómodos pero no esenciales. Todos los dispositivos de navegación admiten todos los comandos del conjunto necesario y pueden admitir todos, algunos o ninguno de los comandos del conjunto opcional.

Conjunto requerido

Los dispositivos de navegación deben admitir todos los comandos de navegación del conjunto necesario; estos son los comandos direccionales (arriba, abajo, izquierdo y derecho), ver, menú, aceptar y cancelar comandos.

Los comandos direccionales están diseñados para la navegación con foco XY principal entre elementos de interfaz de usuario únicos. Los comandos de vista y menú están diseñados para mostrar información del juego (a menudo momentánea, a veces modal) y para cambiar entre los contextos de juego y menú, respectivamente. Los comandos accept y cancel están diseñados para respuestas afirmativas (sí) y negativas (no), respectivamente.

En la tabla siguiente se resumen estos comandos y sus usos previstos, con ejemplos. | Comando | Uso previsto | -------:| --------------- | Arriba | Navegación con foco XY | Abajo | Navegación con foco XY hacia abajo | Izquierda | Navegación con foco XY a la izquierda | Derecha | Navegación con foco XY a la derecha | Ver | Mostrar información del juego (cuadro de mandos, estadísticas de juego, objetivos, mapa de mundo o área) | Menú | Menú principal/Pausa (configuración, estado, equipo, inventario, pausa) | Aceptar | Respuesta afirmativa (aceptar, avanzar, confirmar, iniciar, sí) | Cancelar | Respuesta negativa (rechazar, invertir, rechazar, detener, no)

Conjunto opcional

Los dispositivos de navegación también pueden admitir todos, algunos o ninguno de los comandos de navegación del conjunto opcional; estos son los comandos de paginación (arriba, abajo, izquierda y derecha), desplazamiento (arriba, abajo, izquierda y derecha) y contextual (contexto 1-4).

Los comandos contextuales están diseñados explícitamente para comandos específicos de la aplicación y accesos directos de navegación. Los comandos de paginación y desplazamiento están diseñados para la navegación rápida entre páginas o grupos de elementos de interfaz de usuario y para la navegación específica dentro de los elementos de la interfaz de usuario, respectivamente.

En la tabla siguiente se resumen estos comandos y sus usos previstos. | Comando | Uso previsto | -----------:| ------------ | PageUp | Saltar hacia arriba (hasta la página o grupo vertical superior/anterior) | PageDown | Saltar hacia abajo (hacia abajo/siguiente página vertical o grupo) | PageLeft | Saltar a la izquierda (a la página horizontal o grupo anterior o hacia la izquierda) | PageRight | Saltar hacia la derecha (hacia la derecha/siguiente página horizontal o grupo) | ScrollUp | Desplazarse hacia arriba (dentro del elemento de interfaz de usuario centrado o del grupo desplazable) | ScrollDown | Desplazarse hacia abajo (dentro del elemento de interfaz de usuario centrado o del grupo desplazable) | ScrollLeft | Desplazarse a la izquierda (dentro del elemento de interfaz de usuario centrado o del grupo desplazable) | ScrollRight | Desplazarse hacia la derecha (dentro del elemento de interfaz de usuario centrado o del grupo desplazable) | Context1 | Acción de contexto principal | Context2 | Acción de contexto secundario | Context3 | Tercera acción de contexto | Context4 | Cuarta acción de contexto

Nota Aunque un juego es gratuito para responder a cualquier comando con una función real diferente de su uso previsto, se debe evitar un comportamiento sorprendente. En concreto, no cambie la función real de un comando si necesita su uso previsto, intente asignar funciones nuevas al comando que tenga más sentido y asignar funciones equivalentes a comandos homólogos como PageUp/PageDown. Por último, tenga en cuenta qué comandos son compatibles con cada tipo de dispositivo de entrada y a qué controles están asignados, asegurándose de que los comandos críticos son accesibles desde todos los dispositivos.

Controlador para juegos, stick arcade y navegación con ruedas de carreras

Todos los dispositivos de entrada compatibles con el espacio de nombres Windows.Gaming.Input son dispositivos de navegación de la interfaz de usuario.

En la tabla siguiente se resume cómo se asigna el conjunto necesario de comandos de navegación a varios dispositivos de entrada.

Comando de navegación Entrada del controlador para juegos Entrada de stick arcade Entrada volante
Up (Arriba) Stick de la izquierda hacia arriba / D-pad arriba Stick hacia arriba Cruceta hacia arriba
Bajar Stick de pulgar izquierdo hacia abajo /D-pad abajo Stick hacia abajo Cruceta hacia abajo
Izquierda Stick de pulgar izquierdo a la izquierda/ D-pad a la izquierda Stick hacia la izquierda Cruceta hacia la izquierda
Right Stick de pulgar izquierdo a la derecha /D-pad a la derecha Stick hacia la derecha Cruceta hacia la derecha
Ver Botón Ver Botón Ver Botón Ver
Menú Botón Menú Botón de menú Botón Menú
Aceptar Botón A Botón Acción 1 Botón A
Cancelar Botón B Botón Acción 2 Botón B

En la tabla siguiente se resume cómo el conjunto opcional de comandos de navegación se asigna a varios dispositivos de entrada.

Comando de navegación Entrada del controlador para juegos Entrada de stick arcade Entrada volante
RePág Desencadenador izquierdo no compatible varía
AvPág Gatillo derecho no compatible varía
PageLeft Parachoques izquierdo no compatible varía
PageRight Parachoques derecho no compatible varía
ScrollUp Stick pulgar derecho hacia arriba no compatible varía
ScrollDown Stick pulgar derecho hacia abajo no compatible varía
ScrollLeft Stick pulgar derecho a la izquierda no compatible varía
ScrollRight Stick pulgar derecho a la derecha no compatible varía
Context1 Botón X no compatible Botón X (normalmente)
Context2 Botón Y no compatible Botón Y (normalmente)
Context3 Pulsación de palanca de pulgar izquierda no compatible varía
Context4 Pulsación de stick pulgar derecho no compatible varía

Detección y seguimiento de controladores de navegación de la interfaz de usuario

Aunque los controladores de navegación de la interfaz de usuario son dispositivos de entrada lógicos, son una representación de un dispositivo físico y los administra el sistema de la misma manera. No es necesario crearlos ni inicializarlos; El sistema proporciona una lista de los controladores de navegación de la interfaz de usuario conectados y los eventos que se le notificarán cuando se agrega o quita un controlador de navegación de la interfaz de usuario.

Lista de controladores de navegación de la interfaz de usuario

La clase UINavigationController proporciona una propiedad estática, UINavigationControllers, que es una lista de solo lectura de los dispositivos de navegación de la interfaz de usuario que están conectados actualmente. Dado que es posible que solo le interesen algunos de los dispositivos de navegación conectados, se recomienda mantener su propia colección en lugar de acceder a ellos a través de la UINavigationControllers propiedad .

En el ejemplo siguiente se copian todos los controladores de navegación de la interfaz de usuario conectados en una nueva colección.

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

Adición y eliminación de controladores de navegación de la interfaz de usuario

Cuando se agrega o quita un controlador de navegación de la interfaz de usuario, se generan los eventos UINavigationControllerAdded y UINavigationControllerRemoved . Puede registrar un controlador de eventos para estos eventos para realizar un seguimiento de los dispositivos de navegación que están conectados actualmente.

En el ejemplo siguiente se inicia el seguimiento de un dispositivo de navegación de la interfaz de usuario que se ha agregado.

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

En el ejemplo siguiente se detiene el seguimiento de un stick arcade que se ha quitado.

UINavigationController::UINavigationControllerRemoved += ref new EventHandler<UINavigationController^>(Platform::Object^, UINavigationController^ args)
{
    unsigned int indexRemoved;

    if(myNavigationControllers->IndexOf(args, &indexRemoved))
	{
        myNavigationControllers->RemoveAt(indexRemoved);
    }
}

Usuarios y auriculares

Cada dispositivo de navegación se puede asociar a una cuenta de usuario para vincular su identidad a su entrada y puede tener un casco conectado para facilitar el chat de voz o las características de navegación. Para obtener más información sobre cómo trabajar con usuarios y auriculares, ver Seguimiento de usuarios y sus dispositivos y Auriculares.

Lectura del controlador de navegación de la interfaz de usuario

Después de identificar el dispositivo de navegación de la interfaz de usuario que le interesa, está listo para recopilar la entrada de él. Sin embargo, a diferencia de otros tipos de entrada a los que podría usarse, los dispositivos de navegación no comunican el cambio de estado mediante la generación de eventos. En su lugar, se toman lecturas regulares de su estado actual sondeándolos.

Sondear el controlador de navegación de la interfaz de usuario

El sondeo captura una instantánea del dispositivo de navegación en un momento dado preciso. Este enfoque para la recopilación de entradas es una buena opción para la mayoría de los juegos porque su lógica normalmente se ejecuta en un bucle determinista en lugar de ser controlado por eventos; también suele ser más sencillo interpretar los comandos de juego de la entrada recopiladas a la vez que de muchas entradas únicas recopiladas a lo largo del tiempo.

Se sondea un dispositivo de navegación llamando a UINavigationController.GetCurrentReading; esta función devuelve un UINavigationReading que contiene el estado del dispositivo de navegación.

auto navigationController = myNavigationControllers[0];

UINavigationReading reading = navigationController->GetCurrentReading();

Lectura de los botones

Cada uno de los botones de navegación de la interfaz de usuario proporciona una lectura booleana que corresponde a si se presiona (hacia abajo) o se libera (hacia arriba). Para mejorar la eficacia, las lecturas de botón no se representan como valores booleanos individuales; en su lugar, se empaquetan en uno de los dos campos de bits representados por las enumeraciones RequiredUINavigationButtons y OptionalUINavigationButtons .

Los botones que pertenecen al conjunto necesario se leen desde la RequiredButtons propiedad de la estructura UINavigationReading ; los botones que pertenecen al conjunto opcional se leen desde la OptionalButtons propiedad . Dado que estas propiedades son campos de bits, el enmascaramiento bit a bit se usa para aislar el valor del botón que le interesa. El botón se presiona (abajo) cuando se establece el bit correspondiente; de lo contrario, su liberado (up).

En el ejemplo siguiente se determina si se presiona el botón Aceptar del conjunto necesario.

if (RequiredUINavigationButtons::Accept == (reading.RequiredButtons & RequiredUINavigationButtons::Accept))
{
    // Accept is pressed
}

En el ejemplo siguiente se determina si se libera el botón Aceptar del conjunto necesario.

if (RequiredUINavigationButtons::None == (reading.RequiredButtons & RequiredUINavigationButtons::Accept))
{
    // Accept is released (not pressed)
}

Asegúrese de usar la propiedad y OptionalUINavigationButtons la OptionalButtons enumeración al leer botones en el conjunto opcional.

En el ejemplo siguiente se determina si se presiona el botón Contexto 1 del conjunto opcional.

if (OptionalUINavigationButtons::Context1 == (reading.OptionalButtons & OptionalUINavigationButtons::Context1))
{
    // Context 1 is pressed
}

A veces, es posible que desee determinar cuándo un botón cambia de presionado a liberado o liberado a presionado, si se presionan o sueltan varios botones, o si se organiza un conjunto de botones de una manera determinada, algunos no. Para obtener información sobre cómo detectar estas condiciones, consulte Detección de transiciones de botón y Detección de arreglos complejos de botones.

Ejecución del ejemplo del controlador de navegación de la interfaz de usuario

El ejemplo InputInterfacingUWP (github) muestra cómo se comportan los diferentes dispositivos de entrada como controladores de navegación de la interfaz de usuario.

Consulte también

Windows.Gaming.Input.GamepadWindows.Gaming.Input.ArcadeStickWindows.Gaming.Input.RacingWheelWindows.Gaming.Input.IGameController