Jump to content

  • Log In with Google      Sign In   
  • Create Account


Command processing


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
4 replies to this topic

#1 RobeeZ   Members   -  Reputation: 206

Like
0Likes
Like

Posted 10 August 2012 - 10:19 AM

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?

Sponsor:

#2 rip-off   Moderators   -  Reputation: 7660

Like
1Likes
Like

Posted 10 August 2012 - 10:51 AM

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.

#3 RobeeZ   Members   -  Reputation: 206

Like
0Likes
Like

Posted 10 August 2012 - 12:52 PM

Thanks, I'll look into it :)

#4 scyfris   Members   -  Reputation: 168

Like
0Likes
Like

Posted 10 August 2012 - 03:39 PM

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 loopvoid 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 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.

Edited by scyfris, 10 August 2012 - 11:50 PM.


#5 scyfris   Members   -  Reputation: 168

Like
0Likes
Like

Posted 10 August 2012 - 03:43 PM

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 ] );
}
}
}




Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS