Jump to content

  • Log In with Google      Sign In   
  • Create Account


#Actualscyfris

Posted 10 August 2012 - 11:50 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.

#5scyfris

Posted 10 August 2012 - 04:05 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 (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.

#4scyfris

Posted 10 August 2012 - 04:02 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 (int i = 0; i < lenKeyArray; ++i) { if (IsKeyPressed(keyArray[ i ] [i][ 0 ])) { HandleEvent( keyArray[i][ i ] [ 1 ] ); } }}[/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.

#3scyfris

Posted 10 August 2012 - 03:46 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() { 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 (int i = 0; i < lenKeyArray; ++i) { if (IsKeyPressed(keyArray[ i ] [i][ 0 ])) { HandleEvent( keyArray[i][ i ] [ 1 ] ); } }}[/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.

#2scyfris

Posted 10 August 2012 - 03:46 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() { 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 (int i = 0; i < lenKeyArray; ++i) { if (IsKeyPressed(keyArray[ i ] [i][ 0 ])) { HandleEvent( keyArray[i][ i ] [ 1 ] ); } }}[/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.

#1scyfris

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() { 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 (int i = 0; i < lenKeyArray; ++i) { if (IsKeyPressed(keyArray[i][0])) { HandleEvent( keyArray[i][1] ); } }}[/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.

PARTNERS