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
» Como ajustar velocidade de cada frame da animação no game maker
por Ralphed Ontem à(s) 18:28

» PROBLEMAS COM FÍSICAS DE ÁGUA
por aminaro Ter 16 Abr 2024, 10:07

» Retorno da GMBR!!!
por Ralphed Sex 12 Abr 2024, 22:45

» JOGADOR PARANDO NO AR QUANDO ATACA
por aminaro Qua 10 Abr 2024, 13:51

» Problemas com texto interativo
por Kaaru72 Dom 07 Abr 2024, 11:31

» Erro escondido e indecifrável
por dev_gabize.azv Qui 04 Abr 2024, 10:11

» Mudar cor de apenas uma palavra
por Ralphed Sáb 30 Mar 2024, 00:39

» Procuro Programador de game maker
por Wou Sex 15 Mar 2024, 10:27

» Mod APK
por gamerainha Qua 13 Mar 2024, 06:30

» Aceito pedidos de sprites (Com exemplos meus)
por Sevilha Qua 28 Fev 2024, 12:17

» Inventário simples
por Isquilo_Roedor Qui 22 Fev 2024, 15:18

» Problemas na programaçnao de inimigo [jogo DOOM LIKE]
por Black Mirror Dom 11 Fev 2024, 13:34

» ANDROID MULTI TOUCH
por DiegoBr Dom 04 Fev 2024, 12:13

» Servidor de Discord do fórum?
por Lighter Sáb 27 Jan 2024, 17:18

» Save e Load Json
por Klinton Rodrigues Qui 25 Jan 2024, 11:12

» Colisão com mais de um objeto
por aminaro Seg 22 Jan 2024, 15:02

» Oi sou novo aqui
por Thiago Silveira Alexandre Sáb 20 Jan 2024, 20:55

» Como acessar conteudo comprado no marketplace
por macmilam Sex 19 Jan 2024, 07:42

» Devlogs em vídeos do Block Room
por Joton Seg 15 Jan 2024, 16:56

» Alguém aqui já ganha dinheiro com seus games?
por Joton Seg 15 Jan 2024, 16:49

» ACERVO GMBR MAGAZINE
por Joton Qui 11 Jan 2024, 19:21

» como aumentar o obj sem aumentar a colisão??
por GabrielXavier Qua 10 Jan 2024, 07:21

» Asteroid Core - Early Acesse Update [0.2.0.0]
por JOZ. Seg 08 Jan 2024, 14:39

» Versionamento de código com GitHub
por GabrielXavier Seg 08 Jan 2024, 07:32

» Rio Rise - novo launcher do Gta San Andreas SAMP Brasil
por kolesovsup Sex 29 Dez 2023, 07:16


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