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.

C:
  1. 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:

C:
  1. 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.

C:
  1. 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:

C:
  1. #include
  2.  
  3. void init();
  4. void deinit();
  5.  
  6. int main() {
  7. init();
  8.  
  9. BITMAP *imagem;
  10. imagem = load_bitmap(“imagem.bmp”, NULL);
  11. draw_sprite(screen, imagem, 10,20);
  12.  
  13. while (!key[KEY_ESC]) {
  14. /* put your code here */
  15. }
  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. }

Como resultado temos:

Imagem na aplicação com Allegro
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:

Imagem com fundo 255,0,255
Assim veja como ficara nossa aplicação.

Programa com imagem e fundo transparente
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.

Comentários (22)

22 Comments »

  1. Guilherme said,

    September 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.

  2. tulio said,

    September 30, 2006 @ 21:29

    Guilherme,

    você deve colocar o funda da imagem em RGB(255,0,255), que é o rosa mostrado acima...

    Att,

  3. Luiz Eduardo Cavalcanti said,

    October 6, 2006 @ 11:15

    E como posso fazer para implementar o PNG ou JPEG nos meus programas?

  4. eric said,

    April 13, 2007 @ 18:35

    mas como fazer o fundo ficar transparente....como eu posso mudar a cor de uma imagem ?
    valeu

  5. Waldo said,

    October 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

  6. Patricio Costa said,

    December 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!

  7. André said,

    January 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.

  8. André said,

    January 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

  9. Johnny Yuri said,

    June 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

  10. Johnny Yuri said,

    June 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*/

  11. Gustavo said,

    June 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

  12. Johnny Yuri said,

    June 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/

  13. Daniel A said,

    June 25, 2008 @ 15:40

    rosa (255,0,255)

  14. Mauricio Taumaturgo said,

    May 10, 2009 @ 22:49

    Tulio, eu só não entendi essa linha:
    imagem = load_bitmap("imagem.bmp", NULL);
    em outro site eu vi assim:
    MAP *img = load_bitmap("c:\\teste.bmp",pal);

    esse texto em q diz "imagem.bmp" ou "c:\\teste.bmp" o que seria isso, o local onde ta a imagem? e como salvo uma imagem em formato .bmp? por ultimo, qual a diferença entre NULL e pal ?
    Obrigado, o seu texto ta legal e o seu arquivo em pdf tambem!

  15. Rafael said,

    May 27, 2009 @ 13:21

    Como faço para configurar a tela para uma resolução maior que 800 x 600. ou seja 1024 * 800?

  16. Carlos Eduardo said,

    June 22, 2009 @ 20:45

    Galera, vê, na parte que tem assim: imagem =
    load_bitmap(“imagem.bmp”, NULL);
    E só fazer assim:
    load_bitmap(“local da imagem, terminando em .bmp”, NULL);
    EX.: load_bitmap ("C:\teste.bmp", NULL);
    Intenderam?
    kr_li_nho@hotmail.com

  17. jaciane said,

    June 26, 2009 @ 14:33

    oi júlio!!estou com o mesmo problema de muitos aqui..esse lugar:

    BITMAP *imagem;
    imagem = load_bitmap("imagem", NULL);
    draw_sprite(screen, imagem, 10,20);

    em "imagem" é pracolocar o caminho onde a imagem está???como fazer sem erros e mostrar a imagem??

  18. diego said,

    October 30, 2009 @ 15:45

    valeu velhuu...o minha duvida era onde colocar a imagem para o programa rodar...ja aprendi...obrigaduuu!!

  19. Doug said,

    November 15, 2009 @ 14:37

    Opa, muito bom post, tava precisando disso ^^
    Muito obrigado, abraço e t+

  20. jhonatta said,

    March 21, 2010 @ 00:28

    ola não consigo carregar a imagem...mesmo fazendo tudo que vc disse...me manda um e-mail com o codigo certo pra mim...eu tenho o dev c ++ estalado mais não consegui...agradeço desde já...

  21. Cristiano said,

    May 25, 2010 @ 11:55

    Caracoles, aqui nao funcionou nada, nem apareceu imagem, coisa de loko

    to precisando de ajuda para poder usar allegro e fazer um jogo.

    pleaseeeee

  22. MrPower said,

    February 13, 2011 @ 20:00

    Funcionou!
    coloquei no set_color_detph(16);
    e salvei uma imagem como .bmp de 16 bit, com o fundo do tutorial[255,0,255]!

RSS feed for comments on this post · TrackBack URI

Deixe seu comentário

You must be logged in to post a comment.