225 lines
10 KiB
C#
225 lines
10 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;
|
|
using System.Linq;
|
|
using UIKit;
|
|
using System;
|
|
|
|
namespace Microsoft.Xna.Framework.Input
|
|
{
|
|
static partial class GamePad
|
|
{
|
|
internal static bool MenuPressed = false;
|
|
|
|
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 GamePadState PlatformGetState(int index, GamePadDeadZone leftDeadZoneMode, GamePadDeadZone rightDeadZoneMode)
|
|
{
|
|
var ind = (GCControllerPlayerIndex)index;
|
|
|
|
|
|
var buttons = new List<Buttons>();
|
|
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 (MenuPressed)
|
|
{
|
|
buttons.Add(Buttons.Back);
|
|
MenuPressed = false;
|
|
}
|
|
|
|
if (controller.ExtendedGamepad != null)
|
|
{
|
|
if (controller.ExtendedGamepad.ButtonA.IsPressed == true && !buttons.Contains (Buttons.A))
|
|
buttons.Add(Buttons.A);
|
|
if (controller.ExtendedGamepad.ButtonB.IsPressed == true && !buttons.Contains (Buttons.B))
|
|
buttons.Add(Buttons.B);
|
|
if (controller.ExtendedGamepad.ButtonX.IsPressed == true && !buttons.Contains (Buttons.X))
|
|
buttons.Add(Buttons.X);
|
|
if (controller.ExtendedGamepad.ButtonY.IsPressed == true && !buttons.Contains (Buttons.Y))
|
|
buttons.Add(Buttons.Y);
|
|
|
|
if (controller.ExtendedGamepad.LeftShoulder.IsPressed == true && !buttons.Contains (Buttons.LeftShoulder))
|
|
buttons.Add (Buttons.LeftShoulder);
|
|
if (controller.ExtendedGamepad.RightShoulder.IsPressed == true && !buttons.Contains (Buttons.RightShoulder))
|
|
buttons.Add (Buttons.RightShoulder);
|
|
|
|
Up = controller.ExtendedGamepad.DPad.Up.IsPressed ? ButtonState.Pressed : ButtonState.Released;
|
|
Down = controller.ExtendedGamepad.DPad.Down.IsPressed ? ButtonState.Pressed : ButtonState.Released;
|
|
Left = controller.ExtendedGamepad.DPad.Left.IsPressed ? ButtonState.Pressed : ButtonState.Released;
|
|
Right = controller.ExtendedGamepad.DPad.Right.IsPressed ? ButtonState.Pressed : ButtonState.Released;
|
|
|
|
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 == true && !buttons.Contains (Buttons.A))
|
|
buttons.Add(Buttons.A);
|
|
if (controller.Gamepad.ButtonB.IsPressed == true && !buttons.Contains (Buttons.B))
|
|
buttons.Add(Buttons.B);
|
|
if (controller.Gamepad.ButtonX.IsPressed == true && !buttons.Contains (Buttons.X))
|
|
buttons.Add(Buttons.X);
|
|
if (controller.Gamepad.ButtonY.IsPressed == true && !buttons.Contains (Buttons.Y))
|
|
buttons.Add(Buttons.Y);
|
|
Up = controller.Gamepad.DPad.Up.IsPressed ? ButtonState.Pressed : ButtonState.Released;
|
|
Down = controller.Gamepad.DPad.Down.IsPressed ? ButtonState.Pressed : ButtonState.Released;
|
|
Left = controller.Gamepad.DPad.Left.IsPressed ? ButtonState.Pressed : ButtonState.Released;
|
|
Right = controller.Gamepad.DPad.Right.IsPressed ? ButtonState.Pressed : ButtonState.Released;
|
|
|
|
}
|
|
else if (controller.MicroGamepad != null)
|
|
{
|
|
if (controller.MicroGamepad.ButtonA.IsPressed == true && !buttons.Contains (Buttons.A))
|
|
buttons.Add(Buttons.A);
|
|
if (controller.MicroGamepad.ButtonX.IsPressed == true && !buttons.Contains (Buttons.X))
|
|
buttons.Add(Buttons.X);
|
|
Up = controller.MicroGamepad.Dpad.Up.IsPressed ? ButtonState.Pressed : ButtonState.Released;
|
|
Down = controller.MicroGamepad.Dpad.Down.IsPressed ? ButtonState.Pressed : ButtonState.Released;
|
|
Left = controller.MicroGamepad.Dpad.Left.IsPressed ? ButtonState.Pressed : ButtonState.Released;
|
|
Right = controller.MicroGamepad.Dpad.Right.IsPressed ? ButtonState.Pressed : ButtonState.Released;
|
|
}
|
|
}
|
|
var state = new GamePadState(
|
|
new GamePadThumbSticks(leftThumbStickPosition, rightThumbStickPosition, leftDeadZoneMode, rightDeadZoneMode),
|
|
new GamePadTriggers(leftTriggerValue, rightTriggerValue),
|
|
new GamePadButtons(buttons.ToArray()),
|
|
new GamePadDPad (Up, Down, Left, Right));
|
|
state.IsConnected = connected;
|
|
return state;
|
|
}
|
|
|
|
private static bool PlatformSetVibration(int index, float leftMotor, float rightMotor)
|
|
{
|
|
return 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;
|
|
}
|
|
else if (controller.MicroGamepad != null)
|
|
{
|
|
capabilities.HasAButton = true;
|
|
capabilities.HasXButton = true;
|
|
capabilities.HasBackButton = true;
|
|
capabilities.HasDPadUpButton = true;
|
|
capabilities.HasDPadDownButton = true;
|
|
capabilities.HasDPadLeftButton = true;
|
|
capabilities.HasDPadRightButton = true;
|
|
}
|
|
return capabilities;
|
|
}
|
|
|
|
|
|
}
|
|
}
|