Command processing

Started by
3 comments, last by scyfris 11 years, 8 months ago
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?
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.
Thanks, I'll look into it :)
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 ] [ 0 ])) {
HandleEvent( keyArray[ i ] [ 1 ] );
}
}
}


//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;
}
}
[/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 logic from input behavior, 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.
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 ] );
}
}
}

This topic is closed to new replies.

Advertisement