Detección de presiones en un botón del mando Xbox 360 (Xbox 360, Windows)

XNA Game Studio 4.0

En este tema, se muestra cómo comprobar si un botón digital se mantiene presionado en este momento. Por cada bucle de actualización en el que el botón A permanezca presionado, el controlador aumentará la vibración. Para detectar solo la primera vez que se presiona un botón y omitir si el botón se mantiene presionado, por ejemplo, cuando desea probar la rapidez con la que un jugador presiona un botón, vea Detección de la presión de un botón del mando Xbox 360 en el marco actual (Xbox 360, Windows).

Muestra completa

El código de este tema muestra la técnica para detectar si un usuario presionó un botón digital del mando. Puede descargar una muestra de código completa de este tema, incluidos el código fuente completo y todos los archivos auxiliares que requiere la muestra.

Bb203900.note(es-ES,XNAGameStudio.40).gifSugerencia
Esta técnica se menciona en el juego FuelCell, un juego desarrollado mediante el seguimiento de una serie de artículos sobre el tema del desarrollo de juegos básicos en 3D. Para obtener más información, vea FuelCell: ¿Cuál es mi motivación?.

Detección de la posición actual del botón del controlador

Para detectar si un botón del controlador está presionado

  1. Obtenga el estado del mando Xbox 360 mediante GetState.

  2. Compruebe que el mando está conectado mediante la propiedad IsConnected.

  3. Recupere los valores de los Buttons que desea comprobar.

    Si el estado actual es Pressed, el botón está presionado en este momento.

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
using Microsoft.Xna.Framework.Net;
using Microsoft.Xna.Framework.Storage;

namespace InputDetectSimple
{
    public class Game1 : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;

        public Game1()
        {
            graphics = new GraphicsDeviceManager(this);
        }

        protected override void Initialize()
        {
            base.Initialize();
        }

        protected override void LoadContent()
        {
        }

        protected override void UnloadContent()
        {
        }

        protected override void Update(GameTime gameTime)
        {
            // Allow the game to exit.
            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == 
                ButtonState.Pressed)
                this.Exit();

            UpdateInput();

            base.Update(gameTime);
        }

        float vibrationAmount = 0.0f;

        void UpdateInput()
        {
            // Get the current gamepad state.
            GamePadState currentState = GamePad.GetState(PlayerIndex.One);

            // Process input only if connected and button A is pressed.
            if (currentState.IsConnected && currentState.Buttons.A == 
                ButtonState.Pressed)
            {
                // Button A is currently being pressed; add vibration.
                vibrationAmount = 
                    MathHelper.Clamp(vibrationAmount + 0.03f, 0.0f, 1.0f);
                GamePad.SetVibration(PlayerIndex.One, 
                    vibrationAmount, vibrationAmount);
            }
            else
            {
                // Button A is not being pressed; subtract some vibration.
                vibrationAmount = 
                    MathHelper.Clamp(vibrationAmount - 0.05f, 0.0f, 1.0f);
                GamePad.SetVibration(PlayerIndex.One, 
                    vibrationAmount, vibrationAmount);
            }
        }

        protected override void Draw(GameTime gameTime)
        {
            graphics.GraphicsDevice.Clear(Color.CornflowerBlue);
            base.Draw(gameTime);
        }
    }
}
Mostrar: