29 - Movimentação de Sprites
Sprites é um conjunto de imagens que organizadas em uma determinada seqüência simulam o movimento de algum objeto ou personagem. Praticamente todos os jogos 2D possuem algum tipo de sprites.
Podemos definir como sprites a movimentação do jogador principal, as folhas caindo no chão, os inimigos em movimento e principalmente os efeitos entre os objetos do cenário.
A seguir iremos selecionar alguns sprites prontos de jogos e colocá-los em movimento.
Se você proferir escolher algum outro sprite segue uma seqüência de sites abaixo com uma infinidade de sprites de jogos.
dragao.bmp |
 |
Especificações
|
Qtde de Desenhos em x[0]:
Qtde de Desenhos em y[0]:
Largura total:
Largura individual:
Altura: |
6
0
360 pixels
60 pixels
55 pixels |
|
robocop.bmp |

|
Especificações
|
Qtde de Desenhos em x[0]:
Qtde de Desenhos em y[0]:
Largura total:
Largura individual:
Altura: |
6
0
415 pixels
69 pixels
80 pixels |
|
Não se esqueça de converter as imagens acima para bitmap.
O código que iremos usar para movimentar o Robocop e o dragão é o mesmo.
Porém, antes de executar cada um é necessário fazer algumas configurações com relação às especificações citadas acima.
CÓDIGO...
#include <allegro.h>
int main()
{
allegro_init();
install_keyboard();
set_color_depth(16);
set_gfx_mode(GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0);
BITMAP *imgSprites = NULL;
imgSprites = load_bitmap("robocop.bmp",NULL);
BITMAP *Buffer = NULL;
Buffer = create_bitmap(SCREEN_W,SCREEN_H);
const int iSprite_Largura = 69; // Largura de um sprite
const int iSprite_Altura = 80; // Altura de um sprite
const int Qtde_Spritesx = 6; // Qtde de Desenhos em x[0] - Horizontal
const int Qtde_Spritesy = 0; // Qtde de Desenhos em y[0] - Vertical
const int iCiclo = 30; // Ciclo de troca de sprite
int iPosx = 0; // Posição x do corte.
int iPosy = 0; // Posição y do corte. Como é apenas uma fileira então y sempre vai ser 0
int buffer_animacao = 0; // Buffer para controle do ciclo
while (!key[KEY_ESC])
{
clear_bitmap( Buffer );
textprintf_ex(Buffer, font, 0, 0, makecol(0, 255, 255),-1,"ANIMACAO SPRITES");
// Controle para mudar o sprite
if(buffer_animacao == 0)
{
if (iPosx > 0 && iPosx == Qtde_Spritesx-1)
{
iPosx = 0;
}
if (Qtde_Spritesx > 0)
{
iPosx++;
}
buffer_animacao = iCiclo;
}
else
{
buffer_animacao--;
}
// Corta e desenha o sprite
masked_blit(imgSprites,Buffer,iPosx*iSprite_Largura,iPosy,SCREEN_W/2, SCREEN_H/2,iSprite_Largura,iSprite_Altura);
blit(Buffer,screen,0,0,0,0,SCREEN_W,SCREEN_H);
vsync();
}
destroy_bitmap(imgSprites);
destroy_bitmap(Buffer);
allegro_exit();
return 0;
}
END_OF_MAIN();
FIM DO CÓDIGO
Logo acima temos um código genérico para a movimentação dos sprites na horizontal. No processo para a movimentação dos sprites na vertical a única coisa que muda é o eixo x para y.
Basicamente, o código possui a informação da largura, altura e quantidade de sprites na horizontal.
Com essas informações é possível fazer um corte nas imagens com a função blit vista em outro artigo.
Para que as imagens não fossem trocadas na velocidade de processamento de cada computador adicionamos um buffer de animação iCiclo.
Dessa forma nossa animação terá um movimento mais pausado e uma impressão de movimento muito melhor.
Caro leitor chegamos ao fim do entendimento da movimentação de sprites. Se houver alguma dúvida ou dificuldade favor entrar em contato com o pessoal pelo Forum.
Abraço
BDJogos
Contribuidor
Bruno A. Rovela
22/08/2007
|