Porque não funciona? - destruição de terreno

Ver o tópico anterior Ver o tópico seguinte Ir em baixo

Porque não funciona? - destruição de terreno

Mensagem por saim em Qui 14 Jul 2011, 15:07

Estou usando o script abaixo na tentativa de destruir um terreno onde clicar com o mouse (num raio definido). A idéia é criar uma surface, desenhar o sprite, remover um círculo com centro na posição do mouse, criar um sprite a partir do resultado e atribuí-lo ao objeto.
Código:
//destroyGround(sprite_width, sprite_height, sprite_xoffset, sprite_yoffset, mouse_x, mouse_y, raio);
var Surf, lar, alt, x0, y0, rad, spr_atual, spr_novo;
lar=argument0; //largura
alt=argument1; //altura
x0 =argument2; //xoffset
y0 =argument3; //yoffset
xt =argument4; //centro do círculo a ser removido (x)
yt =argument5; //centro do círculo a ser removido (y)
rad=argument6; //raio do círculo a ser removido

spr_atual=sprite_index; //armazena o sprite atual numa variável

Surf=surface_create(lar, alt);    //cria a surface do tamanho do sprite atual
surface_set_target(Surf);          //passa a desenhar na surface
draw_clear_alpha(0, 0);            //limpa a surface
draw_sprite(spr_atual, 0, x0, y0); //adiciona o sprite atual

draw_set_blend_mode(bm_subtract);  //passa a apagar ao invés de desenhar
//draw_circle_color(xt-x, yt-y, rad, c_white, c_white, 0);  //apaga um círculo
draw_circle(xt-x, yt-y, rad, 0);  //apaga um círculo
draw_set_blend_mode(bm_normal);    //volta a desenhar ao invés de apagar

surface_reset_target();            //deixa a surface de lado
spr_novo=sprite_create_from_surface(Surf, 0, 0, lar, alt, 0, 0, x0, y0); //cria um sprite a partir da surface e armazena numa variável
surface_free(Surf);                //deleta a surface, liberando memória
sprite_index=spr_novo;            //aceita o sprite criado como o sprite do objeto

if (spr_atual!=object_get_sprite(object_index)){ //se o sprite antigo NÃO é o que vem ao criar o objeto
   sprite_delete(spr_atual);                //deleta o sprite antigo, liberando memória
   }
Vai tudo muito bem até a quantidade de cortes acabar por criar um sprite totalmente transparente
Quando isso acontece, toda a área transparente volta, em preto, deixando o sprite retangular.
Se eu clico dentro do objeto (já que o raio abrange toda sua área), as cores que ainda restavam seguem como estavam. Se eu troco a linha comentada e passo a subtrair um círculo branco ao invés de um círculo preto, a cor original some.

Suponho que o erro esteja na função sprite_create_from_surface. Que ao criar um sprite a partir de uma surface totalmente transparente, o game maker entenda que eu queira adicionar um alpha ali. Só que eu não quero, então como devo fazer?

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Re: Porque não funciona? - destruição de terreno

Mensagem por Kabeção em Qui 14 Jul 2011, 17:23

Não sei exatamente o porque disso acontecer mas o problema é realmente no sprite_create_from_surface. Quanto a surface é totalmente transparente parece que o alpha é revertido.
Segundo o help a alpha devia ser mantido, talvez sejá um bug.
O único jeito de revolver seriam deixar a opção de remover o background.

-----
Edit:
Achei a solução, bastou pesquisar sobre os bugs da nova versão e a resposta estava por aqui mesmo nesse tópico: http://gmbr.forumeiros.com/t16493-gm81-game-maker-81-standart-novidades-e-bug-s

0000580 - Se você usar sprite_create_from_surface sobre uma superfície em branco, o sprite será completamente opaco.

sprite_create_from_surface: se você definir "removeback" paramater a 2, agora eles vão copiar o alfa "como está".
Defina o removeback como 2 e vai funcionar.

Não versão 8.1 já deve ter sido corrigido.

Kabeção

Ranking : Sem avaliações
Número de Mensagens : 2314
Data de inscrição : 08/06/2008
Reputação : 100
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 3
   : 0
   : 1

http://blackcapapps.blogspot.com.br/

Voltar ao Topo Ir em baixo

Re: Porque não funciona? - destruição de terreno

Mensagem por saim em Qui 14 Jul 2011, 17:39

Quase... apesar de ter melhorado MUITO, o último pixel está sempre lá. Quando chega a hora de eliminar o sprite, o código parece ser ignorado.
Minha versão ainda é a 8.0 (farei o upgrade em breve).
Será que tem como verificar se o bug vai acontecer? Porque nesses casos, usar instance_destroy() me satisfaria.

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Re: Porque não funciona? - destruição de terreno

Mensagem por Kabeção em Qui 14 Jul 2011, 17:41

O ultimo pixel?
Minha versão também é a 8.0 e definindo o removeback como 2 funciona já que ele copia exatamente a alpha de cada pixel.

Kabeção

Ranking : Sem avaliações
Número de Mensagens : 2314
Data de inscrição : 08/06/2008
Reputação : 100
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 3
   : 0
   : 1

http://blackcapapps.blogspot.com.br/

Voltar ao Topo Ir em baixo

Re: Porque não funciona? - destruição de terreno

Mensagem por saim em Qui 14 Jul 2011, 17:48

Funciona até o momento de eliminar o sprite, deixando ele todo transparente. Nessa hora, simplesmente não acontece nada.
Assim: eu chamo o script na hora de clicar. Se o click for tirar um pedaço do sprite, vai tranquilo. Se o click for remover o que restou, não acontece nada.

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Re: Porque não funciona? - destruição de terreno

Mensagem por Kabeção em Qui 14 Jul 2011, 18:29

É verdade, estava testando aqui e aconteceu isso também.
Bom, mude o bm_subtract para bm_dest_alpha.
Se você usar a mesma cor com que limpar a surface para desenhar o circulo vai funcionar, então não use preto que é muito normal mas sim uma que não tenha na sprite.

Kabeção

Ranking : Sem avaliações
Número de Mensagens : 2314
Data de inscrição : 08/06/2008
Reputação : 100
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 3
   : 0
   : 1

http://blackcapapps.blogspot.com.br/

Voltar ao Topo Ir em baixo

Re: Porque não funciona? - destruição de terreno

Mensagem por Utakata em Qui 14 Jul 2011, 19:34

Se isso te ajuda um amigo meu tem essa engine
aqui está: http://www.megaupload.com/?d=7LSMQ86Q
Se usar dê créditos a Iago Master

Utakata

Ranking : Nota D
Número de Mensagens : 252
Idade : 18
Data de inscrição : 03/03/2011
Notas recebidas : C+D+D+D
Reputação : 10
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: Porque não funciona? - destruição de terreno

Mensagem por Mr. Kaleb em Qui 14 Jul 2011, 21:53

Se isso te ajudar também, tem essa engine do Mathaeuz: http://gmbr.forumeiros.com/t16978-exemplo-imagem-sprite-destrutivel?highlight=destrut%EDvel

Funciona tudo perfeitamente.

Mr. Kaleb

Ranking : Nota C
Número de Mensagens : 1400
Idade : 19
Data de inscrição : 07/09/2010
Notas recebidas : C
Reputação : 21
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: Porque não funciona? - destruição de terreno

Mensagem por Conteúdo patrocinado Hoje à(s) 21:10


Conteúdo patrocinado


Voltar ao Topo Ir em baixo

Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo

- Tópicos similares

 
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum