// get the state of the virtual gamepad
        public static KAGamePadState GetState(PlayerIndex player)
        {
            // create the gamepad state instance
            KAGamePadState state =
                new KAGamePadState(GamePad.GetState(player));

            // append the state of mapped keyboard keys (if any)
            KeyMapHelper.ProcessKeyboardInput(player, state);

            // return the composite state
            return state;
        }
        // augment state data from the physical gamepad (if any) with
        // mapped keyboard state data (if any)
        public static void ProcessKeyboardInput(
            PlayerIndex player, KAGamePadState state)
        {
            // set the connection state for the virtual controller
            state.IsConnected = KeyMapHelper.IsConnected(player);

            // if the specified player has keyboard mappings, process them
            if (HasMappings(player))
            {
                // get the current state of the keyboard
                KeyboardState keyState = Keyboard.GetState();

                // get the key mappings (if any) for the specified player
                KeyMap mapper = KeyMapHelper.KeyMaps[player];

                // update digital button state data
                state.Buttons.A = mapper.GetButtonState(
                    keyState,
                    state.Buttons.A,
                    PadButtons.A);
                state.Buttons.B = mapper.GetButtonState(
                    keyState,
                    state.Buttons.B,
                    PadButtons.B);
                state.Buttons.Back = mapper.GetButtonState(
                    keyState,
                    state.Buttons.Back,
                    PadButtons.Back);
                state.Buttons.LeftShoulder = mapper.GetButtonState(
                    keyState,
                    state.Buttons.LeftShoulder,
                    PadButtons.ShoulderLeft);
                state.Buttons.LeftStick = mapper.GetButtonState(
                    keyState,
                    state.Buttons.LeftStick,
                    PadButtons.ThumbLeft);
                state.Buttons.RightShoulder = mapper.GetButtonState(
                    keyState,
                    state.Buttons.RightShoulder,
                    PadButtons.ShoulderRight);
                state.Buttons.RightStick = mapper.GetButtonState(
                    keyState,
                    state.Buttons.RightStick,
                    PadButtons.ThumbRight);
                state.Buttons.Start = mapper.GetButtonState(
                    keyState,
                    state.Buttons.Start,
                    PadButtons.Start);
                state.Buttons.X = mapper.GetButtonState(
                    keyState,
                    state.Buttons.X,
                    PadButtons.X);
                state.Buttons.Y = mapper.GetButtonState(
                    keyState,
                    state.Buttons.Y,
                    PadButtons.Y);

                // update directional button state data
                state.DPad.Down = mapper.GetButtonState(
                    keyState,
                    state.DPad.Down,
                    PadButtons.DPadDown);
                state.DPad.Left = mapper.GetButtonState(
                    keyState,
                    state.DPad.Left,
                    PadButtons.DPadLeft);
                state.DPad.Right = mapper.GetButtonState(
                    keyState,
                    state.DPad.Right,
                    PadButtons.DPadRight);
                state.DPad.Up = mapper.GetButtonState(
                    keyState,
                    state.DPad.Up,
                    PadButtons.DPadUp);

                // update trigger state data
                state.Triggers.Left = mapper.GetTriggerState(
                    keyState,
                    state.Triggers.Left,
                    PadButtons.TriggerLeft);
                state.Triggers.Right = mapper.GetTriggerState(
                    keyState,
                    state.Triggers.Right,
                    PadButtons.TriggerRight);

                // update thumbtick state data (left)
                Vector2 stick = state.ThumbSticks.Left;
                stick.X = mapper.GetStickState(
                    keyState,
                    stick.X,
                    PadButtons.ThumbLeftLeft,
                    PadButtons.ThumbLeftRight);
                stick.Y = mapper.GetStickState(
                    keyState,
                    stick.Y,
                    PadButtons.ThumbLeftDown,
                    PadButtons.ThumbLeftUp);
                state.ThumbSticks.Left = stick;

                // update thumbtick state data (right)
                stick = state.ThumbSticks.Right;
                stick.X = mapper.GetStickState(
                    keyState,
                    stick.X,
                    PadButtons.ThumbRightLeft,
                    PadButtons.ThumbRightRight);
                stick.Y = mapper.GetStickState(
                    keyState,
                    stick.Y,
                    PadButtons.ThumbRightDown,
                    PadButtons.ThumbRightUp);
                state.ThumbSticks.Right = stick;
            }
        }
