Estou tentando permitir que o player pressione qualquer botão para continuar na página principal. Consegui fazer isso fazendo uma Lista de botões, passando por eles e verificando se um deles estava inativo; no entanto, sinto que esse código é meio feio e me pergunto se existe uma maneira mais simples de fazer isso em que simplesmente não estou pensando?
Aqui está o que meu código se parece agora:
if (GamePad.GetState(PlayerIndex.One).IsConnected)
{
var buttonList = new List<Buttons>()
{
{Buttons.A},
{Buttons.B},
{Buttons.Y},
{Buttons.X},
{Buttons.Start},
{Buttons.Back},
{Buttons.RightShoulder},
{Buttons.LeftShoulder},
{Buttons.RightTrigger},
{Buttons.LeftTrigger}
};
foreach (var button in buttonList)
{
if (GamePad.GetState(PlayerIndex.One).IsButtonDown(button))
ExitMainMenu= true;
}
}
Respostas:
Isso deve fazer o trabalho. No final de cada loop de atualização, salve o estado de
previousGamePadState
. Então você pode compará-los. Esta é uma maneira rápida de detectar alterações. Não há necessidade de loop.GamePadState.PacketNumber :
Você pode usar o PacketNumber para determinar se o estado de entrada foi alterado. Se o valor de PacketNumber permanecer o mesmo entre duas chamadas seqüenciais para GetState, não houve alteração na entrada.
EDIT: Alterado para o método. Não é garantido que funcione corretamente como está, mas deve funcionar. Além disso, como isso realmente detecta alterações na entrada, por isso, se o usuário libera o botão, isso também é visto. Eu também adicionei
if
para detectar o movimento do dedo polegar, para que você possa ignorá-los pelo menos.Espero que isso ajude você. Deixe-me saber, se não atender às suas necessidades, tenho certeza de que podemos resolver isso.
Como detectar se um botão do controlador foi pressionado neste quadro Propriedade GamePadState.PacketNumber
fonte
GamePadState
eenum Buttons
, que é mais próximo do contexto que o OP parece estar usando.Se você não se importa com o uso do Reflection, pode usar algo assim (possivelmente até exatamente isso):
fonte
Você pode construir
GamePadState
manualmente um vazio e, em seguida, verificar a igualdade (in) com o real atual, que você busca chamandoGamePad.GetState
.fonte
Equals
é diferente; ele compara duas referências por ser a mesma instância. MasGamePadState
sobrecarrega o operador == para comparar seus valores, aos quais vinculei na minha resposta (op_Equality
).Como Buttons é uma enumaration, você pode usar o método Enum.GetValues como este:
fonte