forked from MoonsideGames/MoonWorks
add vibration support + fix controller axes
parent
87d615783e
commit
7ecb27c98a
|
@ -1,4 +1,5 @@
|
|||
using System;
|
||||
using MoonWorks.Math;
|
||||
using SDL2;
|
||||
|
||||
namespace MoonWorks.Input
|
||||
|
@ -35,6 +36,16 @@ namespace MoonWorks.Input
|
|||
Handle = handle;
|
||||
}
|
||||
|
||||
public bool SetVibration(float leftMotor, float rightMotor, uint durationInMilliseconds)
|
||||
{
|
||||
return SDL.SDL_GameControllerRumble(
|
||||
Handle,
|
||||
(ushort)(MathHelper.Clamp(leftMotor, 0f, 1f) * 0xFFFF),
|
||||
(ushort)(MathHelper.Clamp(rightMotor, 0f, 1f) * 0xFFFF),
|
||||
durationInMilliseconds
|
||||
) == 0;
|
||||
}
|
||||
|
||||
internal void Update()
|
||||
{
|
||||
A.Update(IsPressed(SDL.SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_A));
|
||||
|
@ -69,19 +80,19 @@ namespace MoonWorks.Input
|
|||
private float UpdateAxis(SDL.SDL_GameControllerAxis axis)
|
||||
{
|
||||
var axisValue = SDL.SDL_GameControllerGetAxis(Handle, axis);
|
||||
return Normalize(axisValue, short.MinValue, short.MaxValue);
|
||||
return Normalize(axisValue, short.MinValue, short.MaxValue, -1, 1);
|
||||
}
|
||||
|
||||
// Triggers only go from 0 to short.MaxValue
|
||||
private float UpdateTrigger(SDL.SDL_GameControllerAxis trigger)
|
||||
{
|
||||
var triggerValue = SDL.SDL_GameControllerGetAxis(Handle, trigger);
|
||||
return Normalize(triggerValue, 0, short.MaxValue);
|
||||
return Normalize(triggerValue, 0, short.MaxValue, 0, 1);
|
||||
}
|
||||
|
||||
private float Normalize(float value, short min, short max)
|
||||
private float Normalize(float value, short min, short max, short newMin, short newMax)
|
||||
{
|
||||
return (value - min) / (max - min);
|
||||
return ((value - min) * (newMax - newMin)) / (max - min) + newMin;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -36,6 +36,11 @@ namespace MoonWorks.Input
|
|||
}
|
||||
}
|
||||
|
||||
public bool GamepadExists(int slot)
|
||||
{
|
||||
return slot < gamepads.Count;
|
||||
}
|
||||
|
||||
public Gamepad GetGamepad(int slot)
|
||||
{
|
||||
return gamepads[slot];
|
||||
|
|
|
@ -492,6 +492,19 @@ namespace MoonWorks.Math
|
|||
result.Z = MathHelper.Clamp(value1.Z, min.Z, max.Z);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Clamps the magnitude of the specified vector.
|
||||
/// </summary>
|
||||
/// <param name="value">The vector to clamp.</param>
|
||||
/// <param name="maxLength">The maximum length of the vector.</param>
|
||||
/// <returns></returns>
|
||||
public static Vector3 ClampMagnitude(
|
||||
Vector3 value,
|
||||
float maxLength
|
||||
) {
|
||||
return (value.LengthSquared() > maxLength * maxLength) ? (Vector3.Normalize(value) * maxLength) : value;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Computes the cross product of two vectors.
|
||||
/// </summary>
|
||||
|
|
Loading…
Reference in New Issue