Obrigado por visitar a The Game Makers Brasil 😁 Use o fórum de Dúvidas para fazer perguntas. Se está em busca de aprender dê uma olhada nos tutoriais.

Problema com surface Tópico resolvido

Perguntas? A comunidade te ajuda a resolver.
Avatar do usuário
GabrielXavier
Membro
Membro
Reações: 0
Mensagens: 39
Localização: Goiás

Contato:

Problema com surface

Mensagem por GabrielXavier » Dom Nov 20, 2016 5:28 pm

Boa tarde, estou precisando salvar uma imagem através de uma surface porém estou tendo problemas.

O problema é o seguinte, eu preciso desenhar uma imagem normalmente e por cima desta imagem eu desenha uma imagem toda preta com certa transparência, desenhando uma sprite sobre a outra no evento draw o resultado é perfeitamente como o esperado, porém quando eu desenho da mesma forma as duas imagens na surface o resultado é diferente do esperado.

Segue um print, a imgem da esquerda foi gerada através de uma surface, a imagem da direita foi desenhada na tela uma sobre a outra usando o evento draw:
Imagem

Aqui os únicos códigos presentes no projeto:

@CREATE:

Código: Selecionar todos

surf = surface_create(500,400);
surface_set_target(surf);
draw_clear_alpha(c_black, 0);

draw_sprite(sprite0,0,0,0); // Sprite de fundo com a imagem
draw_set_alpha(.65);
draw_sprite(sprite1,0,0,0); //Sprite preta
draw_set_alpha(1);

surface_reset_target();
surface_save(surf,"surf1.png");

spr = sprite_create_from_surface(surf,0,0,500,400,0,0,0,0);

sprite_save(spr,0,"sprite1.png");

@DRAW:

Código: Selecionar todos

draw_sprite(spr,0,0,0); //Spr gerada através da surface

draw_sprite(sprite0,0,520,0);
draw_set_alpha(.65);
draw_sprite(sprite1,0,520,0);
draw_set_alpha(1);
Eu preciso gerar a imagem através da surface e preciso que o resultado seja exatamente como o resultado da direita pois irei escrever sobre a imagem final utilizando texto na cor branca, eu não entendi o por que do problema, tentei desenhar um retângulo preto para escurecer a imagem de fundo e o resultado foi o mesmo que o resultado usando a sprite toda preta, alguém sabe qual o problema?

EDIT: A imagem gerada pela surface esta quase transparente salvei como png e coloquei no photoshop deu pra perceber
PRINT:
Imagem
Mesmo assim não identifiquei solução para o problema.
Editado pela última vez por GabrielXavier em Ter Nov 22, 2016 4:51 am, em um total de 2 vezes.
[ ] Publicar um App no Google Play.
[ ]GANHAR DINHEIRO.
[ ]Viver com o lucro dos meu jogos/apps (Sonho).


Avatar do usuário
GabrielXavier
Membro
Membro
Reações: 0
Mensagens: 39
Localização: Goiás

Contato:

Re: Problema com surface

Mensagem por GabrielXavier » Seg Nov 21, 2016 2:09 pm

A surface até consegue desenhar a imagem um pouco mais escura e sem transparência, porém não é o suficiente pras letras brancas ficarem legíveis sobre a imagem por que os pontos claros da imagem continuam claros, a surface escurece apenas os pontos mais escuros.
Eu preciso criar um traçado preto em volta do texto e a surface também bugou este traçado ele ficou meio branco/cinza.
Eu creio que isso seja um bug nas surfaces, mas o tópico ainda está em aberto.
Obrigado pela dica Denis
[ ] Publicar um App no Google Play.
[ ]GANHAR DINHEIRO.
[ ]Viver com o lucro dos meu jogos/apps (Sonho).

Avatar do usuário
Superbomber
Programador
Programador
Reações: 0
Mensagens: 283
Localização: Natal-RN

Re: Problema com surface

Mensagem por Superbomber » Seg Nov 21, 2016 2:32 pm

O problema deve ser por você está fazendo isso no create, ou por editar o blend mode em algum lugar e não ter voltado ao normal.

Antes de desenhar na surface use draw_set_blend_mode(bm_normal);

O resultado da imagem transparente deixa claro que ao invés de misturar os dois draws o segundo "substituiu" o primeiro.

Caso não resolva, tente gerar as imagens no evento de draw controlando com um booleano para não ficar gerando em repetição.

Bye. :flw:

EDIT: Caso queira escurecer a imagem, pode fazer desta maneira:

Código: Selecionar todos

draw_set_blend_mode(bm_subtract);
draw_set_color(c_white);
draw_set_alpha(0.6);
draw_rectangle(0, 0, surfWidth, surfHeight);
O modo bm_subtract reduz a luminosidade, faça desse modo ao invés de desenhar a img preta.
Creio que terá o resultado desejado. (E não esquecer de "restaurar" os valores do alpha e blend mode depois)
Entrem neste link com o JavaScript desabilitado e vejam a mágica: https://tgmbrasil.com.br/?PageSpeed=n0script

Avatar do usuário
GabrielXavier
Membro
Membro
Reações: 0
Mensagens: 39
Localização: Goiás

Contato:

Re: Problema com surface

Mensagem por GabrielXavier » Qua Nov 23, 2016 11:45 pm

@Superbomber


Fiz todos os testes que você mencionou acima e a surface ainda continua sendo criada com a transparência 
DRAW:

Código: Selecionar todos

if !surface_exists(surf){

    surf = surface_create(imgW, imgH);
    surface_set_target(surf);
    
    draw_clear_alpha(c_black, 0);
    draw_set_blend_mode(bm_normal);
    draw_sprite(sprite1,0,0+imgW/2,0+imgH/2);
    
    draw_set_alpha(0.6);
    draw_rectangle(0,0,imgW,imgH,0);
    draw_set_alpha(1);

    surface_reset_target();
}
O problema só acontece quando se desenha algo com transparência na surface, isso faz com que a surface fique com transparência.
Já testei no Windows, testei o mesmo código no Smartphone Android e no navegador com HTML5 e o problema está presente em todas as plataformas.

Ainda não consegui resolver o problema.

Mesmo assim muito obrigado pela ajuda!
 
[ ] Publicar um App no Google Play.
[ ]GANHAR DINHEIRO.
[ ]Viver com o lucro dos meu jogos/apps (Sonho).

Avatar do usuário
saim
Membro
Membro
Reações: 0
Mensagens: 20
Localização: BH - Minas

Re: Problema com surface  Tópico resolvido

Mensagem por saim » Seg Dez 19, 2016 12:08 pm

Desenhar superfícies transparentes sobre uma surface causa transparência, mesmo.
Isso acontece por causa dos blends, que acontecem independente de você ter definido um blend mode ou não. Eles multiplicam/somam/subtraem o valor de cor e alpha das imagens de origem e destino. Acho que no bm_normal, eles se multiplicam, de forma que só vai dar alpha = 1 se as duas alphas forem 1.
Isso não acontece no draw porque o desenho final é aplicado sobre uma superfície preta. O fundo da tela, por assim dizer.

A solução, provavelmente, é criar uma superfície preta e opaca, mudar o blend mode pra bm_add e desenhar essa sua superfície transparente sobre ela, deixando tudo com alpha = 1.

Tem uma outra solução que é usar o valor de alpha de uma sprite, mas não lembro qual é a função usada nem como fazer. Provavelmente, você pega a sprite original e desenha usando algo que eu acho que é draw_sprite_alpha_from_sprite

Responder

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante