Roman
19 posts
17 y.o from Russia.
Problem with input
Edited by Roman on
Hello. I have been trying do input as casey did in early episodes but I got a problem.
it is for processing input messages
  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 case WM_SYSKEYDOWN: case WM_KEYDOWN: case WM_KEYUP: { bool isDown = (message.lParam & (1 << 31)) == 0; bool wasDown = (message.lParam & (1 << 30)) != 0; switch(message.wParam) { if(isDown != wasDown) { case 'W': { win32KeyboardProccessing(&keyboardController->buttonUp, isDown); OutputDebugStringA("W\n"); }break; case 'A': { win32KeyboardProccessing(&keyboardController->buttonLeft, isDown); OutputDebugStringA("A\n"); }break; case 'S': { win32KeyboardProccessing(&keyboardController->buttonDown, isDown); OutputDebugStringA("S\n"); }break; case 'D': { win32KeyboardProccessing(&keyboardController->buttonRight, isDown); OutputDebugStringA("D\n"); }break; 

here we check isDown != wasDown. But probem what wasDown is doesn't work. it is always 0. Then I get assert message here:
 1 2 3 4 5 6 7 internal void win32KeyboardProccessing(game_button_state *newState, bool isDown) { assert(newState->endedDown != isDown); newState->endedDown = isDown; ++newState->halfTransitionCount; } 

Maybe I misunderstand lParam bits or something else.
Other code
  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 game_input input[2] = {}; game_input *newInput = &input[0]; game_input *oldInput = &input[1]; while(gameIsRunning) { game_controller_input *oldKeyboardController = &oldInput->controllers[0]; game_controller_input *newKeyboardController = &newInput->controllers[0]; game_controller_input zeroController = {}; *newKeyboardController = zeroController; for(s32 buttonIndex = 0; buttonIndex < 5; buttonIndex++) { newKeyboardController->buttons[buttonIndex].endedDown = oldKeyboardController->buttons[buttonIndex].endedDown; } win32KeyboardMessageProccessing(&winState,newKeyboardController); game_input *temp = newInput; newInput = oldInput; oldInput = temp; } 

Thanks for any help!!!!
Simon Anciaux
1057 posts
Problem with input
You have an "error" in the switch structure: you can't have code outside of "case" or "default". Switch statements will jump to to one of the case and not execute code that isn't in a "case" or "default" statement.

The compiler should generate warnings if you didn't suppress them and if you used "Treat warnings as error" the code would not compile. Try adding /WX to your compiler flags and verify that there isn't a /wd4702 (disabling warning about unreachable code).

For example the following code:

  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 b32 test = false; u32 a = 1; switch ( a ) { if ( test ) { case 1: { __debugbreak( ); } break; case 2: { __debugbreak( ); } break; } else { __debugbreak( ); } } 

Gives me the following error:
 1 2 3 error C2220: warning treated as error - no 'object' file generated warning C4702: unreachable code warning C4702: unreachable code 

You should move the if outside of your switch that test which key was pressed:

  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 b32 test = false; u32 a = 1; if ( test ) { switch ( a ) { case 1: { __debugbreak( ); } break; case 2: { __debugbreak( ); } break; } } else { __debugbreak( ); } 
Roman
19 posts
17 y.o from Russia.
Problem with input
It helped! Thanks for the help. I will add some flags.