Conheça a iniciativa da Biblioteca dos Desenvolvedores  
Índice da Biblioteca  
Área dos Usuários  
Fórum de Discussão  
Forúm
 
  OPERAÇÕES COM IMAGENS (ROTAÇÃO E ESCALA)

Nesse capitulo iremos aprender a usar as funções de rotação e escala que o Allegro disponibiliza para os programadores. Abaixo segue a imagem que iremos utilizar e uma lista das funções.

Imagem

  • rotate_sprite
  • rotate_sprite_v_flip
  • rotate_scaled_sprite
  • rotate_scaled_sprite_v_flip

Todas as funções de rotação e escala possuem o argumento angle ou scale que são do tipo fixed.
Em especial para esse argumento, devemos fazer a conversão do valor inteiro para fixo.

A função responsável por essa conversão é itofix (int).

VOCÊ PRECISA SABER...

Ângulo com o valor positivo rotaciona a imagem no sentido horário.
Ângulo com valor negativo rotaciona imagem no sentido anti-horário.

 

 

 

 

FUNÇÕES DE ROTAÇÃO


void rotate_sprite(BITMAP *bmp, BITMAP *sprite, int x, int y, fixed angle);

Essa função rotaciona qualquer imagem.

No entanto, ela não segue as regras do mundo real. Por exemplo, para nós um circulo cheio tem 360 graus, para essa função um circulo cheio tem 256 graus. Assim como para cada um dos 4 lados de uma circunferência temos 90 graus, nessa função cada lado tem 64 graus. Ela recebe como argumentos:

  • Destino da imagem rotacionada: screen
  • Imagem que devemos rotacionar: bdjogos
  • Posição x: 0
  • Posição y: 0
  • Ângulo da imagem: itofix(0) – Zero Graus

Exemplos:

rotate_sprite(screen, bdjogos, 0, 0, itofix(0)); // 0 graus
rotate_sprite(screen, bdjogos, 0, 155, itofix(64)); // 90 graus
rotate_sprite(screen, bdjogos, 0, 310, itofix(128)); // 180 graus
rotate_sprite(screen, bdjogos, 0, 400, itofix(256)); // 360 graus

O exemplo acima deve rotacionar a imagem em 64 graus, o que é equivalente a 90 graus para nós.


 

void rotate_sprite_v_flip(BITMAP *bmp, BITMAP *sprite, int x, int y, fixed angle);

Essa função funciona como o rotate_sprite, mas inverte a imagem verticalmente antes de girá-la. Ela recebe como argumentos:

  • Destino da imagem rotacionada: screen
  • Imagem que devemos rotacionar: bdjogos
  • Posição x: 0
  • Posição y: 0
  • Ângulo da imagem: itofix(0) – Zero Graus

Exemplos:

rotate_sprite_v_flip(screen, bdjogos, 0, 0, itofix(0));
rotate_sprite_v_flip(screen, bdjogos, 0, 155, itofix(64));
rotate_sprite_v_flip(screen, bdjogos, 0, 310, itofix(128));
rotate_sprite_v_flip(screen, bdjogos, 0, 400, itofix(256));

O exemplo acima inverte a imagem verticalmente antes de rotacionar.

Veja a diferença clara entre as duas funções escrevendo o código abaixo no seu compilador.


CÓDIGO...
#include <allegro.h>

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

   BITMAP *bdjogos=NULL;
   bdjogos = create_bitmap(215,76);
   bdjogos = load_bitmap("bdjogos.bmp",NULL);
   
   rotate_sprite(screen, bdjogos, 0, 0, itofix(0));
   rotate_sprite(screen, bdjogos, 0, 155, itofix(64));
   rotate_sprite(screen, bdjogos, 0, 310, itofix(128));
   rotate_sprite(screen, bdjogos, 0, 400, itofix(256));

   rotate_sprite(screen, bdjogos, 200, 155, itofix(32));

   rotate_sprite_v_flip(screen, bdjogos, 300, 0, itofix(0));
   rotate_sprite_v_flip(screen, bdjogos, 300, 155, itofix(64));
   rotate_sprite_v_flip(screen, bdjogos, 300, 310, itofix(128));
   rotate_sprite_v_flip(screen, bdjogos, 300, 400, itofix(256));
   
   readkey();
   destroy_bitmap(bdjogos);
   allegro_exit();
   return 0;
}
END_OF_MAIN();


