Conheça a iniciativa da Biblioteca dos Desenvolvedores  
Índice da Biblioteca  
Área dos Usuários  
Fórum de Discussão  
Forúm
 
 
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.

Links para Sprites

http://tsgk.captainn.net/
http://www.panelmonkey.org/category.php?id=1&theme=1
http://www.molotov.nu/?page=graphics


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

Download do exemplo 1 - Clique Aqui


Contribuidor
Bruno A. Rovela
22/08/2007


 

« Anterior

 

Próximo »

 
 

01/06/2007 (C) Copyright. Todos os Direitos Reservados. Leia a política de privacidade do portal.
É proibida a cópia de conteúdo deste site de acordo com a Lei Brasileira de Direitos Autorais.