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.