Beispiel #3
0
        /// <summary>
        /// Allows the game to run logic such as updating the world,
        /// checking for collisions, gathering input, and playing audio.
        /// </summary>
        /// <param name="gameTime">Provides a snapshot of timing values.</param>
        protected override void Update(GameTime gameTime)
        {
            // capture pad state once per frame
            m_pad1 = KAGamePad.GetState(PlayerIndex.One);
            m_pad2 = KAGamePad.GetState(PlayerIndex.Two);
            m_pad3 = KAGamePad.GetState(PlayerIndex.Three);
            m_pad4 = KAGamePad.GetState(PlayerIndex.Four);

            // only process input from player one, and only if
            // the controller is connected
            if (m_pad1.IsConnected)
            {
                // combine states to rotate left, true if any is pressed
                bool bLeft = m_pad1.DPad.Left == ButtonState.Pressed;
                bLeft |= m_pad1.ThumbSticks.Left.X < 0;
                bLeft |= m_pad1.ThumbSticks.Right.X < 0;
                if (bLeft) { m_angle -= 5.0f; }

                // combine states to rotate right, true if any is pressed
                bool bRight = m_pad1.DPad.Right == ButtonState.Pressed;
                bRight |= m_pad1.ThumbSticks.Left.X > 0;
                bRight |= m_pad1.ThumbSticks.Right.X > 0;
                if (bRight) { m_angle += 5.0f; }

                // distance to travel per frame, split into X and Y
                float dx = (float)Math.Cos(m_angle * ToRadians);
                float dy = (float)Math.Sin(m_angle * ToRadians);

                // check button states to determine thrust
                float fMove = 0.0f; // assume no movement

                // is the player moving the ship?
                if (m_pad1.ThumbSticks.Left.Y != 0.0f)
                {
                    fMove = m_pad1.ThumbSticks.Left.Y;
                }
                else if (m_pad1.ThumbSticks.Right.Y != 0.0f)
                {
                    fMove = m_pad1.ThumbSticks.Right.Y;
                }
                else if (m_pad1.Triggers.Right != 0.0f)
                {
                    fMove = m_pad1.Triggers.Right;
                }
                else if (m_pad1.Triggers.Left != 0.0f)
                {
                    fMove = -m_pad1.Triggers.Left;
                }
                else if (m_pad1.DPad.Up == ButtonState.Pressed)
                {
                    // treat as max thumbstick Y
                    fMove = 1.0f;
                }
                else if (m_pad1.DPad.Down == ButtonState.Pressed)
                {
                    // treat as min thumbstick Y
                    fMove = -1.0f;
                }

                // ship's thrust is relative to analog button states
                m_GraphOrigin.X -= dx * fMove;
                m_GraphOrigin.Y -= dy * fMove;

                // make sure that 0 <= graph origin x <= 50
                while (m_GraphOrigin.X < 0.0f)
                {
                    m_GraphOrigin.X += 50.0f;
                }
                while (m_GraphOrigin.X > 50.0f)
                {
                    m_GraphOrigin.X -= 50.0f;
                }

                // make sure that 0 <= graph origin y <= 50
                while (m_GraphOrigin.Y < 0.0f)
                {
                    m_GraphOrigin.Y += 50.0f;
                }
                while (m_GraphOrigin.Y > 50.0f)
                {
                    m_GraphOrigin.Y -= 50.0f;
                }

                // shake the controller while the A button is pressed
                if (m_pad1.Buttons.A == ButtonState.Pressed)
                {
                    GamePad.SetVibration(PlayerIndex.One, 1.0f, 1.0f);
                }
                else
                {
                    GamePad.SetVibration(PlayerIndex.One, 0f, 0f);
                }
            }

            base.Update(gameTime);
        }
 // are the two specified instances the same?
 public static bool AreSame(KAGamePadState state1, KAGamePadState state2)
 {
     return
         state1.Buttons == state2.Buttons &&
         state1.DPad == state2.DPad &&
         state1.IsConnected == state2.IsConnected &&
         state1.ThumbSticks == state2.ThumbSticks &&
         state1.Triggers == state2.Triggers;
 }