SDL - Loop do jogo



Loop do jogo

http://cdn2.hubspot.net/hub/53/file-23117129-png/blog/images/closed-loop-marketing.png?t=1466192403586&width=238

É impossível falar sobre a programação na criação de jogos sem falar sobre o loop ou "laço". Quase todos os jogos tem um e sua função é realmente a repetição de laços para que o jogo continue "rodando" e dentro desses laços existem funções que constroem o jogo e espera eventos do jogador.

Para exemplificar de forma simplificada, e já introduzindo o método de programação para realizar o loop, pense em um laço de repetição que recebe como condição de parada um valor booleano. Se verdadeiro ele continuará caso contrário para. Dentro desse laço, chamamos uma função que quando apertamos uma tecla, a tela muda de cor. Ou seja, enquanto estiver dentro do laço, toda vez que apertar uma tecla, a tela mudará de cor. Ampliando mais nosso raciocínio, perceba que a maioria de jogos funcionam dessa forma, o jogador realiza um evento (apertar uma tecla) e algo acontece no jogo (tela muda de cor).

Agora que entendemos o conceito base do loop, vejamos como faze-lo utilizando a SDL para realizar eventos.

Lembrando que precisamos incluir a biblioteca <SDL2/SDL.h> e no caso de                                         imagem <SDL2/SDL_image.h>

Depois  de ter criado uma janela na SDL como já ensinado aqui, declare uma variável do tipo booleana e atribua um valor à ela. 


bool sair = false; //Variavel responsável pela verificação da continuidade do loop do Jogo
 

Essa variável  é importante pois uma hora precisamos fechar o jogo, para isso bastará atribuir um valor verdadeiro para ela.

Agora sim podemos criar o loop, 


while (!sair) {//Enquanto sair for falso, esse loop será executado


SDL_Event e;


Dentro desse laço de repetição, é onde acontecera os eventos do jogo. Os eventos serão abordados de forma específica ao logo do nosso curso, porém para  agora, entendemos que os eventos são todo tipo de interação que o jogador possa fazer seja elas mover o mouse, clicar na tela ou clicar em alguma tecla por exemplo. 
SDL_Event é o tipo da variável que "verifica" os eventos, portanto "e" é a nossa variável de exemplo 
Vamos fazer outro loop dizendo que, enquanto o jogador realizar algum evento, ele permanecerá dentro dele : 

while (SDL_PollEvent(&e)) { //eventos e suas funções
switch (e.type) { //Tipo do evento, se é tecla pressionada ou movimento do mouse

Aqui abrimos mais um laço e pedimos para o usuário escolher o tipo de evento.
O código abaixo mostrará alguns eventos realizados neste loop, tal programa esta disponível para download no fim desse tutorial

case SDL_KEYDOWN: //caso alguma tecla for pressionada
switch (e.key.keysym.sym) { //escolha o tipo de tecla
case SDLK_LEFT://seta para direita pressionada
current = left;
break;
case SDLK_RIGHT://seta para esquerda
current = right;
break;
case SDLK_UP://seta oara cima
current = up;
break;
case SDLK_DOWN: // seta para baixo
current = down;
break;
default:
current = press;
}

Portanto, toda vez que estas teclas forem pressionadas, algo acontecerá. Uma vez que disponibilizei todos os eventos que desejava preciso fechar os laços para fechar o jogo. Fechar o jogo, também é um eventos, no caso o evento de clicar no X da janela, etão ainda no loop de eventos, adicionamos o evento caso o X for clicado.

        case SDL_QUIT: // Se o evento for clicar no X
               sair = true;// sair sera verdadeiro e o loop sera encerrado
break;
               }
       SDL_RenderClear(render);
       SDL_RenderCopy(render, current, NULL, NULL);
       SDL_RenderPresent(render);
        }//Fim do loop de eventos

}//fim do loop do jogo 

Se for clicado no X,  nosso valor booleano sera trocado impossibilitando o loop de continuar e agora posso fechar o laço de eventos. 
 Perceba que as funções RenderClear, RenderCopy e RenderPresent estão sendo chamadas logo após todos os eventos, elas servem respectivamente para limpar a tela, passar uma imagem para surface e por fim atualizar a surface (veja o tutorial de imagem). Dessa forma, primeiro recebo um evento, para depois atualizar a tela. Portanto, se em um jogo você precisar de realizar alguma função que logo após o evento deva atualizar alguma coisa, essa função deverá ficar dentro do loop de eventos e posterior a eles. No caso do exemplo, sempre que o jogador realizar o evento de clicar uma tecla específica, atualizo a tela com a imagem correspondente. 

Agora pode encerrar o loop do jogo.

Baixe o projeto do loop aqui: https://drive.google.com/file/d/0B9s0AqjHtGwGSGlqQW1jMzRsZE0/view?usp=sharing


Bom Trabalho!

Links que podem ajudar:

Mais sobre eventos :
http://gameprogrammingpatterns.com/game-loop.html

Postar um comentário

0 Comentários