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.

12 Comentários »

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

  2. 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,

  3. Luiz Eduardo Cavalcanti said,

    Outubro 6, 2006 @ 11:15

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

  4. eric said,

    Abril 13, 2007 @ 18:35

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

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

  6. 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!

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

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

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

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

  11. 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/

  12. Daniel A said,

    Junho 25, 2008 @ 15:40

    rosa (255,0,255)

RSS feed for comments on this post · URI do TrackBack

Deixe seu comentário