[Input] Add IsAnyKey/ButtonDown/Pressed to input state.

Adds properties to KeyboardState, MouseState, JoystickState and GamePadState
(GamePadButtons), to see if any key or button is down. This should be faster
than iterating over all the public IsDown properties as we can make use of the
internal bit fields.

GamePadButtons uses IsButtonPressed rather than IsButtonDown like the others as
it more closely matches it's current interface (no down methods).
This commit is contained in:
Fraser Waters 2014-11-18 23:10:06 +01:00
parent a43181a802
commit 1ca084cf8a
4 changed files with 73 additions and 7 deletions

View file

@ -140,6 +140,19 @@ namespace OpenTK.Input
get { return GetButton(Buttons.Start); }
}
/// <summary>
/// Gets a value indicating whether any button is pressed.
/// </summary>
/// <value><c>true</c> if any button is pressed; otherwise, <c>false</c>.</value>
public bool IsAnyButtonPressed
{
get
{
// If any bit is set then a button is down.
return buttons != 0;
}
}
/// <param name="left">A <see cref="GamePadButtons"/> instance to test for equality.</param>
/// <param name="right">A <see cref="GamePadButtons"/> instance to test for equality.</param>
public static bool operator ==(GamePadButtons left, GamePadButtons right)

View file

@ -123,6 +123,19 @@ namespace OpenTK.Input
return (buttons & (1 << (int)button)) == 0;
}
/// <summary>
/// Gets a value indicating whether any button is down.
/// </summary>
/// <value><c>true</c> if any button is down; otherwise, <c>false</c>.</value>
public bool IsAnyButtonDown
{
get
{
// If any bit is set then a button is down.
return buttons != 0;
}
}
/// <summary>
/// Gets a value indicating whether this instance is connected.
/// </summary>

View file

@ -39,7 +39,7 @@ namespace OpenTK.Input
#region Fields
// Allocate enough ints to store all keyboard keys
const int IntSize = sizeof(int);
const int IntSize = sizeof(int) * 8;
const int NumInts = ((int)Key.LastKey + IntSize - 1) / IntSize;
// The following line triggers bogus CS0214 in gmcs 2.0.1, sigh...
unsafe fixed int Keys[NumInts];
@ -108,6 +108,33 @@ namespace OpenTK.Input
return !IsKeyDown(code);
}
/// <summary>
/// Gets a value indicating whether any key is down.
/// </summary>
/// <value><c>true</c> if any key is down; otherwise, <c>false</c>.</value>
public bool IsAnyKeyDown
{
get
{
// If any bit is set then a key is down.
unsafe
{
fixed (int* k = Keys)
{
for(int i = 0; i < NumInts; ++i)
{
if (k[i] != 0)
{
return true;
}
}
}
}
return false;
}
}
/// <summary>
/// Gets a <see cref="System.Boolean"/> indicating whether this keyboard
/// is connected.
@ -226,8 +253,8 @@ namespace OpenTK.Input
{
ValidateOffset(offset);
int int_offset = offset / 32;
int bit_offset = offset % 32;
int int_offset = offset / IntSize;
int bit_offset = offset % IntSize;
unsafe
{
fixed (int* k = Keys) { return (*(k + int_offset) & (1 << bit_offset)) != 0u; }
@ -238,8 +265,8 @@ namespace OpenTK.Input
{
ValidateOffset(offset);
int int_offset = offset / 32;
int bit_offset = offset % 32;
int int_offset = offset / IntSize;
int bit_offset = offset % IntSize;
unsafe
{
fixed (int* k = Keys) { *(k + int_offset) |= 1 << bit_offset; }
@ -250,8 +277,8 @@ namespace OpenTK.Input
{
ValidateOffset(offset);
int int_offset = offset / 32;
int bit_offset = offset % 32;
int int_offset = offset / IntSize;
int bit_offset = offset % IntSize;
unsafe
{
fixed (int* k = Keys) { *(k + int_offset) &= ~(1 << bit_offset); }

View file

@ -173,6 +173,19 @@ namespace OpenTK.Input
get { return IsButtonDown(MouseButton.Button2) ? ButtonState.Pressed : ButtonState.Released; }
}
/// <summary>
/// Gets a value indicating whether any button is down.
/// </summary>
/// <value><c>true</c> if any button is down; otherwise, <c>false</c>.</value>
public bool IsAnyButtonDown
{
get
{
// If any bit is set then a button is down.
return buttons != 0;
}
}
/// <summary>
/// Gets the absolute wheel position in integer units. This property is intended for XNA compatibility.
/// To support high-precision mice, it is recommended to use <see cref="WheelPrecise"/> instead.