Efficiently checking input and firing events
- by Jim
I'm writing an InputHandler class in XNA, and there are several different keys considered valid input (all of type Microsoft.XNA.Framework.Input.Keys). For each key, I have three events:
internal event InputEvent XYZPressed;
internal event InputEvent XYZHeld;
internal event InputEvent XYZReleased;
where XYZ is the name of the Keys object representing that key. To fire these events, I have the following for each key:
if (Keyboard.GetState().IsKeyDown(XYZ))
{
if (PreviousKeyState.IsKeyDown(XYZ))
{
if (XYZHeld != null)
XYZHeld();
}
else
{
if (XYZPressed != null)
XYZPressed();
}
}
else if (PreviousKeyState.IsKeyDown(XYZ))
{
if (XYZReleased != null)
XYZReleased();
}
However, this is a lot of repeated code (the above needs to be repeated for each input key). Aside from being a hassle to write, if any keys are added to/removed from the keys (if functionality is added/removed), a new section needs to be added (or an existing one removed).
Is there a cleaner way to do this? Perhaps something along the lines of
foreach key
check which state it's in
fire this key's event for that state
where the code does the foreach (automatically checking exactly those keys that "exist") rather than the coder?