// 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; } }
/// <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; }