Estoy tratando de permitir que el jugador presione cualquier botón para continuar desde la página principal. Pude hacer esto haciendo una Lista de botones y recorriéndolos y comprobando que uno de ellos no funcionara; sin embargo, siento que este código es un poco feo y me pregunto si hay una manera más simple de hacerlo que simplemente no estoy pensando.
Aquí está mi aspecto de mi código ahora:
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;
}
}
Respuestas:
Esto debería hacer el trabajo. Al final de cada ciclo de actualización, guarde el estado de
previousGamePadState
. Entonces puedes compararlos. Esta es una forma rápida de detectar cambios. No hay necesidad de bucle.GamePadState.PacketNumber :
Puede usar PacketNumber para determinar si el estado de entrada ha cambiado. Si el valor de PacketNumber permanece igual entre dos llamadas secuenciales a GetState, entonces no ha habido cambios en la entrada.
EDITAR: cambiado al método. No se garantiza que funcione correctamente como está, pero debería funcionar. Además, debido a que esto realmente detecta cambios en la entrada, por lo que si el usuario suelta el botón, también se ve con esto. También agregué
if
para detectar el movimiento del joystick, por lo que puede ignorarlos al menos.Espero que esto te ayude. Avíseme, si no se ajusta a sus necesidades, estoy seguro de que podemos resolverlo.
Cómo: Detectar si se ha presionado un botón del controlador Esta propiedad GamePadState.PacketNumber de marco
fuente
GamePadState
yenum Buttons
, que está más cerca del contexto que parece estar usando el OP.Si no le importa el uso de Reflection, puede usar algo como esto (posiblemente incluso esto exactamente):
fuente
Puede construir
GamePadState
manualmente un vacío , y luego verificarlo para (in) igualdad con el real actual, que obtiene llamandoGamePad.GetState
.fuente
Equals
es diferente; compara dos referencias por ser la misma instancia. PeroGamePadState
sobrecarga el operador == para comparar sus valores, a los que he vinculado en mi respuesta (op_Equality
).Como Buttons es una enumeración, puede usar el método Enum.GetValues de esta manera:
fuente