Eu tenho um controlador XBox360 que gostaria de usar como entrada para um aplicativo.
O que não consigo descobrir é a melhor maneira de expor isso por meio de uma interface.
Nos bastidores, a classe que lida com o (s) controlador (es) depende do estado do botão de busca.
Inicialmente, tentei algo link:
Event ButtonPressed() as ButtonEnum
onde ButtonEnum
estava ButtonRed
, ButtonStart
, etc ...
Isso é um pouco limitado, pois suporta apenas pressionamentos de botão, não mantém / padrões (pressione duas vezes, etc.)
A próxima idéia era simplesmente expor o estado do botão ao aplicativo, por exemplo
Property RedPressed as Boolean
Property StartPressed as Boolean
Property Thumb1XAxis as Double
Isso é muito flexível, mas na verdade força muito trabalho no aplicativo e exige que ele seja pesquisado - eu preferiria o evento, se possível.
Eu considerei adicionar vários eventos, por exemplo:
Event ButtonPressed(Button as ButtonEnum)
Event ButtonPressedTwice(Button as ButtonEnum)
Event ButtonHeldStart(Button as ButtonEnum)
Event ButtonHeldEnd(Button as ButtonEnum)
mas isso parece um pouco desajeitado e foi uma dor real na tela "Botão de ligação".
Alguém pode me indicar a maneira "correta" de lidar com as entradas dos controladores.
NB: Estou usando o SlimDX dentro da classe que implementa a interface. Isso me permite ler o estado com muita facilidade. Quaisquer alternativas que resolveriam meu problema também são apreciadas
Honestamente, eu diria que a interface ideal dependeria muito do uso no jogo. No entanto, para um cenário de uso geral, sugiro uma arquitetura de duas camadas que separa abordagens baseadas em eventos e em pesquisas.
A camada inferior pode ser considerada a camada "baseada em pesquisa" e expõe o estado atual de um botão. Uma dessas interfaces poderia simplesmente ter 2 funções,
GetAnalogState(InputIdentifier)
eGetDigitalState(InputIdentifier)
ondeInputIdentifier
está um valor enumerado que representa qual botão, gatilho ou stick você está checando. (Executar GetAnalogState para um botão retornaria 1.0 ou 0.0 e executar GetDigitalState para um stick analógico retornaria true se acima de um limite predefinido ou false caso contrário).A segunda camada usaria a camada inferior para gerar eventos após a mudança de estado e permitir que os elementos se registrassem para retornos de chamada (os eventos C # são gloriosos). Esses retornos de chamada incluem eventos de imprensa, liberação, toque, pressão longa, etc. Para um stick analógico, você pode incluir gestos, por exemplo, QCF para um jogo de luta. O número de eventos expostos dependeria do detalhamento de um evento que você deseja despachar. Você poderia simplesmente disparar um simples
ButtonStateChanged(InputIdentifier)
se quisesse lidar com todo o resto em uma lógica separada.Portanto, se você precisou verificar o estado atual de um botão de entrada ou controle, verifique a camada inferior. Se você deseja simplesmente disparar uma função em um evento de entrada, registre-se para um retorno de chamada da segunda camada.
fonte