Usando Imagens em Allegro
Uma das principais características que um jogo deve ter é um design bem feito. E para isso o uso de imagens é indispensável.
Neste post vamos ver como podemos usar imagens em nossas aplicações em Allegro.
Antes de vermos como inserir usar imagens em Allegro, vamos ver alguns detalhes de como elas são implementadas na biblioteca.
A Allegro (nativamente) suporta apenas arquivos BMP, LBM, PCX e TGA. As quais são carregadas para um ponteiro do tipo BITMAP.
Ponteiros, para quem não conhece, é uma variável, que ao invés de armazenar um valor inteiro, por exemplo, armazena um endereço de memória para uma variável inteiro. Em breve escreverei um post falando só sobre ponteiros, aprofundando um pouco mais.
A Allegro considerada a tela um ponteiro para BITMAP, e possui um nome especial, no caso screen, ou seja, se desejamos mostrar algo na tela, basta apenas desenhar no screen.
Sabendo desses detalhes vamos criar um ponteiro imagem, que servirá para armazenar nossa imagem.
-
BITMAP *imagem;
onde BITMAP o tipo da variável/ponteiro , * para indicar que é um ponteiro e imagem o nome do ponteiro.
Após definirmos o ponteiro imagem, devemos carregar o arquivo que está em disco para o ponteiro. Faremos isso usando a função:
-
imagem = load_bitmap("imagem.bmp", NULL);
onde imagem é nosso ponteiro definido anteriormente, imagem.bmp o arquivo em disco e NULL a paleta de cores.
Agora falta apenas mostrarmos a imagem na tela, para fazermos isso basta escrevermos a imagem em screen.
-
draw_sprite(screen, imagem, 10,20);
onde screen é o bitmap de destino, imagem o bitmap de origem, 10 (x) e 20 (y) as posições em screen que a imagem será desenhada.
O código completo de um programa com uso de imagens:
-
#include
-
-
void init();
-
void deinit();
-
-
int main() {
-
init();
-
-
BITMAP *imagem;
-
imagem = load_bitmap(“imagem.bmp”, NULL);
-
draw_sprite(screen, imagem, 10,20);
-
-
while (!key[KEY_ESC]) {
-
/* put your code here */
-
}
-
-
deinit();
-
return 0;
-
}
-
END_OF_MAIN()
-
-
void init() {
-
int depth, res;
-
allegro_init();
-
depth = desktop_color_depth();
-
if (depth == 0) depth = 32;
-
set_color_depth(depth);
-
res = set_gfx_mode(GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0);
-
if (res != 0) {
-
allegro_message(allegro_error);
-
exit(-1);
-
}
-
-
install_timer();
-
install_keyboard();
-
install_mouse();
-
/* add other initializations here */
-
}
-
-
void deinit() {
-
clear_keybuf();
-
/* add other deinitializations here */
-
}
Como resultado temos:

Percebam que ficou o fundo branco da imagem. Mas podemos remover o fundo. Para isso, tudo que quisermos que seja transparente na imagem, deve ser definido com a cor 255,0,255 em RGB. (é um rosa :))
Como por exemplo:

Assim veja como ficara nossa aplicação.

