forked from MoonsideGames/MoonWorks
initial input handling
parent
f89907abf7
commit
7d3932da9b
|
@ -1,2 +1,3 @@
|
||||||
bin/
|
bin/
|
||||||
obj/
|
obj/
|
||||||
|
.vs/
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
[submodule "lib/SDL2-CS"]
|
||||||
|
path = lib/SDL2-CS
|
||||||
|
url = https://github.com/flibitijibibo/SDL2-CS.git
|
||||||
|
[submodule "lib/Campari"]
|
||||||
|
path = lib/Campari
|
||||||
|
url = https://gitea.moonside.games/MoonsideGames/Campari.git
|
|
@ -4,4 +4,13 @@
|
||||||
<TargetFramework>netstandard2.0</TargetFramework>
|
<TargetFramework>netstandard2.0</TargetFramework>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<DefaultItemExcludes>$(DefaultItemExcludes);lib\**\*</DefaultItemExcludes>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include=".\lib\SDL2-CS\SDL2-CS.Core.csproj" />
|
||||||
|
<ProjectReference Include=".\lib\Campari\Campari.csproj" />
|
||||||
|
<ProjectReference Include=".\lib\Campari\lib\RefreshCS\RefreshCS.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
||||||
|
|
|
@ -1,34 +1,43 @@
|
||||||
|
|
||||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
# Visual Studio 15
|
# Visual Studio Version 16
|
||||||
VisualStudioVersion = 15.0.26124.0
|
VisualStudioVersion = 16.0.30717.126
|
||||||
MinimumVisualStudioVersion = 15.0.26124.0
|
MinimumVisualStudioVersion = 15.0.26124.0
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MoonWorks", "MoonWorks.csproj", "{DDC9BA9B-4440-4CB3-BDB4-D5F91DE1686B}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MoonWorks", "MoonWorks.csproj", "{DDC9BA9B-4440-4CB3-BDB4-D5F91DE1686B}"
|
||||||
|
EndProject
|
||||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SDL2-CS.Core", "lib\SDL2-CS\SDL2-CS.Core.csproj", "{0929F2D8-8FE4-4452-AD1E-50760A1A19A5}"
|
||||||
|
EndProject
|
||||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Campari", "lib\Campari\Campari.csproj", "{D09577DE-99F5-4C30-9165-4012C37CE0CE}"
|
||||||
|
EndProject
|
||||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RefreshCS", "lib\Campari\lib\RefreshCS\RefreshCS.csproj", "{66116A40-B360-4BA3-966A-A54F3E562EC1}"
|
||||||
EndProject
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug|Any CPU = Debug|Any CPU
|
|
||||||
Debug|x64 = Debug|x64
|
Debug|x64 = Debug|x64
|
||||||
Debug|x86 = Debug|x86
|
|
||||||
Release|Any CPU = Release|Any CPU
|
|
||||||
Release|x64 = Release|x64
|
Release|x64 = Release|x64
|
||||||
Release|x86 = Release|x86
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{DDC9BA9B-4440-4CB3-BDB4-D5F91DE1686B}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
|
{DDC9BA9B-4440-4CB3-BDB4-D5F91DE1686B}.Debug|x64.Build.0 = Debug|x64
|
||||||
|
{DDC9BA9B-4440-4CB3-BDB4-D5F91DE1686B}.Release|x64.ActiveCfg = Release|x64
|
||||||
|
{DDC9BA9B-4440-4CB3-BDB4-D5F91DE1686B}.Release|x64.Build.0 = Release|x64
|
||||||
|
{0929F2D8-8FE4-4452-AD1E-50760A1A19A5}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
|
{0929F2D8-8FE4-4452-AD1E-50760A1A19A5}.Debug|x64.Build.0 = Debug|x64
|
||||||
|
{0929F2D8-8FE4-4452-AD1E-50760A1A19A5}.Release|x64.ActiveCfg = Release|x64
|
||||||
|
{0929F2D8-8FE4-4452-AD1E-50760A1A19A5}.Release|x64.Build.0 = Release|x64
|
||||||
|
{D09577DE-99F5-4C30-9165-4012C37CE0CE}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
|
{D09577DE-99F5-4C30-9165-4012C37CE0CE}.Debug|x64.Build.0 = Debug|x64
|
||||||
|
{D09577DE-99F5-4C30-9165-4012C37CE0CE}.Release|x64.ActiveCfg = Release|x64
|
||||||
|
{D09577DE-99F5-4C30-9165-4012C37CE0CE}.Release|x64.Build.0 = Release|x64
|
||||||
|
{66116A40-B360-4BA3-966A-A54F3E562EC1}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
|
{66116A40-B360-4BA3-966A-A54F3E562EC1}.Debug|x64.Build.0 = Debug|x64
|
||||||
|
{66116A40-B360-4BA3-966A-A54F3E562EC1}.Release|x64.ActiveCfg = Release|x64
|
||||||
|
{66116A40-B360-4BA3-966A-A54F3E562EC1}.Release|x64.Build.0 = Release|x64
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
{DDC9BA9B-4440-4CB3-BDB4-D5F91DE1686B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
SolutionGuid = {C3D68FAA-3165-43C7-95B3-D845F0DAA918}
|
||||||
{DDC9BA9B-4440-4CB3-BDB4-D5F91DE1686B}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{DDC9BA9B-4440-4CB3-BDB4-D5F91DE1686B}.Debug|x64.ActiveCfg = Debug|Any CPU
|
|
||||||
{DDC9BA9B-4440-4CB3-BDB4-D5F91DE1686B}.Debug|x64.Build.0 = Debug|Any CPU
|
|
||||||
{DDC9BA9B-4440-4CB3-BDB4-D5F91DE1686B}.Debug|x86.ActiveCfg = Debug|Any CPU
|
|
||||||
{DDC9BA9B-4440-4CB3-BDB4-D5F91DE1686B}.Debug|x86.Build.0 = Debug|Any CPU
|
|
||||||
{DDC9BA9B-4440-4CB3-BDB4-D5F91DE1686B}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{DDC9BA9B-4440-4CB3-BDB4-D5F91DE1686B}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{DDC9BA9B-4440-4CB3-BDB4-D5F91DE1686B}.Release|x64.ActiveCfg = Release|Any CPU
|
|
||||||
{DDC9BA9B-4440-4CB3-BDB4-D5F91DE1686B}.Release|x64.Build.0 = Release|Any CPU
|
|
||||||
{DDC9BA9B-4440-4CB3-BDB4-D5F91DE1686B}.Release|x86.ActiveCfg = Release|Any CPU
|
|
||||||
{DDC9BA9B-4440-4CB3-BDB4-D5F91DE1686B}.Release|x86.Build.0 = Release|Any CPU
|
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
EndGlobal
|
EndGlobal
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit f01b9a3a9acff8672e0d7da253ee2402fcdaa281
|
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit 1e01bc8eebb501bf6df24ec98784c32843308e0a
|
|
@ -0,0 +1,94 @@
|
||||||
|
using System;
|
||||||
|
using SDL2;
|
||||||
|
using Campari;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace MoonWorks
|
||||||
|
{
|
||||||
|
public abstract class Game
|
||||||
|
{
|
||||||
|
private bool quit = false;
|
||||||
|
private double timestep;
|
||||||
|
ulong currentTime = SDL.SDL_GetPerformanceCounter();
|
||||||
|
double accumulator = 0;
|
||||||
|
|
||||||
|
public IntPtr WindowHandle { get; }
|
||||||
|
public GraphicsDevice GraphicsDevice { get; }
|
||||||
|
|
||||||
|
public Input Input { get; }
|
||||||
|
|
||||||
|
private Dictionary<PresentMode, RefreshCS.Refresh.PresentMode> moonWorksToRefreshPresentMode = new Dictionary<PresentMode, RefreshCS.Refresh.PresentMode>
|
||||||
|
{
|
||||||
|
{ PresentMode.Immediate, RefreshCS.Refresh.PresentMode.Immediate },
|
||||||
|
{ PresentMode.Mailbox, RefreshCS.Refresh.PresentMode.Mailbox },
|
||||||
|
{ PresentMode.FIFO, RefreshCS.Refresh.PresentMode.FIFO },
|
||||||
|
{ PresentMode.FIFORelaxed, RefreshCS.Refresh.PresentMode.FIFORelaxed }
|
||||||
|
};
|
||||||
|
|
||||||
|
public Game(uint windowWidth, uint windowHeight, PresentMode presentMode, int targetTimestep = 60, bool debugMode = false)
|
||||||
|
{
|
||||||
|
timestep = 1.0 / targetTimestep;
|
||||||
|
|
||||||
|
if (SDL.SDL_Init(SDL.SDL_INIT_VIDEO | SDL.SDL_INIT_TIMER | SDL.SDL_INIT_GAMECONTROLLER) < 0)
|
||||||
|
{
|
||||||
|
System.Console.WriteLine("Failed to initialize SDL!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
WindowHandle = SDL.SDL_CreateWindow(
|
||||||
|
"CampariTest",
|
||||||
|
SDL.SDL_WINDOWPOS_UNDEFINED,
|
||||||
|
SDL.SDL_WINDOWPOS_UNDEFINED,
|
||||||
|
(int)windowWidth,
|
||||||
|
(int)windowHeight,
|
||||||
|
SDL.SDL_WindowFlags.SDL_WINDOW_VULKAN
|
||||||
|
);
|
||||||
|
|
||||||
|
GraphicsDevice = new GraphicsDevice(WindowHandle, moonWorksToRefreshPresentMode[presentMode], debugMode);
|
||||||
|
|
||||||
|
Input = new Input();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Run()
|
||||||
|
{
|
||||||
|
while (!quit)
|
||||||
|
{
|
||||||
|
var newTime = SDL.SDL_GetPerformanceCounter();
|
||||||
|
double frameTime = (newTime - currentTime) / (double)SDL.SDL_GetPerformanceFrequency();
|
||||||
|
|
||||||
|
if (frameTime > 0.25)
|
||||||
|
{
|
||||||
|
frameTime = 0.25;
|
||||||
|
}
|
||||||
|
|
||||||
|
currentTime = newTime;
|
||||||
|
|
||||||
|
accumulator += frameTime;
|
||||||
|
|
||||||
|
bool updateThisLoop = (accumulator >= timestep);
|
||||||
|
|
||||||
|
if (!quit)
|
||||||
|
{
|
||||||
|
while (accumulator >= timestep)
|
||||||
|
{
|
||||||
|
SDL.SDL_PumpEvents();
|
||||||
|
Input.Update();
|
||||||
|
|
||||||
|
Update(timestep);
|
||||||
|
|
||||||
|
accumulator -= timestep;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (updateThisLoop)
|
||||||
|
{
|
||||||
|
Draw();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected abstract void Update(double dt);
|
||||||
|
|
||||||
|
protected abstract void Draw();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,18 @@
|
||||||
|
namespace MoonWorks
|
||||||
|
{
|
||||||
|
public enum ButtonState
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Indicates that the input is not pressed.
|
||||||
|
/// </summary>
|
||||||
|
Released,
|
||||||
|
/// <summary>
|
||||||
|
/// Indicates that the input was pressed this frame.
|
||||||
|
/// </summary>
|
||||||
|
Pressed,
|
||||||
|
/// <summary>
|
||||||
|
/// Indicates that the input has been held for multiple frames.
|
||||||
|
/// </summary>
|
||||||
|
Held
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,101 @@
|
||||||
|
using System;
|
||||||
|
using SDL2;
|
||||||
|
|
||||||
|
namespace MoonWorks
|
||||||
|
{
|
||||||
|
public class Gamepad
|
||||||
|
{
|
||||||
|
internal IntPtr Handle;
|
||||||
|
|
||||||
|
public ButtonState A { get; private set; }
|
||||||
|
public ButtonState B { get; private set; }
|
||||||
|
public ButtonState X { get; private set; }
|
||||||
|
public ButtonState Y { get; private set; }
|
||||||
|
public ButtonState Back { get; private set; }
|
||||||
|
public ButtonState Guide { get; private set; }
|
||||||
|
public ButtonState Start { get; private set; }
|
||||||
|
public ButtonState LeftStick { get; private set; }
|
||||||
|
public ButtonState RightStick { get; private set; }
|
||||||
|
public ButtonState LeftShoulder { get; private set; }
|
||||||
|
public ButtonState RightShoulder { get; private set; }
|
||||||
|
public ButtonState DpadUp { get; private set; }
|
||||||
|
public ButtonState DpadDown { get; private set; }
|
||||||
|
public ButtonState DpadLeft { get; private set; }
|
||||||
|
public ButtonState DpadRight { get; private set; }
|
||||||
|
|
||||||
|
public float LeftX { get; private set; }
|
||||||
|
public float LeftY { get; private set; }
|
||||||
|
public float RightX { get; private set; }
|
||||||
|
public float RightY { get; private set; }
|
||||||
|
public float TriggerLeft { get; private set; }
|
||||||
|
public float TriggerRight { get; private set; }
|
||||||
|
|
||||||
|
public Gamepad(IntPtr handle)
|
||||||
|
{
|
||||||
|
Handle = handle;
|
||||||
|
}
|
||||||
|
|
||||||
|
internal void Update()
|
||||||
|
{
|
||||||
|
A = UpdateState(A, SDL.SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_A);
|
||||||
|
B = UpdateState(B, SDL.SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_B);
|
||||||
|
X = UpdateState(X, SDL.SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_X);
|
||||||
|
Y = UpdateState(Y, SDL.SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_Y);
|
||||||
|
Back = UpdateState(Back, SDL.SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_BACK);
|
||||||
|
Guide = UpdateState(Guide, SDL.SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_GUIDE);
|
||||||
|
Start = UpdateState(Start, SDL.SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_START);
|
||||||
|
LeftStick = UpdateState(LeftStick, SDL.SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_LEFTSTICK);
|
||||||
|
RightStick = UpdateState(RightStick, SDL.SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_RIGHTSTICK);
|
||||||
|
LeftShoulder = UpdateState(LeftShoulder, SDL.SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_LEFTSHOULDER);
|
||||||
|
RightShoulder = UpdateState(RightShoulder, SDL.SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_RIGHTSHOULDER);
|
||||||
|
DpadUp = UpdateState(DpadUp, SDL.SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_DPAD_UP);
|
||||||
|
DpadDown = UpdateState(DpadDown, SDL.SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_DPAD_DOWN);
|
||||||
|
DpadLeft = UpdateState(DpadLeft, SDL.SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_DPAD_LEFT);
|
||||||
|
DpadRight = UpdateState(DpadRight, SDL.SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_DPAD_RIGHT);
|
||||||
|
|
||||||
|
LeftX = UpdateAxis(SDL.SDL_GameControllerAxis.SDL_CONTROLLER_AXIS_LEFTX);
|
||||||
|
LeftY = UpdateAxis(SDL.SDL_GameControllerAxis.SDL_CONTROLLER_AXIS_LEFTY);
|
||||||
|
RightX = UpdateAxis(SDL.SDL_GameControllerAxis.SDL_CONTROLLER_AXIS_RIGHTX);
|
||||||
|
RightY = UpdateAxis(SDL.SDL_GameControllerAxis.SDL_CONTROLLER_AXIS_RIGHTY);
|
||||||
|
TriggerLeft = UpdateTrigger(SDL.SDL_GameControllerAxis.SDL_CONTROLLER_AXIS_TRIGGERLEFT);
|
||||||
|
TriggerRight = UpdateTrigger(SDL.SDL_GameControllerAxis.SDL_CONTROLLER_AXIS_TRIGGERRIGHT);
|
||||||
|
}
|
||||||
|
|
||||||
|
private ButtonState UpdateState(ButtonState state, SDL.SDL_GameControllerButton button)
|
||||||
|
{
|
||||||
|
var isPressed = SDL.SDL_GameControllerGetButton(Handle, button);
|
||||||
|
|
||||||
|
if (isPressed == 1)
|
||||||
|
{
|
||||||
|
if (state == ButtonState.Pressed)
|
||||||
|
{
|
||||||
|
return ButtonState.Held;
|
||||||
|
}
|
||||||
|
else if (state == ButtonState.Released)
|
||||||
|
{
|
||||||
|
return ButtonState.Pressed;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ButtonState.Released;
|
||||||
|
}
|
||||||
|
|
||||||
|
private float UpdateAxis(SDL.SDL_GameControllerAxis axis)
|
||||||
|
{
|
||||||
|
var axisValue = SDL.SDL_GameControllerGetAxis(Handle, axis);
|
||||||
|
return Normalize(axisValue, short.MinValue, short.MaxValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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);
|
||||||
|
}
|
||||||
|
|
||||||
|
private float Normalize(float value, short min, short max)
|
||||||
|
{
|
||||||
|
return (value - min) / (max - min);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,41 @@
|
||||||
|
using SDL2;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace MoonWorks
|
||||||
|
{
|
||||||
|
public class Input
|
||||||
|
{
|
||||||
|
public Keyboard Keyboard { get; }
|
||||||
|
|
||||||
|
List<Gamepad> gamepads = new List<Gamepad>();
|
||||||
|
|
||||||
|
internal Input()
|
||||||
|
{
|
||||||
|
Keyboard = new Keyboard();
|
||||||
|
|
||||||
|
for (int i = 0; i < SDL.SDL_NumJoysticks(); i++)
|
||||||
|
{
|
||||||
|
if (SDL.SDL_IsGameController(i) == SDL.SDL_bool.SDL_TRUE)
|
||||||
|
{
|
||||||
|
gamepads.Add(new Gamepad(SDL.SDL_GameControllerOpen(i)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Assumes that SDL_PumpEvents has been called!
|
||||||
|
internal void Update()
|
||||||
|
{
|
||||||
|
Keyboard.Update();
|
||||||
|
|
||||||
|
foreach (var gamepad in gamepads)
|
||||||
|
{
|
||||||
|
gamepad.Update();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Gamepad GetGamepad(int slot)
|
||||||
|
{
|
||||||
|
return gamepads[slot];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
namespace MoonWorks
|
||||||
|
{
|
||||||
|
internal class Key
|
||||||
|
{
|
||||||
|
public Keycode Keycode { get; }
|
||||||
|
public ButtonState InputState { get; internal set; }
|
||||||
|
|
||||||
|
public Key(Keycode keycode)
|
||||||
|
{
|
||||||
|
Keycode = keycode;
|
||||||
|
InputState = ButtonState.Released;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,73 @@
|
||||||
|
using System;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
using SDL2;
|
||||||
|
|
||||||
|
namespace MoonWorks
|
||||||
|
{
|
||||||
|
public class Keyboard
|
||||||
|
{
|
||||||
|
private Key[] Keys { get; }
|
||||||
|
private int numKeys;
|
||||||
|
|
||||||
|
internal Keyboard()
|
||||||
|
{
|
||||||
|
SDL.SDL_GetKeyboardState(out numKeys);
|
||||||
|
|
||||||
|
Keys = new Key[numKeys];
|
||||||
|
foreach (Keycode keycode in Enum.GetValues(typeof(Keycode)))
|
||||||
|
{
|
||||||
|
Keys[(int)keycode] = new Key(keycode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal void Update()
|
||||||
|
{
|
||||||
|
IntPtr keyboardState = SDL.SDL_GetKeyboardState(out _);
|
||||||
|
|
||||||
|
foreach (int keycode in Enum.GetValues(typeof(Keycode)))
|
||||||
|
{
|
||||||
|
var keyDown = Marshal.ReadByte(keyboardState, keycode);
|
||||||
|
|
||||||
|
if (keyDown == 1)
|
||||||
|
{
|
||||||
|
if (Keys[keycode].InputState == ButtonState.Released)
|
||||||
|
{
|
||||||
|
Keys[keycode].InputState = ButtonState.Pressed;
|
||||||
|
}
|
||||||
|
else if (Keys[keycode].InputState == ButtonState.Pressed)
|
||||||
|
{
|
||||||
|
Keys[keycode].InputState = ButtonState.Held;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Keys[keycode].InputState = ButtonState.Released;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool IsDown(Keycode keycode)
|
||||||
|
{
|
||||||
|
var key = Keys[(int)keycode];
|
||||||
|
return (key.InputState == ButtonState.Pressed) || (key.InputState == ButtonState.Held);
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool IsPressed(Keycode keycode)
|
||||||
|
{
|
||||||
|
var key = Keys[(int)keycode];
|
||||||
|
return key.InputState == ButtonState.Pressed;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool IsHeld(Keycode keycode)
|
||||||
|
{
|
||||||
|
var key = Keys[(int)keycode];
|
||||||
|
return key.InputState == ButtonState.Held;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool IsUp(Keycode keycode)
|
||||||
|
{
|
||||||
|
var key = Keys[(int)keycode];
|
||||||
|
return key.InputState == ButtonState.Released;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,111 @@
|
||||||
|
namespace MoonWorks
|
||||||
|
{
|
||||||
|
// Enum values are equivalent to the SDL Scancode value.
|
||||||
|
public enum Keycode : uint
|
||||||
|
{
|
||||||
|
Unknown = 0,
|
||||||
|
A = 4,
|
||||||
|
B = 5,
|
||||||
|
C = 6,
|
||||||
|
D = 7,
|
||||||
|
E = 8,
|
||||||
|
F = 9,
|
||||||
|
G = 10,
|
||||||
|
H = 11,
|
||||||
|
I = 12,
|
||||||
|
J = 13,
|
||||||
|
K = 14,
|
||||||
|
L = 15,
|
||||||
|
M = 16,
|
||||||
|
N = 17,
|
||||||
|
O = 18,
|
||||||
|
P = 19,
|
||||||
|
Q = 20,
|
||||||
|
R = 21,
|
||||||
|
S = 22,
|
||||||
|
T = 23,
|
||||||
|
U = 24,
|
||||||
|
V = 25,
|
||||||
|
W = 26,
|
||||||
|
X = 27,
|
||||||
|
Y = 28,
|
||||||
|
Z = 29,
|
||||||
|
D1 = 30,
|
||||||
|
D2 = 31,
|
||||||
|
D3 = 32,
|
||||||
|
D4 = 33,
|
||||||
|
D5 = 34,
|
||||||
|
D6 = 35,
|
||||||
|
D7 = 36,
|
||||||
|
D8 = 37,
|
||||||
|
D9 = 38,
|
||||||
|
D0 = 39,
|
||||||
|
Return = 40,
|
||||||
|
Escape = 41,
|
||||||
|
Backspace = 42,
|
||||||
|
Tab = 43,
|
||||||
|
Space = 44,
|
||||||
|
Minus = 45,
|
||||||
|
Equals = 46,
|
||||||
|
LeftBracket = 47,
|
||||||
|
RightBracket = 48,
|
||||||
|
Backslash = 49,
|
||||||
|
NonUSHash = 50,
|
||||||
|
Semicolon = 51,
|
||||||
|
Apostrophe = 52,
|
||||||
|
Grave = 53,
|
||||||
|
Comma = 54,
|
||||||
|
Period = 55,
|
||||||
|
Slash = 56,
|
||||||
|
CapsLock = 57,
|
||||||
|
F1 = 58,
|
||||||
|
F2 = 59,
|
||||||
|
F3 = 60,
|
||||||
|
F4 = 61,
|
||||||
|
F5 = 62,
|
||||||
|
F6 = 63,
|
||||||
|
F7 = 64,
|
||||||
|
F8 = 65,
|
||||||
|
F9 = 66,
|
||||||
|
F10 = 67,
|
||||||
|
F11 = 68,
|
||||||
|
F12 = 69,
|
||||||
|
PrintScreen = 70,
|
||||||
|
ScrollLock = 71,
|
||||||
|
Pause = 72,
|
||||||
|
Insert = 73,
|
||||||
|
Home = 74,
|
||||||
|
PageUp = 75,
|
||||||
|
Delete = 76,
|
||||||
|
End = 77,
|
||||||
|
PageDown = 78,
|
||||||
|
Right = 79,
|
||||||
|
Left = 80,
|
||||||
|
Down = 81,
|
||||||
|
Up = 82,
|
||||||
|
NumLockClear = 83,
|
||||||
|
KeypadDivide = 84,
|
||||||
|
KeypadMultiply = 85,
|
||||||
|
KeypadMinus = 86,
|
||||||
|
KeypadPlus = 87,
|
||||||
|
KeypadEnter = 88,
|
||||||
|
Keypad1 = 89,
|
||||||
|
Keypad2 = 90,
|
||||||
|
Keypad3 = 91,
|
||||||
|
Keypad4 = 92,
|
||||||
|
Keypad5 = 93,
|
||||||
|
Keypad6 = 94,
|
||||||
|
Keypad7 = 95,
|
||||||
|
Keypad8 = 96,
|
||||||
|
Keypad9 = 97,
|
||||||
|
Keypad0 = 98,
|
||||||
|
KeypadPeriod = 99,
|
||||||
|
NonUSBackslash = 100,
|
||||||
|
LeftControl = 224,
|
||||||
|
LeftShift = 225,
|
||||||
|
LeftAlt = 226,
|
||||||
|
RightControl = 228,
|
||||||
|
RightShift = 229,
|
||||||
|
RightAlt = 230
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,10 @@
|
||||||
|
namespace MoonWorks
|
||||||
|
{
|
||||||
|
public enum PresentMode
|
||||||
|
{
|
||||||
|
Immediate,
|
||||||
|
Mailbox,
|
||||||
|
FIFO,
|
||||||
|
FIFORelaxed
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue