[Resolvido] Pintar parte da sprite

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

Resolvido [Resolvido] Pintar parte da sprite

Mensagem por Super Maker em Dom 01 Jul 2012, 20:18

Olá!
Bem, dessa vez eu vou tentar explicar sem postar imagens e nem vídeos (to meio sem tempo agora).
Quero saber como fazer pra pintar uma parte específica de uma sprite. Sem usar dll ou extenções.
Vou dar um exemplo dizendo sobre a bandeira atrás do logo Game Maker.
Como fazer pra mudar a cor amarela sem passar pro outro lado?
No outro lado também tem a cor amarela, mas ta separada.
Tem como pegar o valor hexadecimal dessa cor e converter pra outro?

Minha dúvida é essa, quem poder me ajudar com esse detalhe eu agradeço.
Até logo!


Última edição por Super Maker em Seg 02 Jul 2012, 19:43, editado 1 vez(es)

Super Maker

Número de Mensagens : 646
Idade : 33
Data de inscrição : 09/07/2011
Reputação : 6
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido] Pintar parte da sprite

Mensagem por Gonzo em Dom 01 Jul 2012, 20:40

ola Super Maker olha eu tentei com a ferramenta substituir cor do photoshop mais parece q a imagem de fundo recebeu um filtro ou uma iluminação bem proximo ao amarelo então acho q da pra fazer só através de montagem separando as partes

* com a ferramenta substituir cor do photoshop



obs : vc tambem pode selecionar o obj com a ferramenta laço e ai usar a ferramenta substituir cor.



Gonzo

Número de Mensagens : 927
Data de inscrição : 29/05/2012
Reputação : 33
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido] Pintar parte da sprite

Mensagem por Super Maker em Dom 01 Jul 2012, 22:44

Pô mina valeu a tentativa, mas é em GML que eu quero fazer isso.
Vou mostrar uma imagem mais simples...

Quero pegar o valor FFFFFF do centro e transformar em qualquer outro. Como se eu estivesse jogando um baude de tinta no Paint.
Só preciso saber como pegar esse valor.

Super Maker

Número de Mensagens : 646
Idade : 33
Data de inscrição : 09/07/2011
Reputação : 6
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido] Pintar parte da sprite

Mensagem por Gonzo em Dom 01 Jul 2012, 23:14

bom.. creio que essa engine pode te ajudar

http://sandbox.yoyogames.com/games/184570-tutorial---letting-the-player-customize-colors

Gonzo

Número de Mensagens : 927
Data de inscrição : 29/05/2012
Reputação : 33
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido] Pintar parte da sprite

Mensagem por Gonçalves em Dom 01 Jul 2012, 23:28

Cara, eu já vi um cara explicando como faz isso (Até num tópico na GMC sobre pistas de corrida). Juro que vou tentar achar pra você... Razz

Gonçalves

Ranking : Nota B
Número de Mensagens : 1013
Data de inscrição : 29/10/2010
Notas recebidas : B + A + C
Reputação : 79
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 2
   : 0
   : 0

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido] Pintar parte da sprite

Mensagem por Super Maker em Seg 02 Jul 2012, 00:26

Bem, pegar a cor eu já tentei aqui e consegui. https://dl.dropbox.com/u/70151484/drawonsprite.gmk
Agora vou tentar mudar na sprite.

Mina, achei legal essas engines, mas isso eu sei fazer. Meu problema é mudar parte da sprite e não ela toda como nas engines.
Obrigado!

Gonçalves escreveu:Cara, eu já vi um cara explicando como faz isso (Até num tópico na GMC sobre pistas de corrida). Juro que vou tentar achar pra você... Razz
Valeu man, eu aguardo...

Super Maker

Número de Mensagens : 646
Idade : 33
Data de inscrição : 09/07/2011
Reputação : 6
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido] Pintar parte da sprite

Mensagem por Kabeção em Seg 02 Jul 2012, 11:02

Não há nem um meio rápido de se fazer isso sem DLL.
Inclusive eu até já fiz uma DLL para trocar a cor dos pixeis direto das texturas do DirectX na memória.
O processo era bem rápido mas o método só funcionava com o GM8.0 sendo que já tinha o 8.1 então não compensava continuar.

O único jeito para seu caso é redesenhar toda a sprite em uma surface ou dividir a imagem em partes e assim usar o image_blend para mudar a cor.

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

Resolvido Re: [Resolvido] Pintar parte da sprite

Mensagem por saim em Seg 02 Jul 2012, 13:34

Kabeção escreveu:O único jeito para seu caso é redesenhar toda a sprite em uma surface ou dividir a imagem em partes e assim usar o image_blend para mudar a cor.
Ou, se você não precisar de velocidade, percorrer a área, pixel por pixel, mudando o valor de hue dos pixels que tiverem um hue parecido com o original. Eu ainda vou descobrir um jeito de isolar uma específica usando blend modes. Se conseguíssemos isso, já era meio caminho andado.

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

Resolvido Re: [Resolvido] Pintar parte da sprite

Mensagem por GameMakerTutoriais em Seg 02 Jul 2012, 13:44



O jeito aí nesse caso é usar um flood fill. Há um tempo atrás eu peguei um engine muito bom naquele antigo "64digits" (não lembro se era esse o nome), mas agora não estou em casa, quando chegar eu dou um edit e posto ele aqui pra você (a menos que você consiga achá-lo lá, se é que ainda existe esse site).

Daria pra unir esse engine com essa ideia do saim de pegar o hue. O sistema do engine pega a cor do pixel, então, com pouca modificação a gente consegue isso. Pra ressalvar o que o Kabeção falou: não é rápido porque não usa dll. Ele usa dsmaps, é bem lento, mas funciona.

------- Edit -------

Outra ideia: isolar todas as cores com blend mode, exceto o branco (nesse caso especificamente)

Falou!

GameMakerTutoriais

Número de Mensagens : 800
Data de inscrição : 29/01/2011
Reputação : 26
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido] Pintar parte da sprite

Mensagem por saim em Seg 02 Jul 2012, 14:15

saim escreveu:Eu ainda vou descobrir um jeito de isolar uma específica usando blend modes. Se conseguíssemos isso, já era meio caminho andado.
Ninja8086 escreveu:Outra ideia: isolar todas as cores com blend mode, exceto o branco (nesse caso especificamente)
Se você souber como isolar QUALQUER cor com blend modes, eu gostaria de conhecer a teoria por trás dela.
Hm... talvez se... usássemos algo como bm_inv_dest_color... numa superfície totalmente pintada na cor que queremos isolar... não, as cores intermediárias também seriam afetadas. Mesmo que funcionasse, tentar isolar o vermelho transformaria o roxo em azul.
Continuo curioso, Ninja! Como você faria isso?

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

Resolvido Re: [Resolvido] Pintar parte da sprite

Mensagem por Super Maker em Seg 02 Jul 2012, 18:43

Os caras da pesada cheers
Valeu por estarem me ajudando!
Era isso que eu tava pensando pessoal. Um tipo de dsmap.
Percorrer a área que tem uma determinada cor e mudar esse valor pro que foi pego antes com o draw_getpixel(mouse_x,mouse_y), ou quem sabe criar e dividir em tempo real as várias surfaces pra cada cor, usando um loop.
Quem sabe fazer um dsmap assim? Ou elaborar um loop desses?
Eu vou tentando aqui enquanto isso.
Até logo!

Super Maker

Número de Mensagens : 646
Idade : 33
Data de inscrição : 09/07/2011
Reputação : 6
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido] Pintar parte da sprite

Mensagem por GameMakerTutoriais em Seg 02 Jul 2012, 18:55


saim escreveu:Se você souber como isolar QUALQUER cor com blend modes, eu gostaria de conhecer a teoria por trás dela.
Hm... talvez se... usássemos algo como bm_inv_dest_color... numa superfície totalmente pintada na cor que queremos isolar... não, as cores intermediárias também seriam afetadas. Mesmo que funcionasse, tentar isolar o vermelho transformaria o roxo em azul.
Continuo curioso, Ninja! Como você faria isso?

Então... Nesse caso, a gente não mexeria na cor e sim nos canais de cor. Quando a gente quer isolar uma cor determinada, a gente usa a cor contrária. Isso é muito comum em correção de imagens, por exemplo. É por isso que existem (também) o sistema CMYK, que é o contrário do RGBA.

A gente corrige vermelho com ciano (c), verde com magenta (m) e azul com amarelo (y). O que a gente vai fazer então? Isolar cada canal da imagen na surface, e a partir dos canais, trabalhar com eles de acordo com quanto de r, g ou b determinada cor usa. Lógico, vai afetar toda a imagen, afinal rgb é um composto.

Pra isolar cada canal, eu não tenho certeza absoluta, vou falar de cabeça, mas deve ser isso aqui... Digamos que cê tenha uma imagem onde a gente queira isolar o azul...

