Tengo un controlador XBox360 que me gustaría usar como entrada para una aplicación.
Lo que no puedo resolver es la mejor forma de exponer esto a través de una interfaz.
Detrás de escena, la clase que maneja los controladores se basa en el estado del botón de sondeo.
Inicialmente probé algo enlace:
Event ButtonPressed() as ButtonEnum
donde ButtonEnum
estaba ButtonRed
, ButtonStart
etc ...
Esto es un poco limitado, ya que solo admite presionar botones, no retener / patrones (presionar dos veces, etc.)
La siguiente idea fue simplemente exponer el estado del botón a la aplicación, por ejemplo
Property RedPressed as Boolean
Property StartPressed as Boolean
Property Thumb1XAxis as Double
Esto es muy flexible, pero realmente obliga a trabajar demasiado en la aplicación y requiere que la aplicación realice una encuesta; preferiría que sea posible si se realiza un evento.
Pensé en agregar varios eventos, por ejemplo:
Event ButtonPressed(Button as ButtonEnum)
Event ButtonPressedTwice(Button as ButtonEnum)
Event ButtonHeldStart(Button as ButtonEnum)
Event ButtonHeldEnd(Button as ButtonEnum)
pero esto parece un poco torpe y fue un verdadero dolor en la pantalla "Botón de enlace".
¿Puede alguien indicarme la forma "correcta" de manejar las entradas de los controladores?
NB: estoy usando SlimDX dentro de la clase que implementa la interfaz. Esto me permite leer el estado muy fácilmente. Cualquier alternativa que resolvería mi problema también es apreciada
Honestamente, diría que la interfaz óptima dependería en gran medida del uso en el juego. Sin embargo, para un escenario de uso general, sugeriría una arquitectura de dos niveles que separa los enfoques basados en eventos y en encuestas.
El nivel inferior podría considerarse el nivel "basado en encuestas" y expone el estado actual de un botón. Una de esas interfaces podría simplemente tener 2 funciones,
GetAnalogState(InputIdentifier)
yGetDigitalState(InputIdentifier)
dondeInputIdentifier
hay un valor enumerado que representa con qué botón, disparador o palanca está comprobando. (La ejecución de GetAnalogState para un botón devolvería 1.0 o 0.0, y la ejecución de GetDigitalState para un dispositivo analógico devolvería verdadero si supera un umbral preestablecido o falso en caso contrario).El segundo nivel luego usaría el nivel inferior para generar eventos al cambiar el estado y permitir que los elementos se registren para devoluciones de llamada (los eventos de C # son gloriosos). Estas devoluciones de llamada incluirían eventos para prensa, lanzamiento, toque, larga duración, etc. Para un dispositivo analógico, podría incluir gestos, por ejemplo, QCF para un juego de lucha. El número de eventos expuestos dependerá de qué tan detallado sea el evento que desea enviar. Podrías disparar un simple
ButtonStateChanged(InputIdentifier)
si quisieras manejar todo lo demás en una lógica separada.Entonces, si necesita verificar el estado actual de un botón de entrada o una palanca de control, verifique el nivel inferior. Si desea simplemente activar una función en un evento de entrada, regístrese para una devolución de llamada desde el segundo nivel.
fuente