segunda-feira, 30 de abril de 2012

paSDLSprite

Neste post falarei sobre o desenvolvimento da classe de desenho de quadros usando SDL.

Criar uma janela com SDL e desenhar surfaces com imagens completas parece interessante, mas e no caso dos desenhos de quadros? Foi nisso que foquei a partir desse momento.
Essa parte da engine serviria de base para quando eu fosse desenhar as texturas em quadros usando OpenGL, texturas estas que ainda não havia aprendido a manipular em aula.

Dei o nome a esta parte da engine de paSDLSprite, e foquei nos seguintes principios:

1- A classe deveria receber variados tipos de formato de configuração de quadros pelo usuário

2- A classe deveria controlar o tempo de transição de quadros.

3- A classe deveria ser portavel para abordagens de game loop que utilizem o desenho separado do processamento.

Para dar conta do primeiro quesito, criei três construtores para abordagens diferentes. Um deles recebe a altura e largura do quadro (1), outro recebe o número total de quadros na imagem na altura e largura (2), e por fim, o ultimo recebe além do número total de quadros na altura e largura, uma variável com o número total de quadros que serão exibidos e um ponteiro para um vetor contendo a ordem dos quadros (3). A segunda abordagem somente iria rodar a animação com todos os quadros em sequência.

Caso o usuário resolvesse não mais utilizar os quadros escolhidos na terceira abordagem, criei uma função membro que permitisse que este resselecionasse o número de quadros e o ponteiro para o vetor da ordem dos quadros.

A classe possui dois métodos para o desenho: Um que recebe apenas a posição em que se desejará desenhar o sprite, tendo a classe o trabalho de rodar a animação setada e o outro que recebe também o quadro atual que se deseja desenhar, tendo o usuário da classe o trabalho de setar o quadro da animação manualmente.

No caso do tempo, o usuário deve passar em cada um dos construtores o tempo por quadro. Esse tempo deve ser dado em segundos e independe dos frames por segundo. Isso porque a paSDL resolve o problema da contagem do tempo e da sua conversão de milissegundos para segundos, ou seja, basta usar a composição de paSDL em paSDLSprite e utilizar seus métodos de contagem de tempo.

Levando em conta o terceiro quesito, a classe possui a função membro de atualização do quadro separada da função membro de desenho, possibilitando ao usuário atualizar os quadros na posição do código em que ele achar conveniente.

Um ultimo problema que gostaria de abordar sobre a construção dessa classe foi o caso dos quadros ordenados em mais de uma linha. Entender a lógica de exibição dos quadros em uma imagem onde todos eles estão dispostos em uma única linha é facil. Para exemplificar:

- Se tenho um sprite com 10 quadros dispersos em uma única linha, para desenhar o sexto quadro basta enviar à função membro de desenho: posicione na tela o quadro 6!
- Agora, se tenho um sprite com 10 quadros ordenado em duas linhas, terei 5 quadros em cada linha. Dessa forma, como farei para desenhar o sexto quadro?

Felizmente, a paSDLSprite cuida dessa burocrácia para o usuário usando o seguinte algorítmo:


//Seta o índice correto do quadro
int indCol = quads[quad] % this->colq;
int indRow = quads[quad] / this->colq;

//QUAL REGIÃO DA IMAGEM SERÁ DESENHADA
SDL_Rect source;
source.x = this->wq * indCol;
source.y = this->hq * indRow;
source.h = hq;
source.w = wq;

Este algoritmo dá conta de saber de qual quadro o usuário esta falando, independente se o strip estiver ordenado em mais de uma linha.
No próximo post falarei sobre a produção do game loop da engine.

Nenhum comentário:

Postar um comentário