Você está na página 1de 2

Carregando PNG com Allegro

Postado no 12, Janeiro, 2008 por crocidb


Muita gente tem problemas com PNG no Allegro, mas aqui eu vou mostrar como carregar PNG32 e
blitar com Canal Alpha facilmente no Dev-C++. O interessante é que você pode utilizar Anti-
Aliasing, ou efeitos de transparência, sombra, glow para darem um visual mais bonito. Mas lembre-
se que isso exige bastante processamento. O Ideal seria utilizar aceleração via hardware, para isso,
mas como o Allegro não suporta, apenas tome cuidado com muitos canais alpha! =D
Primeiramente, baixe, se você já não tiver, os pacotes da libpng e da AllegroPNG, que é a ponte
entre o Allegro e a libpng, no DevPaksRepository.
Faça uma imagem utilizando transparência e anti-aliasing no seu editor de imagens favorito (Eu uso
o Fireworks) e exporte com PNG32.
Agora inicie um projeto no Dev-C++ de Allegro, e inclua o header do AllegroPNG, assim:

#include <alpng.h>

Então adicione as bibliotecas estáticas no linkador, vá em Projeto -> Opções de Projeto ->
Parâmetros. Lá você já vê a lib -lalleg, adicione a -lalpng ANTES da lib do Allegro, ficando assim:
-lalpng -lalleg.
Agora voltemos para o código…
Nós temos duas opções interessantes, podemos simplismente carregar os PNGs com a função
load_png, ou utilizar a função load_bitmap normalmente, mas para usar a função de carregamento
universal do Allegro (load_bitmap), você tem que inicializar a AllegroPNG na inicialização do
Programa, assim:
alpng_init();

Por que assim, ela já registra no Allegro o novo formato de arquivo. Mas se não fizer isso, é só
carregar normalmente pela função load_png, assim:

BITMAP *png = load_png("imagem.png", NULL);

Ok, já temos a Imagem carregada, agora só falta blitar ela na tela com os efeitos do canal alpha.
Para isso, basta chamarmos a função set_alpha_blender para dizer ao Allegro que iremos utilizar o
Canal Alpha e então blitar com a função draw_trans_sprite. Assim:

set_alpha_blender();
draw_trans_sprite(screen, png, 0, 0);

Pronto!
Confiram o código Completo:

1. #include
2. #include <alpng.h>
3.
4. void init();
5. void deinit();
6.
7. int main() {
8. init();
9. BITMAP *png = load_png("img.png", NULL);
10.
11. clear_to_color(screen, makecol(30,30,100));
12. set_alpha_blender();
13. draw_trans_sprite(screen, png, 0, 0);
14.
15. readkey();
16.
17. deinit();
18. return 0;
19.}
20.END_OF_MAIN()
21.
22.void init() {
23. int depth, res;
24. allegro_init();
25. depth = desktop_color_depth();
26. if (depth == 0) depth = 32;
27. set_color_depth(depth);
28. res = set_gfx_mode(GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0);
29. if (res != 0) {
30. allegro_message(allegro_error);
31. exit(-1);
32. }
33.
34. install_timer();
35. install_keyboard();
36. install_mouse();
37. /* add other initializations here */
38.}
39.
40.void deinit() {
41. clear_keybuf();
42. /* add other deinitializations here */
43.}