1 - Pinta a imagem na surface
2 - Pinta uma surface secundária toda de azul
3 - Usa o blend bm_dest_color e bm_zero (esse eu sei de cabeça porque é o mesmo usado pelo image_blend);
4 - Pinta a secundária por cima da primeira duas vezes com:
A - O contrário de verde: ~c_lime ou $ff00ff
B - O contrário de vermemo: ~c_red ou $ffff00

Daí você isola o azul. Pronto, agora é só escurecer ou clarear o canal. Isolar os outros e mesclar os canais rgb novamente. =)


Super Maker escreveu:
Os caras da pesada cheers
Valeu por estarem me ajudando!
Era isso que eu tava pensando pessoal. Um tipo de dsmap.
Percorrer a área que tem uma determinada cor e mudar esse valor pro que foi pego antes com o draw_getpixel(mouse_x,mouse_y), ou quem sabe criar e dividir em tempo real as várias surfaces pra cada cor, usando um loop.
Quem sabe fazer um dsmap assim? Ou elaborar um loop desses?
Eu vou tentando aqui enquanto isso.
Até logo!


Tá na mão, bróder. Acabei de fazer upload. Esse exemplo é legal demais, tu vai aprender a lot sobre ds_maps. A mudança que eu comentei é simples, vou deixar sem alteração pra que o pessoal possa baixar se interessarem, mas se precisar, a gente altera pra ti.

http://dl.dropbox.com/u/77818756/Game%20Maker/gm6%20-%20Floodfill.gm6

Falou!

GameMakerTutoriais

Número de Mensagens : 800
Data de inscrição : 29/01/2011
Reputação : 26
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido] Pintar parte da sprite

Mensagem por Super Maker em Seg 02 Jul 2012, 19:14

Isso é ótimo Ninja8086!
Da pra ver tudo sendo pintado, o dsmap trabalhando.
Se caso eu ordenar pra velocidade da room almentar pra não ficar vísível esse processo, vai consumir muita memória?

Super Maker

Número de Mensagens : 646
Idade : 33
Data de inscrição : 09/07/2011
Reputação : 6
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido] Pintar parte da sprite

Mensagem por GameMakerTutoriais em Seg 02 Jul 2012, 19:23


É bem lento mesmo, nesse caso, aumentar o speed do jogo não vai ajudar muito... Infelizmente. E eu não manjo nada da GMAPI, porque senão daria pra pegar esse sistema e mandar pra uma dll (eu acho! não manjo nada dela). =(


GameMakerTutoriais

Número de Mensagens : 800
Data de inscrição : 29/01/2011
Reputação : 26
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido] Pintar parte da sprite

Mensagem por Super Maker em Seg 02 Jul 2012, 19:42

Pô cara já é de bom tamanho oque você fez.
Pode deixar que seus créditos estão garantidos.
Muito obrigado mesmo a você e todos que ajudaram.
Resolvido!

Super Maker

Número de Mensagens : 646
Idade : 33
Data de inscrição : 09/07/2011
Reputação : 6
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido] Pintar parte da sprite

Mensagem por GameMakerTutoriais em Seg 02 Jul 2012, 20:18

Super Maker, vai lá na linha 79 do script que está no step, e troque isso:

Código:
if (doing_floodfill) {

por isso

Código:
while (doing_floodfill) {

Daí ele vai dar uma "travadinha" mas pelo menos não vai mostrar o processo de fill. Já vai mostrar a imagem pintada (não precisa alterar o room_speed).

Pô cara já é de bom tamanho oque você fez.
Pode deixar que seus créditos estão garantidos.

Não fui eu que fiz! Não tem os créditos do autor no engine, também não sei quem fez. Nesse caso, já que vai colocar, coloque para o 64digits, que pelo menos assim, valoriza um pouco o site que prestou o serviço.

Falou!

GameMakerTutoriais

Número de Mensagens : 800
Data de inscrição : 29/01/2011
Reputação : 26
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido] Pintar parte da sprite

Mensagem por Super Maker em Seg 02 Jul 2012, 20:24

Valeu pela dica Ninja8086.
Mais uma vez muito obrigado!

Super Maker

Número de Mensagens : 646
Idade : 33
Data de inscrição : 09/07/2011
Reputação : 6
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido] Pintar parte da sprite

Mensagem por Conteúdo patrocinado Hoje à(s) 15:45


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