Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En esta página se describen los conceptos básicos de la programación para los sticks piloto certificados para Xbox One mediante Windows.Gaming.Input.FlightStick y las API relacionadas para la Plataforma universal de Windows (UWP).
Al leer esta página, aprenderá lo siguiente:
- cómo recopilar una lista de sticks piloto conectados y sus usuarios
- cómo detectar si se ha agregado o quitado un joystick de vuelo
- cómo leer la entrada de uno o varios sticks piloto
- cómo se comportan las palancas de vuelo como dispositivos de navegación de la interfaz de usuario
Información general
Los joysticks de vuelo son periféricos de juego valorados por su capacidad para emular la sensación de una cabina de avión o nave espacial. Son el dispositivo de entrada perfecto para un control rápido y preciso del vuelo. Los joysticks se admiten en aplicaciones de Windows 10, Windows 11 y Xbox One a través del espacio de nombres Windows.Gaming.Input.
Los sticks de vuelo certificados para Xbox One están equipados con los siguientes controles:
- Un joystick analógico girable capaz de girar, inclinar y girar
- Un acelerador analógico
- Dos botones de encendido
- Un conmutador de sombrero digital de 8 vías
- Botones Ver y Menú
Nota:
Los botones y menú
Navegación de la interfaz de usuario
Para facilitar la carga de admitir los diferentes dispositivos de entrada para la navegación de la interfaz de usuario y fomentar la coherencia entre juegos y dispositivos, la mayoría de los dispositivos físicos entrada actúan simultáneamente como dispositivos de entrada de lógicos separados denominados controladores de navegación de la interfaz de usuario . El controlador de navegación de la interfaz de usuario proporciona un vocabulario común para los comandos de navegación de la interfaz de usuario en todos los dispositivos de entrada.
Como controlador de navegación de la interfaz de usuario, un joystick de vuelo mapea el conjunto de comandos de navegación necesarios al joystick y los botones View, Menu, FirePrimary, y de FireSecondary.
Comando de navegación | Entrada del joystick de vuelo |
---|---|
Hacia arriba | Joystick hacia arriba |
Abajo | Mueve el joystick hacia abajo |
Izquierda | Joystick izquierdo |
Derecha | Joystick a la derecha |
Vista | Ver botón |
Menú | Botón del menú |
Aceptar | Botón FirePrimary |
Cancelar | Botón |
Los sticks de vuelo no asignan ningún comando de navegación del conjunto opcional .
Detectar y realizar un seguimiento de los sticks piloto
La detección y el seguimiento de los sticks de vuelo funciona exactamente de la misma manera que para los controladores de juegos, excepto con la clase FlightStick en lugar de la clase Gamepad. Consulta mando de juegos y vibración para obtener más información.
Leer la palanca de vuelo
Después de identificar el stick de vuelo que le interesa, puede empezar a recopilar datos de él. Sin embargo, a diferencia de algunos otros tipos de entrada a los que podrías estar acostumbrado, los joysticks no comunican el cambio de estado al generar eventos. En cambio, tomas lecturas regulares de su estado actual mediante sondeándolos.
Sondear el stick piloto
El sondeo captura una instantánea del stick de vuelo 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, ya que su lógica normalmente se ejecuta en un bucle determinista en lugar de estar controlado por eventos. También suele ser más sencillo interpretar los comandos de juego de las entradas recopiladas de una vez que de múltiples entradas individuales recopiladas a lo largo del tiempo.
Sondea un stick piloto llamando a FlightStick.GetCurrentReading. Esta función devuelve un FlightStickReading que contiene el estado del joystick.
En el ejemplo siguiente se sondea un stick piloto por su estado actual:
auto flightStick = myFlightSticks->GetAt(0);
FlightStickReading reading = flightStick->GetCurrentReading();
Además del estado de la palanca de vuelo, cada lectura incluye una marca de tiempo que indica exactamente cuándo se recuperó el estado. La marca de tiempo es útil para relacionarse con el tiempo de lecturas anteriores o con el tiempo de la simulación del juego.
Lectura del joystick y la entrada del acelerador
El joystick proporciona una lectura analógica entre -1.0 y 1.0 en los ejes X, Y y Z (roll, pitch y yaw, respectivamente). Para el giro, un valor de -1.0 corresponde a la posición del joystick más a la izquierda, mientras que un valor de 1.0 corresponde a la posición más a la derecha. En el caso de la inclinación, un valor de -1,0 corresponde a la posición del joystick inferior, mientras que un valor de 1,0 corresponde a la posición más alta. Para el giro, un valor de -1,0 corresponde a la posición más contraria a las agujas del reloj, la posición torcida, mientras que un valor de 1,0 corresponde a la posición más en sentido de las agujas del reloj.
En todos los ejes, el valor es aproximadamente 0,0 cuando el joystick está en la posición central, pero es normal que el valor preciso varíe, incluso entre las lecturas posteriores. Las estrategias para mitigar esta variación se describen más adelante en esta sección.
El valor del alabeo del joystick se lee de la propiedad FlightStickReading.Roll, el valor del tono se lee desde la propiedad FlightStickReading.Pitch y el valor de la guiñada se lee desde la propiedad FlightStickReading.Yaw.
// Each variable will contain a value between -1.0 and 1.0.
float roll = reading.Roll;
float pitch = reading.Pitch;
float yaw = reading.Yaw;
Al leer los valores del joystick, observará que no producen una lectura neutra de 0,0 cuando el joystick está en reposo en la posición central; en su lugar, generarán valores diferentes cerca de 0,0 cada vez que el joystick se mueve y se devuelve a la posición central. Para mitigar estas variaciones, puede implementar una pequeña zona muerta, que es un intervalo de valores cerca de la posición central ideal que se omite.
Una manera de implementar una zona muerta es determinar hasta dónde se ha movido el joystick desde el centro y omitir las lecturas que están más cerca de alguna distancia que elija. Puedes calcular la distancia aproximadamente; no es exacta porque las lecturas del joystick son esencialmente polares, no planas, simplemente usando el teorema de Pitágoras. Esto produce una zona muerta radial.
En el ejemplo siguiente se muestra una zona muerta radial básica mediante el teorema pythagoriano:
// Choose a deadzone. Readings inside this radius are ignored.
const float deadzoneRadius = 0.1f;
const float deadzoneSquared = deadzoneRadius * deadzoneRadius;
// Pythagorean theorem: For a right triangle, hypotenuse^2 = (opposite side)^2 + (adjacent side)^2
float oppositeSquared = pitch * pitch;
float adjacentSquared = roll * roll;
// Accept and process input if true; otherwise, reject and ignore it.
if ((oppositeSquared + adjacentSquared) < deadzoneSquared)
{
// Input accepted, process it.
}
Leer los botones y el conmutador de sombrero
Cada uno de los dos botones de disparo del stick de vuelo proporciona una lectura digital que indica si está presionado (abajo) o liberado (arriba). Para mejorar la eficacia, las lecturas de botones no se representan como valores booleanos individuales; en su lugar, se empaquetan en un solo campo de bits representado por la enumeración flightStickButtons
Nota:
Los joysticks de vuelo están equipados con botones adicionales que se usan para la navegación de la interfaz de usuario, como los botones Ver y Menú. Estos botones no forman parte de la enumeración FlightStickButtons
y solo se pueden leer accediendo al joystick como dispositivo de navegación de UI. Para obtener más información, consulte controlador de navegación UI.
Los valores del botón se leen desde la propiedad FlightStickReading.Buttons. Dado que esta propiedad es un campo 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, se libera (arriba).
En el ejemplo siguiente se determina si se presiona el botón FirePrimary:
if (FlightStickButtons::FirePrimary == (reading.Buttons & FlightStickButtons::FirePrimary))
{
// FirePrimary is pressed.
}
En el siguiente ejemplo se determina si se suelta el botón FirePrimary:
if (FlightStickButtons::None == (reading.Buttons & FlightStickButtons::FirePrimary))
{
// FirePrimary is released (not pressed).
}
A veces, es posible que desee determinar cuándo un botón pasa de estar presionado a liberado o viceversa, si varios botones se presionan o se liberan, o si un conjunto de botones están dispuestos de una manera particular: algunos presionados, otros no. Para obtener información sobre cómo detectar cada una de estas condiciones, vea Detectar transiciones de botón y Detectar arreglos de botón complejos.
El valor del hat switch se lee de la propiedad FlightStickReading.HatSwitch. Dado que esta propiedad también es un campo de bits, el enmascaramiento bit a bit se usa nuevamente para aislar la posición del interruptor 'hat'.
En el ejemplo siguiente se determina si el conmutador de sombrero está en la posición ascendente:
if (GameControllerSwitchPosition::Up == (reading.HatSwitch & GameControllerSwitchPosition::Up))
{
// The hat switch is in the up position.
}
En el ejemplo siguiente se determina si el conmutador de sombrero está en la posición central:
if (GameControllerSwitchPosition::Center == (reading.HatSwitch & GameControllerSwitchPosition::Center))
{
// The hat switch is in the center position.
}