Ciclo de aula do SDL 2.0: lição 4 - manipulação de eventos

SDL2

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 Saved

O 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.

 // e -    SDL_Event,       while (SDL_PollEvent(&e)) { //      if (e.type == SDL_QUIT) { quit = true; } //       if (e.type == SDL_KEYDOWN) { quit = true; } //     if (e.type == SDL_MOUSEBUTTONDOWN) { quit = true; } } 


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_Event

Conclusã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:

 //   SDL_Event e; //   bool quit = false; while (!quit) { //   while (SDL_PollEvent(&e)) { if (e.type == SDL_QUIT) { quit = true; } if (e.type == SDL_KEYDOWN) { quit = true; } if (e.type == SDL_MOUSEBUTTONDOWN) { quit = true; } } //   SDL_RenderClear(renderer); renderTexture(image, renderer, x, y); SDL_RenderPresent(renderer); } 


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.

Source: https://habr.com/ru/post/pt437308/


All Articles