FIM DO CÓDIGO

O código acima deve deixar claro a diferença entre as duas funções.
Execute e confira o resultado...

 

 

 


FUNÇÕES DE ROTAÇÃO E ESCALA

void rotate_scaled_sprite(BITMAP *bmp, BITMAP *sprite, int x, int y, fixed angle, fixed scale);

Essa função aumenta a escala e rotaciona ao mesmo tempo.

Se você precisar utilizar essas duas opções ao mesmo tempo essa função é perfeita. Ela recebe como argumentos:

  • Destino da imagem rotacionada e ampliada: screen
  • Imagem que devemos rotacionar ou ampliar: bdjogos
  • Posição x: 0
  • Posição y: 100
  • Ângulo da imagem: itofix(0) – Zero Graus
  • Escala da imagem: 2

Exemplo:

//Imagem com escala maior
rotate_scaled_sprite(screen, bdjogos, 0, 0, itofix(0), itofix(2));

O exemplo acima mostra a imagem ampliada em 2x o tamanho dela. A escala sempre vai ser a quantidade de vezes que você quer expandir a imagem. Nesse caso a imagem foi expandida duas vezes.


 

void rotate_scaled_sprite_v_flip(BITMAP *bmp, BITMAP *sprite, int x, int y, fixed angle, fixed scale);

Essa função aumenta a escala e rotaciona ao mesmo tempo. Se você precisar utilizar essas duas opções ao mesmo tempo essa função é perfeita. Ela recebe como argumentos:

  • Destino da imagem rotacionada e ampliada: screen
  • Imagem que devemos rotacionar ou ampliar: bdjogos
  • Posição x: 0
  • Posição y: 100
  • Ângulo da imagem: itofix(0) – Zero Graus
  • Escala da imagem: 2

Exemplo:

//Imagem invertida e com escala maior
rotate_scaled_sprite_v_flip(screen, bdjogos, 0, 0, itofix(0), itofix(2));

O exemplo acima mostra a imagem invertida e ampliada em 2x o tamanho dela. A escala sempre vai ser a quantidade de vezes que você quer expandir a imagem. Nesse caso a imagem foi expandida duas vezes.

Para exemplificar o resultado das duas funções segue o código abaixo.

 


CÓDIGO...
#include <allegro.h>

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

   BITMAP *bdjogos=NULL;
   bdjogos = create_bitmap(215,76);;
   bdjogos = load_bitmap("bdjogos.bmp",NULL);

   // Imagem normal sem rotação e escala
   rotate_scaled_sprite(screen, bdjogos, 0, 0, itofix(0), itofix(1));
   rotate_scaled_sprite(screen, bdjogos, 215, 0, itofix(0), itofix(1));
   rotate_scaled_sprite(screen, bdjogos, 0, 76, itofix(0), itofix(1));
   rotate_scaled_sprite(screen, bdjogos, 215, 76, itofix(0), itofix(1));
   
   //Imagem invertida sem rotação com 2 vezes o seu tamanho
   rotate_scaled_sprite_v_flip(screen, bdjogos, 0, 200, itofix(0), itofix(2));

   readkey();
   destroy_bitmap(bdjogos);
   allegro_exit();
   return 0;
}
END_OF_MAIN();


FIM DO CÓDIGO

Copie o código acima para o seu compilador e execute para conferir o resultado.



Caro leitor, chegamos ao fim do entendimento das funções de rotação e escala de imagens.
Qualquer dúvida entre em contato com o pessoal da BDJgos através do fórum.

Abraço
BDJogos



Contribuidor
Bruno A. Rovela
10/07/2007

Voltar

 
 

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.