BIblioteca SDL e o desenvolvimento de jogos 2D - Parte 2

Continuando o desenvolvimento, podemos pular já para a parte de fazer uma pequena animação.

Animação:

O conceito básico de animação é o seguinte, você apagar uma imagem em um local e desenhá-la em outro, claro que isso repetidamente. Sei que pode não ser o meio mais adequado mas o que eu sugiro é o seguinte:
  1. //Aplicando a imagem na tela
  2. apply_surface(x , y, imagem, screen );
  3. /*Onde x = coordenada x na tela e y = coordenada y na tela , imagem é a origem (alguma surface que você tenha criado anteriormente e carregado a imagem para ela), screen é o destino, ou seja, onde a surface irá ser aplicada */
  4. //Podemos então desenhar esta imagem em outro local e simplesmente atualizar a tela
  5. apply_surface(x+1, y+1, imagem, screen);
  6. SDL_Flip(screen)


É algo prático, você pode por exemplo implementar um for e aí então ir desenhando e apagando continuamente a imagem até um ponto desejado.

Eventos:
um evento é uma mensagem para o seu programa, pode ser recebida do sistema ou da biblioteca, indicando que algo externo ocorreu, por exemplo, o usuário moveu o mouse ou pressionou uma tecla no teclado. Um exemplo de evento que pode ser recebido do sistema é uma mensagem de saída - o usuário pode ter enviado uma ordem de desligamento para o sistema, que por sua vez envia aos programas abertos uma mensagem de encerramento.

No momento em que um evento ocorre no sistema, a SDL insere informações sobre o mesmo em uma estrutura chamada fila de eventos, que funciona como o nome indica: o primeiro elemento a ser inserido (pela biblioteca, em razão de um acontecimento externo) será o primeiro a ser retirado, quando você (o programa) assim o pedir. A maneira mais usual de proceder com o tratamento de eventos é a seguinte:

Loop principal
(...)
Enquanto houver eventos na fila
Retirar evento da fila
Tratar (ou ignorar) evento

A SDL provê uma função chamada SDL_PollEvent que verifica se ainda há eventos a serem tratados, e se for o caso, retorna informações sobre eles.

int SDL_PollEvent(SDL_Event *event);

A estrutura SDL_Event possui um campo chamado type, que indica o tipo do evento (teclado, mouse, joystick, etc) e um campo para cada tipo de evento, sendo que as informações sobre o evento atual estão dentro do campo correspondente. Por exemplo, em um evento de teclado, as informações sobre ele, tal como tecla pressionada, estarão armazenadas em event.key.
  1. while(SDL_PollEvent(&event)) /* Repetir enquanto houverem eventos */
  2. {
  3. switch(event.type) /* Processar o tipo do evento */
  4. {
  5. case SDL_KEYDOWN: /* Tratar um evento KEYDOWN (tecla pressionada) */
  6. printf("Foi pressionada uma tecla!\n");
  7. if(event.key.keysym.sym == SDLK_LEFT)
  8. printf("Esquerda!\n");
  9. break;
  10. case SDL_MOUSEMOTION:
  11. do{}while();
  12. .
  13. default: /* Evento não tratado */
  14. printf("Ãhn?!\n");
  15. }
  16. }
Bom, espero que ter passado um pouco do que aprendi nessas duas semanas estudando SDL, breve postarei aqui o meu projeto do jogo realizado utilizando apenas funções de eventos e 'blitagem' de superfícies.

Boa sorte e bons estudos!

Felipe A. Lopes

Felipe Alencar é doutorando em Ciência da Computação na UFPE, professor, desenvolvedor e acredita que só não virou jogador de futebol, surfista ou músico profissional por falta de tempo e talento.

Um comentário:

  1. Muito bom seu blog e os artigos que escreve. Está de parabéns pelo fantástico trabalho.
    Também tenho um blogger caso deseje comentar.
    http://ivanluiz-jornalista.blogspot.com/

    ResponderExcluir