SDL e Perl

Há alguns meses venho pensando em escrever código para conseguir animar personagens no computador. Li bastante coisa, mas achei que precisava colocar a mão na massa pra entender como as entranhas desse animal funcionam. Pra isso, reduzi um pouco o escopo do problema – de 3D, passei a 2D – e comecei a maltratar o teclado.

Me surpreendi com a facilidade pra escrever programas gráficos em Perl com SDL, com os pacotes já funcionando com a versão dois da biblioteca gráfica. Com poucas linhas, sem muito trabalho, já dá pra ver a janela funcionando.

O programa mínimo para se criar uma janela é este:

Esse código cria uma janela com tamanho padrão, o título especificado, e o exit_on_quit indica que ao clicar no X da janela, a aplicação termina. Muito simples, não?

O módulo SDLx::App acelera muito o trabalho, colocando fora do caminho o código repetitivo e facilitando o acesso a funções mais úteis. Mas antes de desenhar, é importante saber que há alguns detalhes a considerar.

Como o módulo é feito primariamente para se escrever jogos, é natural que ele implemente os padrões mais usados, como o loop de jogo. O loop de jogo fica implementado no método run, e através dele são chamados alguns callbacks que precisam ser registrados anteriormente. Eles são três que podem ou não serem implementados através dos seguintes métodos:

Os nomes já dão uma ideia de suas funções. Em princípio, vou mostrar como desenhar algumas coisas.

Esse código, colocado antes do $app->run, desenha um retângulo nas coordenadas 100, 100 com tamanho 100, 200, e na cor 255,0,0 (vermelho), com canal alfa 255. Depois disso, é feito um update, que efetivamente transfere para a tela o que se preparou na linha anterior.

SDLx::App é na verdade um SDLx::Surface, que tem vários métodos para desenhar:

Novamente, os nomes podem ser muito sugestivos sobre suas respectivas funções. Uma olhada na página da documentação do módulo mostra detalhes sobre como devem ser usados.

O método para registrar o handler de evento é útil para capturar as entradas. Afinal de contas, um jogo não seria um jogo se o jogador não pudesse apertar teclas ou clicar no mouse loucamente. Um exemplo simples e mínimo está abaixo:

Através dele, é possível terminar a aplicação ao clicar em ESC. Eu poderia usar outra tecla, como ‘q’, substituindo SDLK_ESCAPE por SDLK_q.

O outro handler é o move. A ideia é que a lógica do jogo seja colocada lá. Eu vou um pouco além e, no código que escrevo, mostro como alterar valores de variaveis caso a tecla esteja pressionada. A ideia é um pouco diferente de só observar eventos como pressionar ou soltar teclas. Aqui, ignoro esses eventos e só quero saber do estado atual da tecla.

A função get_key_state retorna um vetor com o estado de todas as teclas. Usando as constantes correspondentes, é possível modificar a posição ou qualquer outro estado de “atores” de um jogo.

Este artigo não tem a pretensão de ser mais que uma introdução mínima ao assunto. Qualquer um que pretenda fazer algo mais precisa se encorajar e ler a documentação do SDL que é muito rica e contem vários exemplos. Devem ler inclusive o livro SDL_Manual, que tem exemplos de jogos simples, mas completos, onde se descreve todo o processo de criação de um bicho como esse.

Deixe uma resposta

O seu endereço de email não será publicado Campos obrigatórios são marcados *

Você pode usar estas tags e atributos de HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">