• Advertisement
Sign in to follow this  

Command processing

This topic is 1987 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Hi!

I have a debug console in my XNA project, and I don't have a good idea how to efficiently process the implemented commands.
My first idea was the ol' good if-else if-else if. But then I got the List<...> idea, with the Find() function. Is there a better and "faster" way to do it?

Share this post


Link to post
Share on other sites
Advertisement
Generally, the bottleneck will be the user here. They won't be able to type too many commands quickly, and even if you have tens of thousands of commands, a linear search by name would still appear quick for the user. There are better places to optimise.

Still, storing the commands in a map or dictionary would be a typical approach, and is algorithmically efficient.

Share this post


Link to post
Share on other sites
So I was trying to find a good way to approach this issue recently as well. I'm on a C++ platform, and this is pseudo-code for how I handled it.

[source lang="cpp"]//Runs the game loop
void GameLoop() {
while(!GameFinished()) {
PollUserInput();

//Display and perform update code here.
}
}

//A mapping of key to event.
//This is an array here, but it can be implemented dynamically as well (to perform user-defined
//key bindings use a map or something)
//For debugging this is fine.
int keyArray[][2] = {
{'A', INPUT_EVENT_MOVE_LEFT},
{'D', INPUT_EVENT_MOVE_RIGHT}
};


//Polls the keyboard input and creates a pre-defined event. All
//other keys are ignored.
void PollUserInput() {
unsigned int lenKeyArray = sizeof(keyArray)/(2*sizeof(int));

for (unsigned int i = 0; i < lenKeyArray; ++i) {
if (IsKeyPressed(keyArray[ i ] [i][ 0 ])) {
HandleEvent( keyArray[i][ i ] [ 1 ] );
}
}
}[/i][/i]

//Handle input event.
void HandleEvent( int event) {
switch(event) {
case INPUT_EVENT_MOVE_RIGHT:
//Move character right
break;
case INPUT_EVENT_MOVE_LEFT:
//Move character left
break;
default:
//Do nothing, unsupported event
break;
}
}
[i][i][/source]

The implementation itself will be different on XNA, but the point is:
1. Only button-event pairs that are defined are checked.
2. The only crazy switch statement you need to have is in HandleEvent(). This means you don't mix input [i]logic[/i] from input [i]behavior[/i], and you can modify either without affecting the other. This was important for me at least.
3. Implicitly ignores unimplemented keys.
4. Easy to extend to dynamically bindable keys (from user-defined, or read from file, or whatever). As long as the INPUT_EVENT flag is handled by HandleEvent, it will be used. You could even extend HandleEvent to handle the flags in different ways depending on the state of the game.

This is just an example, there are many ways of doing it, but I found that the simplest is to not overcomplicate it, especially for debugging. Edited by scyfris

Share this post


Link to post
Share on other sites
Ugg, for some reason my code wasn't displayed properly.

Poll input should look like this:

void PollUserInput() {
unsigned int lenKeyArray = sizeof(keyArray)/(2*sizeof(int));
for (int i = 0; i < lenKeyArray; ++i) {
if (IsKeyPressed(keyArray[ i ][ 0 ])) {
HandleEvent( keyArray[ i ][ 1 ] );
}
}
}

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement