Ir ao conteúdo

Posts recomendados

Postado

Oi, pessoal. Comecei a fazer um jogo point&click, que achei que seria um bom começo pra aprender a usar o Allegro. Quando o usuário clicasse na margem esquerda ou direita da tela, iria pra tela seguinte (como seria esperado). Entretanto, quando fui implementar uma seta pra indicar isso pro usuário, o background fica piscando. Tentei usar a função al_set_target_bitmap() pro background, mas o programa fecha na hora.

 

Como faço então pra carregar um sprite sobre um background?

  • Curtir 1
Postado

@vangodp tô usando o allegro 5.0 no DevC++.

Sobre o código, não tem nada muito complicado (o que me faz questionar porque não dá certo).

void CarregarBackground(ALLEGRO_BITMAP *background, char NomeDoBackground[], ALLEGRO_DISPLAY_MODE disp_data)
{
  	 //já tinha testado essa função antes, somente carregando e alternando backgrounds, e tava funcionando do jeito esperado
     background = al_load_bitmap(NomeDoBackground);
     al_draw_scaled_bitmap(background,0,0,XBKG,YBKG,0,0,disp_data.width,disp_data.height,0);	//XBKG e YBKG são macros definindo o tamanho do arquivo de background, pra ampliar do tamanho certo
     al_flip_display();
     al_destroy_bitmap(background);	//Isso realmente soa muito estranho, mas se eu não destruísse o background imediatamente, ele não desocupava a memória, e com algumas mudanças de tela já travava tudo
}

void DesenharSeta(ALLEGRO_BITMAP *seta, ALLEGRO_DISPLAY_MODE disp_data)
{
     al_draw_bitmap(seta, (disp_data.width)/2, (disp_data.height)/2, 0);
     al_flip_display();
     al_destroy_bitmap(seta);
}

 

  • Curtir 1
Postado

@Iury Benites
1 - Não se destrói um bitmap a não ser que você tenha certeza de que não irá mais utiliza-lo.

 

2 - Quando você tem uma função pra carregar algum bitmap, nunca coloque um comando que descarrega o bitmap dentro dessa função "al_destroy_bitmap(background);". Toda vez que você chama a função para carregar o bitmap ele carregava, desenhava e depois destruía.

 

3 -  O problema do crescimento de memória ocorre porque você está colocando a função de carregar o bitmap em loop, só necessita carregar o bitmap 1 vez, em loop você coloca as funções de limpar a tela e desenhar os bitmaps na tela novamente.

 

4 - Separe suas funções:

--  "Carregar todas as bitmaps que você vai utilizar no jogo todo(1 vez)"

--  "desenhar bitmaps na tela(em loop)"

--  "destruir bitmaps da memória(1 vez no final do programa ou ao sair)".

5 - Poste o código completo, assim da pra te ajudar melhor.


Espero ter ajudado, bons estudos...

Postado

@CiroboyBR sim, faz bastante sentido, na verdade. O problema é que me baseei num tutorial que ensinava simplesmente a desenhar uma imagem e deu, e daí tentei expandir (a base de muita gambiarra, admito :v). Encontrava pouca coisa sobre allegro 5, muito menos bem explicado.

Acredito que isso resolva tudo. Assim que eu implementar, eu posto aqui.

  • Curtir 1
  • 2 semanas depois...
Postado

Ok, separei as funções entre "Carregar Background", "Exibir Background" e "Destruir Background". O problema é na hora de exibir. Essa demo que estou fazendo se trata de quatro backgrounds, como se fossem as paredes de uma sala. Quando o usuário coloca o cursor na margem esquerda ou direita, e clica, vai para a tela correspondente (e isso dá certo tranquilo).
O problema é na hora de exibir uma seta para o usuário, indicando que ele está na posição correta. Segue o código:

void DesenharSala(ALLEGRO_BITMAP *background1, ALLEGRO_BITMAP *background2, ALLEGRO_BITMAP *background3, ALLEGRO_BITMAP *background4, int numero, ALLEGRO_DISPLAY_MODE disp_data)
{
     if(numero == 0)
               al_draw_scaled_bitmap(background1,0,0,XBKG,YBKG,0,0,disp_data.width,disp_data.height,0);
     else
     if(numero == 1)
               al_draw_scaled_bitmap(background2,0,0,XBKG,YBKG,0,0,disp_data.width,disp_data.height,0);
     else
     if(numero == 2)
               al_draw_scaled_bitmap(background3,0,0,XBKG,YBKG,0,0,disp_data.width,disp_data.height,0);
     else
         al_draw_scaled_bitmap(background4,0,0,XBKG,YBKG,0,0,disp_data.width,disp_data.height,0);
}

void DesenharSeta(ALLEGRO_BITMAP *seta, ALLEGRO_DISPLAY_MODE disp_data, int lugar)
{
     if(lugar == DIREITA)
              al_draw_bitmap(seta, disp_data.width - 130, disp_data.height / 2, ALLEGRO_FLIP_HORIZONTAL);
     else
         al_draw_bitmap(seta, 0, disp_data.height / 2, 0);
}

O problema parece ser onde colocar a função "al_flip_display()". Se coloco antes da seta, ela não aparece, se coloco depois, o background some e fica só a seta.

  • Curtir 1
Postado

@vangodp Lendo teu comentário em voz alta eu percebi meu erro (bem simples de resolver, inclusive). Na função que chamava a próxima tela (se o cursor estava numa das margens e clicava com o botão esquerdo), desenhava a imagem e já chamava al_flip_display(). Então quando eu desenhava a seta e usava al_flip_display(), ficava só a seta (erro de principiante, suponho).

Sobre o código que tu postou, vou aproveitar com certeza o uso de vetores (considerando que todas as salas sempre terão 4 lados, posso usar um vetor estático sem problemas). Eu tinha tentado antes, mas esqueci que é um vetor de ponteiros.
Acho que agora tenho o que é preciso pra terminar o jogo (mas antes, dar uma boa "limpa" no código, que tá cheio de coisas que não preciso mais)

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!