Tutorial de SDL – Parte 18 – Estados das teclas

Continuando nossa série de artigos traduzido do site lazyfoo, agora veremos outras formas de obter o estado dos dispositivos de entrada de dados (mouse, teclado, etc) ao invés de usar eventos. Nesse artigo iremos refazer o artigo sobre entrada do teclado para usar estados de teclas ao invés de eventos.

 //Main loop flag
 bool quit = false;
 //Event handler
 SDL_Event e;
 //Current rendered texture
 LTexture* currentTexture = NULL;

Logo antes de entrarmos no loop principal, declaramos um ponteiro para uma textura para manter registro de qual textura iremos renderizar na tela.

 //While application is running
 while( !quit )
 {
 //Handle events on queue
 while( SDL_PollEvent( &e ) != 0 )
 {
 //User requests quit
 if( e.type == SDL_QUIT )
 {
 quit = true;
 }
 }

Como você pode ver, não estamos checando por eventos de pressionamento de teclas no loop de eventos. Toda a entrada do teclado estará sendo manipulada por estados de teclas.
Uma coisa importante sobre como o SDL lida como estados de teclas é que você ainda precisa que um loop de eventos esteja sendo executado. Os estados internos do SDL são atualizados a cada vez que SDL_PollEvent é chamada, então certifique-se que leu todos os eventos da fila antes de verificar os estados das teclas.

 //Set texture based on current keystate
 const Uint8* currentKeyStates = SDL_GetKeyboardState( NULL );
 if( currentKeyStates[ SDL_SCANCODE_UP ] )
 {
 currentTexture = &gUpTexture;
 }
 else if( currentKeyStates[ SDL_SCANCODE_DOWN ] )
 {
 currentTexture = &gDownTexture;
 }
 else if( currentKeyStates[ SDL_SCANCODE_LEFT ] )
 {
 currentTexture = &gLeftTexture;
 }
 else if( currentKeyStates[ SDL_SCANCODE_RIGHT ] )
 {
 currentTexture = &gRightTexture;
 }
 else
 {
 currentTexture = &gPressTexture;
 }

Aqui configuramos a textura que será renderizada. Primeiro obtemos um ponteiro para o array de estados de teclas usando SDL_GetKeyboardState. O estado de todas as teclas é ordenado por SDL_Scancode. Esses códigos são parecidos com os valores para SDL_Keycode, só que estes foram projetados para funcionar com teclados internacionais. Dependendo do layout do teclado, letras diferentes podem estar em locais diferentes. Estes códigos disparam a posição física padrão das teclas em vez de onde elas podem estar em um teclado especifico.
Tudo que você tem que fazer para verificar se uma tecla está pressionada é cheacr por seu estado no array de estados. Como pode ser visto no código acima, se a tecla estiver pressionada configuramos a textura atual para a textura correspondente. Se nenhuma das teclas estiverem pressionadas, configuramos uma textura padrão.

 //Clear screen
 SDL_SetRenderDrawColor( gRenderer, 0xFF, 0xFF, 0xFF, 0xFF );
 SDL_RenderClear( gRenderer );
 //Render current texture
 currentTexture->render( 0, 0 );
 //Update screen
 SDL_RenderPresent( gRenderer );
 }
 }
 }

Finalmente renderizamos a textura atual na tela.

Baixe os arquivos de mídia e o código fonte desse artigo aqui.