private ApplyDeadZone ( GamePadDeadZone dz ) : void | ||
dz | GamePadDeadZone | |
리턴 | void |
private void ApplyDeadZone(GamePadDeadZone dz)
{
#if DIRECTX && !WINDOWS_PHONE && !WINDOWS_PHONE81 && !WINDOWS_UAP
// XInput Xbox 360 Controller dead zones
// Dead zones are slighty different between left and right sticks, this may come from Microsoft usability tests
const float leftThumbDeadZone = SharpDX.XInput.Gamepad.LeftThumbDeadZone / (float)short.MaxValue;
const float rightThumbDeadZone = SharpDX.XInput.Gamepad.RightThumbDeadZone / (float)short.MaxValue;
#elif OUYA
// OUYA dead zones should
// They are a bit larger to accomodate OUYA Gamepad (but will also affect Xbox 360 controllers plugged to an OUYA)
const float leftThumbDeadZone = 0.3f;
const float rightThumbDeadZone = 0.3f;
#else
// Default & SDL Xbox 360 Controller dead zones
// Based on the XInput constants
const float leftThumbDeadZone = 0.24f;
const float rightThumbDeadZone = 0.265f;
#endif
switch (dz)
{
case GamePadDeadZone.None:
break;
case GamePadDeadZone.IndependentAxes:
if (Math.Abs(left.X) < leftThumbDeadZone)
left.X = 0f;
if (Math.Abs(left.Y) < leftThumbDeadZone)
left.Y = 0f;
if (Math.Abs(right.X) < rightThumbDeadZone)
right.X = 0f;
if (Math.Abs(right.Y) < rightThumbDeadZone)
right.Y = 0f;
break;
case GamePadDeadZone.Circular:
if (left.LengthSquared() < leftThumbDeadZone * leftThumbDeadZone)
left = Vector2.Zero;
if (right.LengthSquared() < rightThumbDeadZone * rightThumbDeadZone)
right = Vector2.Zero;
break;
}
// excluding deadZone from the final output range
if (dz == GamePadDeadZone.IndependentAxes)
{
if (left.X < -leftThumbDeadZone)
left.X = left.X + leftThumbDeadZone;
else if (left.X > leftThumbDeadZone)
left.X = left.X - leftThumbDeadZone;
if (left.Y < -leftThumbDeadZone)
left.Y = left.Y + leftThumbDeadZone;
else if (left.Y > leftThumbDeadZone)
left.Y = left.Y - leftThumbDeadZone;
if (right.X < -rightThumbDeadZone)
right.X = right.X + rightThumbDeadZone;
else if (right.X > rightThumbDeadZone)
right.X = right.X - rightThumbDeadZone;
if (right.Y < -rightThumbDeadZone)
right.Y = right.Y + rightThumbDeadZone;
else if (right.Y > rightThumbDeadZone)
right.Y = right.Y - rightThumbDeadZone;
left.X = left.X / (1.0f - leftThumbDeadZone);
left.Y = left.Y / (1.0f - leftThumbDeadZone);
right.X = right.X / (1.0f - rightThumbDeadZone);
right.Y = right.Y / (1.0f - rightThumbDeadZone);
}
else if (dz == GamePadDeadZone.Circular)
{
if (left.LengthSquared() >= leftThumbDeadZone * leftThumbDeadZone)
{
Vector2 norm = left;
norm.Normalize();
left = left - norm * leftThumbDeadZone; // excluding deadzone
left = left / leftThumbDeadZone; // re-range output
}
if (right.LengthSquared() >= rightThumbDeadZone * rightThumbDeadZone)
{
Vector2 norm = right;
norm.Normalize();
right = right - norm * rightThumbDeadZone;
right = right / rightThumbDeadZone;
}
}
}
static GamePadState ReadState(PlayerIndex index, GamePadDeadZone deadZone) { const float DeadZoneSize = 0.27f; IntPtr device = GetDevice(index); PadConfig c = GetConfig(index); if (device == IntPtr.Zero || c == null) { return(GamePadState.InitializedState); } var leftStick = c.LeftStick.ReadAxisPair(device); var rightStick = c.RightStick.ReadAxisPair(device); GamePadThumbSticks sticks = new GamePadThumbSticks(new Vector2(leftStick.X, leftStick.Y), new Vector2(rightStick.X, rightStick.Y)); sticks.ApplyDeadZone(deadZone, DeadZoneSize); GamePadTriggers triggers = new GamePadTriggers(c.LeftTrigger.ReadFloat(device), c.RightTrigger.ReadFloat(device)); Buttons buttonState = ReadButtons(device, c, DeadZoneSize); buttonState |= StickToButtons(sticks.Left, Buttons.LeftThumbstickLeft, Buttons.LeftThumbstickRight, Buttons.LeftThumbstickUp, Buttons.LeftThumbstickDown, DeadZoneSize); buttonState |= StickToButtons(sticks.Right, Buttons.RightThumbstickLeft, Buttons.RightThumbstickRight, Buttons.RightThumbstickUp, Buttons.RightThumbstickDown, DeadZoneSize); buttonState |= TriggerToButton(triggers.Left, Buttons.LeftTrigger, DeadZoneSize); buttonState |= TriggerToButton(triggers.Right, Buttons.RightTrigger, DeadZoneSize); GamePadButtons buttons = new GamePadButtons(buttonState); GamePadDPad dpad = new GamePadDPad(buttons.buttons); GamePadState g = new GamePadState(sticks, triggers, buttons, dpad); return(g); }