Conheça a iniciativa da Biblioteca dos Desenvolvedores  
Índice da Biblioteca  
Área dos Usuários  
Fórum de Discussão  
Forúm
 
  Trocar de direção usando Sprite

Nesse artigo vou ilustrar o código para movimentação do pacman em todas as direções utilizando sprites.

Antes de iniciar o código será necessário entender como estão organizados os sprites no arquivo.
A tabela abaixo mostra que na vertical estão definidas as direções dos desenhos, Direita, Esquerda, Cima e Baixo.

Já na horizontal estão definidas as seqüências dos sprites que irão definir o movimento do pacman.

Posições dos Sprites
Animação (x), Direção (y).

 

Sprite
1

Sprite
2

Sprite
3

Sprite
4

Sprite
5

Direita

0,0

25,0

50,0

75,0

100,0

Esquerda

0,25

25,25

50,25

75,25

100,25

Cima

0,50

25,50

50,50

75,50

100,50

Baixo

0,75

25,75

50,75

75,75

100,75

Ao selecionar a posição 0,0 você deverá desenhar na tela o pacman virado para a direita e de boca fechada.

Já na posição 100,0 o pacman está virado para a direita e de boca aberta.
Para fazer a simulação de movimento e de troca de direção é necessário juntar a tabela acima com os direcionais do teclado.

Abaixo segue as especificações dos sprites.

pacpac.bmp

Especificações

Qtde de Desenhos em x[0]:
Qtde de Desenhos em y[0]:
Largura total:
Largura individual:
Altura:

5
4
125 pixels
25 pixels
25 pixels
OBS: Salvar a imagem acima como .BMP. O allegro não aceita o tipo jpg.

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.


O código será dividido em 3 arquivos. São eles:

  • main.cpp
  • Jogador.h
  • Jogador.cpp

CÓDIGO...

#include <allegro.h>
#include "cjogador.h"

// Arquivo: main.cpp

int main()
{
   allegro_init();
   set_color_depth(32);
   install_keyboard();
   set_gfx_mode(GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0);

   CJogador Jogador; // Instacia o Pacman

   BITMAP *Buffer = NULL;
   Buffer = create_bitmap(SCREEN_W,SCREEN_H);

   while (!key[KEY_ESC])
   {
      clear_bitmap(Buffer);
      textprintf_ex(Buffer, font, 0, 0, makecol(0, 255, 255),-1,"SPRITE EM MOVIMENTO");

      //Atualiza o Pacman na tela
      Jogador.Atualiza(Buffer);

      //Controle para Movimentação do Pacman na tela
      Jogador.Controle(25);

      blit(Buffer,screen,0,0,0,0,SCREEN_W,SCREEN_H);
      vsync();
   }

   destroy_bitmap(Buffer);
   delete Buffer;
   allegro_exit();
   return 0;
}
END_OF_MAIN();


FIM DO CÓDIGO

main.cpp

Dentro desse arquivo é possível encontrar:

  • Referência aos arquivos de recursos.
  • Inicialização da biblioteca allegro.
  • Referência a classe Jogador (Pacman)
  • Loop principal do jogo.
  • Liberação dos ponteiros.
  • Encerramento do programa.


CÓDIGO...

#ifndef CJOGADOR_H
#define CJOGADOR_H

#include <allegro.h>

// Arquivo: cjogador.h

class CJogador
{

private:
   BITMAP *imgJogador;
   int iPosx;
   int iPosy;
   int iSpritex;
   int iSpritey;

public:
   int iLargura;
   int iAltura;

   CJogador();
   ~CJogador();
   void Setax(int);
   void Setay(int);
   void Atualiza(BITMAP *buffer);
   void Controle(int);
};

#endif


FIM DO CÓDIGO

Jocador.h

Arquivo de recurso responsável por armazenar apenas a definição da classe Jogador. Todas as características que o pacman vai possuir estão definidas nesse arquivo. São elas:

Variável

Descrição

BITMAP *imgJogador

Guarda imagem do Pacmam

int iPosx

Posição x do pacman na tela

int iPosy

Posição y do pacman na tela

int iSpritex

Posição da animação do sprite

int iSpritey

Posição da direção do sprite

int iLargura

Armazena a largura de um sprite

int iAltura

Armazena a altura de um sprite


Variável

Descrição

CJogador();

Construtor para iniciar as variáveis da classe.

~CJogador();

Destrutor responsável por liberar a imagem do pacman da memória.

void Setax(int);

Seta a posição x do pacman a partir de uma velocidade passada por argumento.

void Setay(int);

Seta a posição y do pacman a partir de uma velocidade passada por argumento.

void Atualiza(BITMAP *buffer);

Renderiza o pacman na tela.

void Controle(int);

Controla a direção do pacman através das setas do teclado.


CÓDIGO...

#include "cjogador.h"

// Arquivo: cjogador.cpp

static int iVelSprite = 4;

CJogador::CJogador()
{
   this->imgJogador = load_bitmap("pacpac.bmp",NULL); // Sprites do PacPac
   this->iPosx = 0; // Posição x do pacman na tela
   this->iPosy = 0; // Posição y do pacman na tela
   this->iLargura = 25; // Define a largura do sprite
   this->iAltura = 25; // Define a altura do sprite
   this->iSpritex = 0; // Inicia animação na posição zero.
   this->iSpritey = 0; // Inicia virado para a direita
}

CJogador::~CJogador()
{
   delete this->imgJogador;
}

void CJogador::Setax(int vx)
{
   this->iPosx += vx;

   if (vx<0) this->iSpritey = 25; // Vira Sprite para esquerda
   if (vx>0) this->iSpritey = 0; // Vira o Sprite para a direita
}

void CJogador::Setay(int vy)
{
   this->iPosy += vy;

   if (vy<0) this->iSpritey = 50; // Vira o Sprite para Cima
   if (vy>0) this->iSpritey = 75; // Vira o Sprite para Baixo
}

void CJogador::Atualiza(BITMAP *buffer)
{
   if (iSpritex >= 100) iSpritex = 0;

   masked_blit(imgJogador,buffer,this->iSpritex,this->iSpritey,this->iPosx,this->iPosy,this->iLargura,this->iAltura);
   iVelSprite--;

   if (iVelSprite<=0)
   {
      this->iSpritex += 25;
      iVelSprite = 4;
   }
}

void CJogador::Controle(int Vel)
{
   static int Buffer_Teclado =0;
   // A cada movimento reinicia o buffer do teclado.

   if (Buffer_Teclado == 0)
   {
      if (key[KEY_UP])
      {
         this->Setay(-Vel);
         Buffer_Teclado = 10;
      }
      else if (key[KEY_DOWN])
      {
         this->Setay(Vel);
         Buffer_Teclado = 10;
      }
      else if (key[KEY_LEFT])
      {
         this->Setax(-Vel);
         Buffer_Teclado = 10;
      }
      else if (key[KEY_RIGHT])
      {
         this->Setax(Vel);
         Buffer_Teclado = 10;
      }

   }
   else
   {
      Buffer_Teclado--;
   }
}


FIM DO CÓDIGO

Jogador.cpp

Esse arquivo faz referencia ao arquivo de recursos Jogador.h. No entanto, ele guarda apenas o código responsável pela movimentação do pacman na tela.

Caro leitor chegamos ao fim do entendimento da troca de sprites durante a animação. Espero ter escrito um código auto explicativo.

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
05/09/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.