Tutorial de SDL – Parte 54 – Toques

Continuando nossa série de artigos traduzidos do site lazyfoo, veremos agora como capturar e manipular com eventos de toque na tela em dispositivos móveis.

Agora que sabemos como carregar imagens em dispositivos móveis, é p momento de lidar com eventos de toque na tela.

//Scene textures
LTexture gTouchDownTexture;
LTexture gTouchMotionTexture;
LTexture gTouchUpTexture;

No exemplo desse artigo, iremos configurar um conjunto de texturas que estaremos usando para indicar que tipo de evento foi disparado.

            //Main loop flag
            bool quit = false;
            //Event handler
            SDL_Event e;
            //Touch variables
            SDL_Point touchLocation = { gScreenRect.w / 2, gScreenRect.h / 2 };
            LTexture* currentTexture = &gTouchUpTexture;

Precisamos manter um registro do local onde a tela foi tocada e da textura que foi tocada. Aqui configuramos o local padrão do toque como o centro da tela e a textura padrão como para cima.

                    //Touch down
                    else if( e.type == SDL_FINGERDOWN )
                    {
                        touchLocation.x = e.tfinger.x * gScreenRect.w;
                        touchLocation.y = e.tfinger.y * gScreenRect.h;
                        currentTexture = &gTouchDownTexture;
                    }
                    //Touch motion
                    else if( e.type == SDL_FINGERMOTION )
                    {
                        touchLocation.x = e.tfinger.x * gScreenRect.w;
                        touchLocation.y = e.tfinger.y * gScreenRect.h;
                        currentTexture = &gTouchMotionTexture;
                    }
                    //Touch release
                    else if( e.type == SDL_FINGERUP )
                    {
                        touchLocation.x = e.tfinger.x * gScreenRect.w;
                        touchLocation.y = e.tfinger.y * gScreenRect.h;
                        currentTexture = &gTouchUpTexture;
                    }

Quando você interage com uma tela sensível ao toque, você gera um evento SDL_TouchFingerEvent. Quando o toque começa, um evento SDL_FINGERDOWN é disparado, quando você move seu dedo pela tela um evento SDL_FINGERMOTION é disparado, e quando você tira o dedo da tela um evento SDL_FINGERUP é disparado.

Eventos de toque funcionam de forma similar a eventos do mouse, com uma grande diferença: coordenadas do toque são normalizadas. Isso significa que ao invés de uma faixa de 0 a 640 (ou qualquer que seja o tamanho da tela do dispostivo), elas sempre vão de 0 a 1. Para obter as coordenadas do toque em coordenadas  da tela simplesmente multiple as coordenadas do toque pela resolução da tela. Se você olhar no código acima, é exatamente o que estamos fazendo, além de configurar a textura correspondente ao evento de toque fornecido.

Uma coisa que não está sendo vista aqui é como lidar com múltiplos dedos. Tudo que estamos fazendo aqui é lidar com os eventos de toque mais recentes. Se quisermos lidar com mais de um deod, só mantemos registro deles com seus IDs. Esses IDs não são simplesmente 0, 1, 2, etc, mas uma versão inteiro 64bits do ponteiro para dados do toque. Essa peculiaridade costuma confudir as pessoas, então tenha isso em mente.

                //Clear screen
                SDL_SetRenderDrawColor( gRenderer, 0xFF, 0xFF, 0xFF, 0xFF );
                SDL_RenderClear( gRenderer );
                //Render touch texture
                currentTexture->render( touchLocation.x - currentTexture->getWidth() / 2, touchLocation.y - currentTexture->getHeight() / 2 );
                //Update screen
                SDL_RenderPresent( gRenderer );

Como você pode ver em nossa renderização, renderizamos a textura tocada na posição do toque.

Baixe os arquivo de mídia e do código fonte desse artigo aqui.