Percebam que ficou uma aureola em volta da imagem (como um contorno rosa), isso porque a Allegro e o formato BMP não implementam transparência em alpha, como por exemplo a implementada pelo PNG.
Qualquer dúvida comentem, e até a próxima.
Abraços.
13 Comentários »
RSS feed for comments on this post · URI do TrackBack
Este site é escrito por Tulio Faria, analista de sistemas, apaixonado por web, jogos e por qualquer cacareco tecnológico.
Guilherme said,
Setembro 30, 2006 @ 20:40
Nao consigo deixar o fundo de uma imagem transparente, quando ele fica preta
sobrepoe outra imagem, eu queria que a parte de fora d imagem (o fundo) aparecece o que tem embaixo.
tulio said,
Setembro 30, 2006 @ 21:29
Guilherme,
você deve colocar o funda da imagem em RGB(255,0,255), que é o rosa mostrado acima...
Att,
Luiz Eduardo Cavalcanti said,
Outubro 6, 2006 @ 11:15
E como posso fazer para implementar o PNG ou JPEG nos meus programas?
eric said,
Abril 13, 2007 @ 18:35
mas como fazer o fundo ficar transparente....como eu posso mudar a cor de uma imagem ?
valeu
Waldo said,
Outubro 16, 2007 @ 13:39
Rapaz... eu peguei uma foto minha, tamanho 800x600
salvei como BMP, com o nome IMAGEM mesmo, igual essa aih....
mandei rodar com esse seu código fonte pra testar e deu a seguinte mensagem:
in function '_mangled_main':
stray ''\147' in program
request for member 'bmp' in something not a structure or union
stray ''\148' in program
[build error] [allegro2.c] Error 1
Patricio Costa said,
Dezembro 13, 2007 @ 18:03
Cara ! eu baixei o dev c++ e fiz os dowloads que vc falou mas quando eu vou testar com as imagens dah o seguinte erro:
aqui estah o meu codigo.
#include
void init();
void deinit();
int main() {
init();
BITMAP *imagem;
imagem = load_bitmap(“imagem.bmp”, NULL);// o erra aponta pra cah
draw_sprite(screen, imagem, 10,20);
while (!key[KEY_ESC]) {
/* put your code here */
}
deinit();
return 0;
}
END_OF_MAIN()
void init() {
int depth, res;
allegro_init();
depth = desktop_color_depth();
if (depth == 0) depth = 32;
set_color_depth(depth);
res = set_gfx_mode(GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0);
if (res != 0) {
allegro_message(allegro_error);
exit(-1);
}
install_timer();
install_keyboard();
install_mouse();
/* add other initializations here */
}
void deinit() {
clear_keybuf();
/* add other deinitializations here */
}
e a mensagem do compilador eh a seguinte
C:\Dev-Cpp\pictures.cpp In function `int _mangled_main()':
10 C:\Dev-Cpp\pictures.cpp stray '\147' in program
10 C:\Dev-Cpp\pictures.cpp stray '\148' in program
10 C:\Dev-Cpp\pictures.cpp `bmp' has not been declared
10 C:\Dev-Cpp\pictures.cpp request for member of non-aggregate type before ',' token
ficarei muito grato se me ajudar !
valeu!
André said,
Janeiro 5, 2008 @ 14:31
Eu tenho o mesmo problema que o Waldo. Em vez de imagem.bmp eu tenho naruto.bmp. Será que é preciso definir um caminho para o programa encontrar a imagem ou será so preciso a imagem estar na mesma "pasta" que o ficheiro ".c"?
Obrigado pela ajuda.
André said,
Janeiro 5, 2008 @ 15:02
Ok. Já tratei desse problema, eram as aspas de "imagem.bmp".
Mas agora isto aparece:
multiple definition of `_mangled_main'
first defined here
multiple definition of `WinMain@16'
first defined here
multiple definition of `deinit'
first defined here
multiple definition of `init'
first defined here
Id returned 1 exit status
depois em File diz: C:\Dev-Cpp\Makefile.win e a mensagem correspondente é:
[Build Error] [TutorialAllegro.exe] Error 1
Não faço a mais pequena ideia do que isto quer dizer excepto que é mau. :p
Johnny Yuri said,
Junho 1, 2008 @ 17:33
da erro aki tambem
.......:
C:\Documents and Settings\Administrador\Desktop\Johnny\Nova pasta\main.c In function `_mangled_main':
24 C:\Documents and Settings\Administrador\Desktop\Johnny\Nova pasta\main.c stray '\147' in program
24 C:\Documents and Settings\Administrador\Desktop\Johnny\Nova pasta\main.c request for member `bmp' in something not a structure or union
24 C:\Documents and Settings\Administrador\Desktop\Johnny\Nova pasta\main.c stray '\148' in program
C:\Documents and Settings\Administrador\Desktop\Johnny\Nova pasta\Makefile.win [Build Error] [main.o] Error 1
Johnny Yuri said,
Junho 18, 2008 @ 17:20
#include
//achei uma maneira que deu certo:
//----------------------------------
int main(int argc, char* argv[])
{
BITMAP *imagem;
allegro_init();
install_keyboard();
set_color_depth(16);
set_gfx_mode(GFX_AUTODETECT_WINDOWED,640,480,0,0);
imagem = load_bitmap("metal.bmp", NULL);
acquire_screen();
blit(imagem, screen, 0,0,0,0,300,400);
release_screen();
readkey();
destroy_bitmap(imagem);
return(0);
}
END_OF_MAIN();
/*lembrando que a imagem deve estar na mesma pasta do projeto...
Vlwssssss*/
Gustavo said,
Junho 23, 2008 @ 13:20
Caraa, eu fui no paint e deixei a parte da imagem, no caso o fundo, com a cor rosa (255,0,255), mas não fiko transparente na tela, ainda sim a imagem aparece inteiriinha e agora com o fundo rosa. Eu to usando 32bits pra cor e num sei ql o erro!! Ql seria??
Explica um pouco melhor essa parte de deixar transparente, como que faz??
É assim msm, deixa de uma certa cor a parte da imagem que não qr que apareça?? no programa msm num da pra fazer isso??
vlwss... abraçuu
Johnny Yuri said,
Junho 24, 2008 @ 18:07
(RGB:0,0,0) em 8 bits é preto(transparente)..nos outros bits é rosa(225,0,225) o transparente...
ptz nem sei qual erro já q vc flw q mudou a cor no paint..aqui sempre deu certo.
eu tambem sou iniciante...naum sei uma função comando q fça isso...sempre vou no paint e definido como rosa e fica transparente...
flws...o/
Daniel A said,
Junho 25, 2008 @ 15:40
rosa (255,0,255)