GMBR
Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.
Entrar

Esqueci-me da senha

Últimos assuntos
» player não consegue andar
por lovn7 Qui 21 Nov 2024, 13:33

» É possível fazer istó no game maker
por William Lima Qui 21 Nov 2024, 10:56

» Rio Rise - novo launcher do Gta San Andreas SAMP Brasil
por Lua Sáb 16 Nov 2024, 20:22

» (Resolvido) Cenario longo x Texture Pages
por josuedemoraes Sáb 16 Nov 2024, 15:31

» Kids' band
por Adilson Lucindo Santos Sex 15 Nov 2024, 12:23

» (RESOLVIDO) Engasgos-Troca de Sprites/animações
por josuedemoraes Ter 12 Nov 2024, 01:49

» Block Room - DEMO
por Joton Qua 06 Nov 2024, 22:58

» Game Infinito vertical (subindo)
por macmilam Sáb 26 Out 2024, 12:36

» Retorno da GMBR!!!
por Dancity Ter 22 Out 2024, 16:36

» Máquina de estados
por aminaro Qui 10 Out 2024, 13:33

» como faço pra um objeto colidir com o outro e diminuir a vida do player ?
por josuedemoraes Qui 03 Out 2024, 16:51

» RESOLVIDO: Colisão com objetos moveis
por josuedemoraes Qua 02 Out 2024, 20:28

» Crypt of the Blood Moon
por divin sphere Qua 11 Set 2024, 18:18

» como fazer um objeto seguir?
por divin sphere Dom 18 Ago 2024, 18:08

» Procuro de alguém para Modelar/Texturizar/Animar objetos 3D
por un00brn Dom 11 Ago 2024, 11:10

» Destruição de cenário (estilo DD Tank)
por CoronelZeg Sex 09 Ago 2024, 17:16

» RESOLVIDO-Como destruir uma instancia especifica de um objeto
por josuedemoraes Ter 23 Jul 2024, 00:40

» Automatizar a coleta de id
por GabrielXavier Seg 22 Jul 2024, 18:01

» Preciso de ajuda para concluir um pequeno projeto
por lmoura Qui 27 Jun 2024, 15:45

» ANGULO ACOMPANHAR O OBJETO
por Klinton Rodrigues Qui 27 Jun 2024, 08:34

» Musica reinicia quando sala reinicia
por GabrielXavier Ter 18 Jun 2024, 07:28

» como fazer uma copia de gd
por generico_cube Sex 14 Jun 2024, 15:48

» Square Adventure
por guilherme551 Ter 11 Jun 2024, 09:54

» como posso definir limite de uma variavel
por GabrielXavier Sex 07 Jun 2024, 14:14

» [Resolvido] Dúvida, colisão única de objeto
por vdm842 Sex 24 maio 2024, 09:50


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

4 participantes

Ir para baixo

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

Mensagem por saim 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
saim

Games Ranking : Nota B

Notas recebidas : C-D-A-B
Data de inscrição : 14/01/2011
Reputação : 136
Número de Mensagens : 3033
Prêmios : Porque não funciona? - destruição de terreno Empty

Medalhas x 1 Tutoriais x 6 Moedas x 0

Ouro x 1 Prata x 0 Bronze x 3

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Ir para o topo Ir para baixo

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

Mensagem por Kabeção 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: https://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
Kabeção

Games Ranking : Sem avaliações

Data de inscrição : 08/06/2008
Reputação : 100
Número de Mensagens : 2314
Prêmios : Porque não funciona? - destruição de terreno Empty

Medalhas x 0 Tutoriais x 7 Moedas x 0

Ouro x 3 Prata x 0 Bronze x 1

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

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

Ir para o topo Ir para baixo

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

Mensagem por saim 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
saim

Games Ranking : Nota B

Notas recebidas : C-D-A-B
Data de inscrição : 14/01/2011
Reputação : 136
Número de Mensagens : 3033
Prêmios : Porque não funciona? - destruição de terreno Empty

Medalhas x 1 Tutoriais x 6 Moedas x 0

Ouro x 1 Prata x 0 Bronze x 3

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Ir para o topo Ir para baixo

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

Mensagem por Kabeção 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
Kabeção

Games Ranking : Sem avaliações

Data de inscrição : 08/06/2008
Reputação : 100
Número de Mensagens : 2314
Prêmios : Porque não funciona? - destruição de terreno Empty

Medalhas x 0 Tutoriais x 7 Moedas x 0

Ouro x 3 Prata x 0 Bronze x 1

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

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

Ir para o topo Ir para baixo

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

Mensagem por saim 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
saim

Games Ranking : Nota B

Notas recebidas : C-D-A-B
Data de inscrição : 14/01/2011
Reputação : 136
Número de Mensagens : 3033
Prêmios : Porque não funciona? - destruição de terreno Empty

Medalhas x 1 Tutoriais x 6 Moedas x 0

Ouro x 1 Prata x 0 Bronze x 3

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Ir para o topo Ir para baixo

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

Mensagem por Kabeção 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
Kabeção

Games Ranking : Sem avaliações

Data de inscrição : 08/06/2008
Reputação : 100
Número de Mensagens : 2314
Prêmios : Porque não funciona? - destruição de terreno Empty

Medalhas x 0 Tutoriais x 7 Moedas x 0

Ouro x 3 Prata x 0 Bronze x 1

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

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

Ir para o topo Ir para baixo

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

Mensagem por Utakata 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
Utakata

Games Ranking : Nota D

Notas recebidas : C+D+D+D
Data de inscrição : 03/03/2011
Reputação : 10
Número de Mensagens : 252
Prêmios : Porque não funciona? - destruição de terreno Empty

Medalhas x 0 Tutoriais x 0 Moedas x 0

Ouro x 0 Prata x 0 Bronze x 0

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Ir para o topo Ir para baixo

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

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

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

Funciona tudo perfeitamente.
Mr. Kaleb
Mr. Kaleb

Games Ranking : Nota C

Notas recebidas : C
Data de inscrição : 07/09/2010
Reputação : 21
Número de Mensagens : 1400
Prêmios : Porque não funciona? - destruição de terreno Empty

Medalhas x 0 Tutoriais x 0 Moedas x 0

Ouro x 0 Prata x 0 Bronze x 0

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Ir para o topo Ir para baixo

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

Mensagem por Conteúdo patrocinado


Conteúdo patrocinado


Ir para o topo Ir para baixo

Ir para o topo

- Tópicos semelhantes

 
Permissões neste sub-fórum
Não podes responder a tópicos