Processing game input

Started by
4 comments, last by CdrTomalak 11 years, 8 months ago
So my basic 2d game framework in SlimDX is going well. I've created a custom Sprite object, and have some rudimentary mastery of rendering sprites. I just need to move them now.

I have a basic game loop set up, which is based on an old C# game prorgramming book. Having set up all the graphics device bits and bobs, and drawn my sprite on screen, I enter a method in my Game class called Run(). This has the following content:
[source lang="csharp"] public void Run()
{

while( this.Created )
{
// Process one frame of the game
ProcessFrame();
Render();
// Handle all events
Application.DoEvents();
}
}[/source]
ProcessFrame() is supposed to have all the game logic in it, in response to events. Whilst I have a simple event handler (based on an override of OnKeyDown) set up to detect keypresses, I'm wondering how to collect keypresses such that I can process the responses to them in the ProcessFrame() method.

Some initial research on this subject suggests creating a HashSet<Keys>. I've never done this before, so I'm not sure how I would go about it.

There are probably many ways to do this, so I thought I'd see what people would recommend before jumping right in there. tongue.png
Advertisement
You would have to store the input state of the input device and pass that to ProcessFrame. Have a look at XNAs GamepadState and KeyboardState structures they are a good example of what you want to do. They also present a fairly nice interface towards gamepads and keyboards.

The best thing to do is to only capture the input state once per update and do all you update logic with that state. The next step to take is to write keybindings so you are never checking hard coded keys or buttons, but you check against actions which the user can then define the associated button for.

Worked on titles: CMR:DiRT2, DiRT 3, DiRT: Showdown, GRID 2, theHunter, theHunter: Primal, Mad Max, Watch Dogs: Legion

Thanks for the speedy reponse NC! I've been checking out this tutorial: http://www.riemers.net/eng/Tutorials/XNA/Csharp/Series2D/Keyboard_input.php

This uses the KeyboardState structure as you suggest, and would give me an easy way to update sprite locations etc upon keypresses. I think I would have a ProcessKeyboard() method in the while loop of the Run() method - which might mean I wouldn't need ProcessFrame(), since all I'm doing is processing responses to keypresses, and nothing complicated - for now.
Yeah that sounds reasonable. The later action is just when you continue on an you are starting to realise you need more flexibility actionmaps is what will give that to you.

Worked on titles: CMR:DiRT2, DiRT 3, DiRT: Showdown, GRID 2, theHunter, theHunter: Primal, Mad Max, Watch Dogs: Legion

As mentioned, a good way is to pull current state from the input devices once per frame and do logic based on that. However, usually only current state is not enough, for example if you are reading raw input or analog values from gamepad. Here, keeping an input state from previous frame(s) with time stamps can help a lot. Based on previous states one can determine how the value changed (slow vs fast) you can even manually catch double clicks (press).
Thanks for the replies. I'm going with checking the keyboard state once every frame. Fingers crossed! biggrin.png

This topic is closed to new replies.

Advertisement