Entrar
Últimos assuntos
» player não consegue andarpor 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
Página 1 de 1
Porque não funciona? - destruição de terreno
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.
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?
- 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
}
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- Games Ranking :
Notas recebidas : C-D-A-B
Data de inscrição : 14/01/2011
Reputação : 136
Número de Mensagens : 3033
Prêmios :
x 1 x 6 x 0
x 1 x 0 x 3
x 0 x 0 x 0
Re: Porque não funciona? - destruição de terreno
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
Não versão 8.1 já deve ter sido corrigido.
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
Defina o removeback como 2 e vai funcionar.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á".
Não versão 8.1 já deve ter sido corrigido.
Re: Porque não funciona? - destruição de terreno
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.
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- Games Ranking :
Notas recebidas : C-D-A-B
Data de inscrição : 14/01/2011
Reputação : 136
Número de Mensagens : 3033
Prêmios :
x 1 x 6 x 0
x 1 x 0 x 3
x 0 x 0 x 0
Re: Porque não funciona? - destruição de terreno
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.
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.
Re: Porque não funciona? - destruição de terreno
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.
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- Games Ranking :
Notas recebidas : C-D-A-B
Data de inscrição : 14/01/2011
Reputação : 136
Número de Mensagens : 3033
Prêmios :
x 1 x 6 x 0
x 1 x 0 x 3
x 0 x 0 x 0
Re: Porque não funciona? - destruição de terreno
É 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.
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.
Re: Porque não funciona? - destruição de terreno
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
aqui está: http://www.megaupload.com/?d=7LSMQ86Q
Se usar dê créditos a Iago Master
Utakata- Games Ranking :
Notas recebidas : C+D+D+D
Data de inscrição : 03/03/2011
Reputação : 10
Número de Mensagens : 252
Prêmios :
x 0 x 0 x 0
x 0 x 0 x 0
x 0 x 0 x 0
Re: Porque não funciona? - destruição de terreno
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.
Funciona tudo perfeitamente.
Mr. Kaleb- Games Ranking :
Notas recebidas : C
Data de inscrição : 07/09/2010
Reputação : 21
Número de Mensagens : 1400
Prêmios :
x 0 x 0 x 0
x 0 x 0 x 0
x 0 x 0 x 0
Tópicos semelhantes
» [Resolvido]Destruição de Terreno
» Destruição De Objetos
» Ajuda com destruição de objetos
» duvidas com destruiçao de objeto
» Movimentar view e destruição do objeto caso ele saia dela
» Destruição De Objetos
» Ajuda com destruição de objetos
» duvidas com destruiçao de objeto
» Movimentar view e destruição do objeto caso ele saia dela
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos