230 lines
9.0 KiB
C#
230 lines
9.0 KiB
C#
// MonoGame - Copyright (C) The MonoGame Team
|
|
// This file is subject to the terms and conditions defined in
|
|
// file 'LICENSE.txt', which is part of this source code package.
|
|
|
|
using GameController;
|
|
using System.Collections.Generic;
|
|
|
|
namespace Microsoft.Xna.Framework.Input
|
|
{
|
|
static partial class GamePad
|
|
{
|
|
private static int PlatformGetMaxNumberOfGamePads()
|
|
{
|
|
return 4;
|
|
}
|
|
|
|
static bool IndexIsUsed(GCControllerPlayerIndex index)
|
|
{
|
|
foreach (var ctrl in GCController.Controllers)
|
|
if (ctrl.PlayerIndex == (int)index) return true;
|
|
|
|
return false;
|
|
}
|
|
|
|
static void AssingIndex(GCControllerPlayerIndex index)
|
|
{
|
|
if (IndexIsUsed(index))
|
|
return;
|
|
foreach (var controller in GCController.Controllers)
|
|
{
|
|
if (controller.PlayerIndex == (int)index)
|
|
break;
|
|
if (controller.PlayerIndex == (int)GCControllerPlayerIndex.Unset)
|
|
{
|
|
controller.PlayerIndex = (int)index;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
private static GamePadCapabilities PlatformGetCapabilities(int index)
|
|
{
|
|
var ind = (GCControllerPlayerIndex)index;
|
|
|
|
AssingIndex(ind);
|
|
|
|
foreach (var controller in GCController.Controllers)
|
|
{
|
|
if (controller == null)
|
|
continue;
|
|
if (controller.PlayerIndex == (int)ind)
|
|
return GetCapabilities(controller);
|
|
}
|
|
return new GamePadCapabilities { IsConnected = false };
|
|
}
|
|
|
|
private static GamePadCapabilities GetCapabilities(GCController controller)
|
|
{
|
|
//All iOS controllers have these basics
|
|
var capabilities = new GamePadCapabilities()
|
|
{
|
|
IsConnected = false,
|
|
GamePadType = GamePadType.GamePad,
|
|
};
|
|
if (controller.ExtendedGamepad != null)
|
|
{
|
|
capabilities.HasAButton = true;
|
|
capabilities.HasBButton = true;
|
|
capabilities.HasXButton = true;
|
|
capabilities.HasYButton = true;
|
|
capabilities.HasBackButton = true;
|
|
capabilities.HasDPadUpButton = true;
|
|
capabilities.HasDPadDownButton = true;
|
|
capabilities.HasDPadLeftButton = true;
|
|
capabilities.HasDPadRightButton = true;
|
|
capabilities.HasLeftShoulderButton = true;
|
|
capabilities.HasRightShoulderButton = true;
|
|
capabilities.HasLeftTrigger = true;
|
|
capabilities.HasRightTrigger = true;
|
|
capabilities.HasLeftXThumbStick = true;
|
|
capabilities.HasLeftYThumbStick = true;
|
|
capabilities.HasRightXThumbStick = true;
|
|
capabilities.HasRightYThumbStick = true;
|
|
}
|
|
else if (controller.Gamepad != null)
|
|
{
|
|
capabilities.HasAButton = true;
|
|
capabilities.HasBButton = true;
|
|
capabilities.HasXButton = true;
|
|
capabilities.HasYButton = true;
|
|
capabilities.HasBackButton = true;
|
|
capabilities.HasDPadUpButton = true;
|
|
capabilities.HasDPadDownButton = true;
|
|
capabilities.HasDPadLeftButton = true;
|
|
capabilities.HasDPadRightButton = true;
|
|
capabilities.HasLeftShoulderButton = true;
|
|
capabilities.HasRightShoulderButton = true;
|
|
}
|
|
return capabilities;
|
|
}
|
|
|
|
private static GamePadState PlatformGetState(int index, GamePadDeadZone leftDeadZoneMode, GamePadDeadZone rightDeadZoneMode)
|
|
{
|
|
var ind = (GCControllerPlayerIndex)index;
|
|
|
|
|
|
Buttons buttons = 0;
|
|
bool connected = false;
|
|
ButtonState Up = ButtonState.Released;
|
|
ButtonState Down = ButtonState.Released;
|
|
ButtonState Left = ButtonState.Released;
|
|
ButtonState Right = ButtonState.Released;
|
|
|
|
Vector2 leftThumbStickPosition = Vector2.Zero;
|
|
Vector2 rightThumbStickPosition = Vector2.Zero;
|
|
|
|
float leftTriggerValue = 0;
|
|
float rightTriggerValue = 0;
|
|
|
|
AssingIndex(ind);
|
|
|
|
foreach (var controller in GCController.Controllers)
|
|
{
|
|
|
|
if (controller == null)
|
|
continue;
|
|
|
|
if (controller.PlayerIndex != (int)ind)
|
|
continue;
|
|
|
|
connected = true;
|
|
|
|
if (controller.ExtendedGamepad != null)
|
|
{
|
|
if (controller.ExtendedGamepad.ButtonA.IsPressed)
|
|
buttons |= Buttons.A;
|
|
if (controller.ExtendedGamepad.ButtonB.IsPressed)
|
|
buttons |= Buttons.B;
|
|
if (controller.ExtendedGamepad.ButtonX.IsPressed)
|
|
buttons |= Buttons.X;
|
|
if (controller.ExtendedGamepad.ButtonY.IsPressed)
|
|
buttons |= Buttons.Y;
|
|
|
|
if (controller.ExtendedGamepad.LeftShoulder.IsPressed)
|
|
buttons |= Buttons.LeftShoulder;
|
|
if (controller.ExtendedGamepad.RightShoulder.IsPressed)
|
|
buttons |= Buttons.RightShoulder;
|
|
|
|
if (controller.ExtendedGamepad.LeftTrigger.IsPressed)
|
|
buttons |= Buttons.LeftTrigger;
|
|
if (controller.ExtendedGamepad.RightTrigger.IsPressed)
|
|
buttons |= Buttons.RightTrigger;
|
|
|
|
if (controller.ExtendedGamepad.DPad.Up.IsPressed)
|
|
{
|
|
Up = ButtonState.Pressed;
|
|
buttons |= Buttons.DPadUp;
|
|
}
|
|
if (controller.ExtendedGamepad.DPad.Down.IsPressed)
|
|
{
|
|
Down = ButtonState.Pressed;
|
|
buttons |= Buttons.DPadDown;
|
|
}
|
|
if (controller.ExtendedGamepad.DPad.Left.IsPressed)
|
|
{
|
|
Left = ButtonState.Pressed;
|
|
buttons |= Buttons.DPadLeft;
|
|
}
|
|
if (controller.ExtendedGamepad.DPad.Right.IsPressed)
|
|
{
|
|
Right = ButtonState.Pressed;
|
|
buttons |= Buttons.DPadRight;
|
|
}
|
|
|
|
leftThumbStickPosition.X = controller.ExtendedGamepad.LeftThumbstick.XAxis.Value;
|
|
leftThumbStickPosition.Y = controller.ExtendedGamepad.LeftThumbstick.YAxis.Value;
|
|
rightThumbStickPosition.X = controller.ExtendedGamepad.RightThumbstick.XAxis.Value;
|
|
rightThumbStickPosition.Y = controller.ExtendedGamepad.RightThumbstick.YAxis.Value;
|
|
leftTriggerValue = controller.ExtendedGamepad.LeftTrigger.Value;
|
|
rightTriggerValue = controller.ExtendedGamepad.RightTrigger.Value;
|
|
}
|
|
else if (controller.Gamepad != null)
|
|
{
|
|
if (controller.Gamepad.ButtonA.IsPressed)
|
|
buttons |= Buttons.A;
|
|
if (controller.Gamepad.ButtonB.IsPressed)
|
|
buttons |= Buttons.B;
|
|
if (controller.Gamepad.ButtonX.IsPressed)
|
|
buttons |= Buttons.X;
|
|
if (controller.Gamepad.ButtonY.IsPressed)
|
|
buttons |= Buttons.Y;
|
|
|
|
if (controller.Gamepad.DPad.Up.IsPressed)
|
|
{
|
|
Up = ButtonState.Pressed;
|
|
buttons |= Buttons.DPadUp;
|
|
}
|
|
if (controller.Gamepad.DPad.Down.IsPressed)
|
|
{
|
|
Down = ButtonState.Pressed;
|
|
buttons |= Buttons.DPadDown;
|
|
}
|
|
if (controller.Gamepad.DPad.Left.IsPressed)
|
|
{
|
|
Left = ButtonState.Pressed;
|
|
buttons |= Buttons.DPadLeft;
|
|
}
|
|
if (controller.Gamepad.DPad.Right.IsPressed)
|
|
{
|
|
Right = ButtonState.Pressed;
|
|
buttons |= Buttons.DPadRight;
|
|
}
|
|
}
|
|
}
|
|
var state = new GamePadState(
|
|
new GamePadThumbSticks(leftThumbStickPosition, rightThumbStickPosition, leftDeadZoneMode, rightDeadZoneMode),
|
|
new GamePadTriggers(leftTriggerValue, rightTriggerValue),
|
|
new GamePadButtons(buttons),
|
|
new GamePadDPad(Up, Down, Left, Right));
|
|
state.IsConnected = connected;
|
|
return state;
|
|
}
|
|
|
|
private static bool PlatformSetVibration(int index, float leftMotor, float rightMotor)
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
}
|