Do tradutor:
Esta é uma continuação de uma série de traduções dos tutoriais do Twinklebear, originalmente disponíveis aqui . A tradução é parcialmente gratuita e pode conter pequenas alterações ou acréscimos do tradutor. A tradução das duas primeiras lições é de autoria de InvalidPointer . As imagens do artigo original são localizadas com a máxima preservação do estilo do autor.Lista de lições:Manipulação de eventos
Nesta lição, aprenderemos o básico sobre como obter informações do usuário e, por simplicidade, perceberemos qualquer ação do usuário como uma tentativa de
escapar para encerrar o programa. O SDL usa a estrutura SDL_Event e as funções de extração de eventos da fila de eventos, como SDL_PollEvent, para recuperar informações sobre eventos. O código escrito como parte desta lição é baseado nos resultados da
lição anterior .
Mas primeiro, vamos mudar a imagem no centro da tela para que o usuário que viu seu programa pela primeira vez entenda o que faz e o que é necessário.
Autor Man SavedO loop principal mais simples
Adicionaremos o
loop principal ao programa, que fará com que o programa funcione até o usuário querer sair (e notificar o programa sobre ele de forma acessível, é claro), em vez de um atraso fixo, como nas lições anteriores. Aqui está uma estrutura aproximada desse ciclo:
while (!quit)
Fila de Eventos SDL
Para usar corretamente o sistema de eventos SDL, precisamos de pelo menos um entendimento mínimo de seu funcionamento. Quando o SDL recebe um evento do sistema operacional, o coloca no final da fila, após todos os outros eventos que foram recebidos anteriormente, mas ainda não foram extraídos do programa. Se, após o início do programa, redimensionarmos a janela alternadamente, clicarmos nela e clicarmos em uma chave, a fila de eventos ficará assim:

Quando chamamos SDL_PollEvent, obtemos um evento desde o início da fila, o mais antigo dos demais. O recebimento de eventos da fila usando SDL_PollEvent os remove de lá. Para evitar isso, você pode "bisbilhotar" o evento usando a função SDL_PeepEvents com o conjunto de sinalizadores SDL_PEEKEVENT. Você pode ler mais sobre essa função na documentação, ela não será necessária na estrutura deste artigo (e provavelmente também será) e, portanto, não será considerada.
Manipulação de eventos
No loop principal, queremos receber todos os eventos disponíveis que vieram depois que o quadro anterior foi desenhado e processá-los. Para fazer isso, basta colocar SDL_PollEvent na condição do loop while, pois retorna 1 se recebeu o evento e 0 se não houver nada a receber. Como tudo o que o programa faz é concluir seu trabalho em determinados eventos, será suficiente usar uma variável booleana (bool quit), indicando se queremos encerrar o programa ou não e definir seu valor como true quando esses eventos são recebidos.
Esse loop deve ser colocado dentro do loop principal do aplicativo.
Um evento do tipo SDL_QUIT ocorre quando o usuário fecha a janela, SDL_KEYDOWN quando a tecla é pressionada no teclado (e vem muitas e muitas vezes enquanto é pressionado, semelhante à forma como as letras são repetidas enquanto pressiona a tecla durante a impressão de texto) e um evento do tipo SDL_MOUSEBUTTONDOWN ocorre quando clique do mouse. Esses são apenas alguns dos eventos que seu aplicativo pode receber - e, no total, o SDL pode receber mais de 20 tipos de eventos, os quais este artigo não pode abranger, é claro; portanto, você deve ler sobre eles na documentação do
SDL_EventConclusão do ciclo principal
Concluímos o processamento do evento, mas no loop principal falta mais uma parte - a exibição da cena. Já consideramos esse tópico nas lições anteriores, resta apenas aplicar esse conhecimento e o ciclo principal assumirá a seguinte forma:
Este programa funcionará para sempre. Bem, ou pelo menos até o usuário
educadamente pedir para ela parar. Depois de iniciar o programa, pressionar o botão com uma cruz, pressionar qualquer tecla do teclado ou clicar no mouse dentro da janela deve levar à conclusão do seu trabalho. E até aquele momento, ela apenas redesenhará constantemente o conteúdo da janela.
Adição do tradutor: o programa na forma em que provavelmente consumirá todos os recursos disponíveis do processador, carregando totalmente um núcleo. Será racional adicionar um pequeno atraso (1-5 ms) ao final do ciclo principal usando SDL_Delay, para que, na ausência de eventos, o programa libere o processador para outros programas. Isso não se aplica a jogos pesados, que já exigem todos os recursos disponíveis, quando a 100fps gastar 100ms a cada segundo em espera é um luxo inadmissível.O fim da quarta lição
Então, a próxima lição chegou ao fim. Veja todos na lição 5: Amostragem de um atlas de textura
Lição de casa: tente adicionar o movimento da imagem, por exemplo, usando as setas.