Sprite sheet com frames de tamanhos diferentes

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

Sprite sheet com frames de tamanhos diferentes

Mensagem por Mauricio em Qui 31 Maio 2012, 13:54

Olá!
O game maker só consegue ler sprite sheets com frames do tamanho igual, certo?

Porém para quem quer usar sprites prontos de outros jogos, muitas vezes encontra só com os frames de tamanhos diferentes. Por ex: um frame de soldado parado que teria largura de 30pixels, seguido de um frame dele correndo, chutando, etc, com largura de 50 pixels... Muitos jogos definem via código o bounding box correto de cada frame e ai isso funciona.
Uma forma seria recortar cada frame num editor de imagens e criar um novo sprite sheet com todos os espaçamentos iguais. Ou então usar o add from file do editor do GM e pedir que alinhe por um lado e use o maior tamanho como padrão para todos os frames. Porém esse processo de recortar tudo é muito trabalhoso.

Alguém conhece um software free de processamento de sprites que faça isso? Pega um sprite sheet com frames de tamanho variado e exporta um com tamanho igual... (de forma semi automática, já que algum ajuste de alinhamento precisaria ser feito para tudo encaixar, provavelmente)

Ou seria possível fazer no GM um aplicativo para isso? Precisaria fazer processamento de imagem, ler pixel a pixel, descobrir o bounding box de cada frame, ajustar tudo, gerar um png novo... É possível?

Abraços.

Mauricio

Número de Mensagens : 114
Data de inscrição : 13/06/2008
Reputação : 1
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   :

http://mbg3dmind.wordpress.com/

Voltar ao Topo Ir em baixo

Re: Sprite sheet com frames de tamanhos diferentes

Mensagem por saim em Qui 31 Maio 2012, 14:24

O que eu faço é importar a sprite sheet inteira como cada frame, alinho manualmente e depois saio eliminado todas as imagens que eu não quero naquele frame através do redimensionamento. Se sobrar alguma coisa na frame, eu apago também manualmente.

Criar um aplicativo pra isso é possível, sim, mas não sei se vale a pena. O que eu faria é criar uma série de arrays onde cada elemento representa um dade de uma imagem (ponto inicial em x, em y, largura, altura). De posse desses dados, que teriam que ser inputados manualmente pelo jogador desenhista, o programa criaria uma surface com largura e altura adequadas e desenharia as imagens na ordem, exportando a figura pra um novo png.

Determinar a bounding box de cada frame automaticamente me parece impossível no nível de programação que estamos acostumados. Talvez esses softwares que reconhecem sorrisos, por exemplo, possam fazer esse tipo de coisa, mas aí já extrapola (muito) meu conhecimento.

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: Sprite sheet com frames de tamanhos diferentes

Mensagem por Mauricio em Qui 31 Maio 2012, 16:05

O problema é que ai a pessoa que teria que medir cada tamanho de cada frame, quase tão trabalhoso quanto recortar um por um.

Para determinar a bounding box automaticamente, bastaria varrer os pixels da imagens de cima p/ baixo, e então para direita. Achando a primeira cor diferente do fundo, seria o ponto mais esquerdo do bb, repetindo este processo para os outros lados teria as coordenadas do bb.

Por exemplo, um soft free que quase faz isso é esse: http://www.colourclash.com/sprite_buddy/sprite_buddy.html
Permite marcar os frames manualmente, ele detecta a bb e ajusta a seleção, então capturar o frame e seguir assim até o final. Porém ele só exporta um xml com os dados dos tamanhos de cada frame, não cria um sprite sheet novo limpo.

Mauricio

Número de Mensagens : 114
Data de inscrição : 13/06/2008
Reputação : 1
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   :

http://mbg3dmind.wordpress.com/

Voltar ao Topo Ir em baixo

Re: Sprite sheet com frames de tamanhos diferentes

Mensagem por saim em Qui 31 Maio 2012, 16:57

Mauricio escreveu:Para determinar a bounding box automaticamente, bastaria varrer os pixels da imagens de cima p/ baixo, e então para direita. Achando a primeira cor diferente do fundo, seria o ponto mais esquerdo do bb, repetindo este processo para os outros lados teria as coordenadas do bb.
Será? Embora lento, isso é fácil de fazer, mas acho arriscado pra caramba. É que esses spritesheets que não têm espaçamento certinho podem ter os frames colados um no outro, de forma que o fundo não fique numa coluna inteira em nenhum momento entre um frame e outro. Se bem que, nesses casos, o resultado poderia ser corrigido manualmente, também.

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: Sprite sheet com frames de tamanhos diferentes

Mensagem por Mauricio em Sex 01 Jun 2012, 09:21

Sempre que vi tinha separação de um frame para outro, então acho que isso não seria problema.
Enfim, acho que é um aplicativo realizável, mas daria um certo trabalho...
Qual é a forma de ler a imagem pixel a pixel? Talvez faça um teste um dia para ver o quanto cabeludo seria fazer algo assim...

Mauricio

Número de Mensagens : 114
Data de inscrição : 13/06/2008
Reputação : 1
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   :

http://mbg3dmind.wordpress.com/

Voltar ao Topo Ir em baixo

Re: Sprite sheet com frames de tamanhos diferentes

Mensagem por saim em Sex 01 Jun 2012, 11:02

Mauricio escreveu:Qual é a forma de ler a imagem pixel a pixel?
draw_get_pixel te retorna a cor da tela nas coordenadas solicitadas. Um loop varre a imagem do jeito que você quer.
Código:
draw_sprite(spriteEmQuestão, 0, 0, 0); //desenha a sprite na tela (mesmo fora do draw event). Considerei que a origem da sprite é em (0, 0), mas isso pode ser generalizado
var lar, alt, corDoFundo, colunaDeFundo, i, j;
lar = sprite_get_width(spriteEmQuestão); alt = sprite_get_height(spriteEmQuestão);
corDoFundo = draw_get_pixel(0, 0); //considera o primeiro pixel (topo-esquerda) como um inútil
for(i = 0; i < lar; i += 1){ //de coluna em coluna
    colunaDeFundo = true; //começa partindo do pré-suposto que a
    for(j = 0; j < alt; j += 1){ //de linha em linha na coluna atual não tem imagem
        if (draw_get_pixel(i, j) != corDoFundo){ //se algum pixel na coluna não tem a mesma cor que o fundo
            colunaDeFundo = false; //essa coluna representa uma parte de uma imagem
            }
        }
    }
Suponho que isso seja um começo. Talvez colocar a variável "linhaDeFundo" em uma array ajude a tratar os resultados, talvez seja melhor mexer dentro do código mesmo. Fica pra você decidir.
Repito o que o próprio manual diz: a função draw_get_pixel é muito lenta, portanto prepare-se pra esperar alguns segundos, talvez até minutos sem o computador responder nada. Faça os testes com imagens pequenas.

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: Sprite sheet com frames de tamanhos diferentes

Mensagem por Mauricio em Sex 01 Jun 2012, 13:25

Ok, valeu!
Consegui fazer um gerador de bounding box de uma imagem simples! Mas isso só funciona se for um fundo liso sem compressão.
Se quiser dar uma olhada pegue aqui. Basta apertar enter que a bb será desenhada sobre o sprite.

http://dl.dropbox.com/u/15200241/bounding_box.gm81

Mauricio

Número de Mensagens : 114
Data de inscrição : 13/06/2008
Reputação : 1
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   :

http://mbg3dmind.wordpress.com/

Voltar ao Topo Ir em baixo

Re: Sprite sheet com frames de tamanhos diferentes

Mensagem por Mauricio em Sex 01 Jun 2012, 16:10

Aliás tive uma idéia agora que poderia ser mais simples e resolveria o problema. Em vez de fazer um sprite sheet regular a partir de um irregular, poderia fazer um aplicativo fatiador de frames, criando vários arquivos png.

Seria carregar um sprite sheet irregular no projeto, ele iria então detectar o primeiro frame pela bounding box, salvar um png em disco só com ele. Depois partiria para o próximo frame (considera que o 0,0 agora é depois da posição do primeiro) gerando outro png, e assim vai.

Depois no jogo que quiser usar esta arte, basta pelo editor de sprite escolher o add from file, marcar os png´s e o GM dá opção de usar o tamanho do maior em tudo, ou seja, ficará tudo importado direito.

Como o sistema é lento e pega só a cor de fundo exatamente, o recomendável é usar um sprite sheet pequeno (pode cortar em linhas de frames e usar um por vez) e já deixar transparente antes do processo.

O único detalhe é quando tem vários frames no sprite, a bounding box não pode só buscar a cor diferente do fundo de um lado e do outro, pois iria pegar o início do primeiro frame e o final do último... teria que ter uma idéia de onde está a separação entre um e outro... Tem como automatizar isso?

Rastrear toda a forma encontrada via código é complicado e não seria suficiente, pois pode ter um sprite cortado no meio de propósito... (tentáculos voadores, ou sei lá, é possível).

Talvez o usuário tenha que manualmente clicar entre os frames para indicar ao sistema a separação (arrastar uma linha ou algo assim). Seria um trabalho pequeno para o usuário... ainda valeria a pena.

Editado por Joton
Cuidado com o post duplo amigo, se caso precise adicionar mais conteúdo edite o recado anterior.

Mauricio

Número de Mensagens : 114
Data de inscrição : 13/06/2008
Reputação : 1
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   :

http://mbg3dmind.wordpress.com/

Voltar ao Topo Ir em baixo

Re: Sprite sheet com frames de tamanhos diferentes

Mensagem por saim em Sex 01 Jun 2012, 17:28

Hehehe... Você está lentamente chegando à conclusão de que é mais fácil separar os sprites manualmente...

Acho mais simples fazer uma spritesheet automaticamente. mesmo. A cada coluna que for completamente da cor do fundo, muda-se o índice da próxima imagem. Você pode criar vários sprites num mesmo loop, depois pode definir a maior altura e maior largura pra usar como separação. Por fim, joga isso tudo numa surface e exporta a surface em formato .png, já sem o fundo. Se seu programa for bem-feito, dá até pra perguntar pro usuário se ele quer que as sprites de largura diferente sejam alinhadas à esquerda, direita ou centro. Só gastar um tempinho com a matemática.

Suponho que os casos dos tentáculos voadores sejam exceções que mereceriam uma edição completamente manual. Nesses casos, não vale a pena entrar com informação via usuário. É uma exceção que deixaria o programa chato de se usar. No máximo, você pode mostrar a imagem com a separação de frames e perguntar "tá bom? sim ou não?" e, se a resposta for não, só aí vai pra uma tela de edição manual.

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: Sprite sheet com frames de tamanhos diferentes

Mensagem por Mauricio em Sex 01 Jun 2012, 18:58

Hmm, varrendo linha ou coluna inteira com cor de fundo realmente acharia a separação sozinho... se claro, for um sprite sheet bem organizado (muitos não são, mas ai o user se vira, corta ou acha outro)

Atualização: Veja o que achei por acaso!!!

http://drugos.com.br/Projetos/spritesheet-maker.html

Programa de um brasileiro feito para selecionar frames de um sprite sheet irregular e salvar tudo num regular !!! É praticamente o que preciso!

Porém tem que selecionar tudo na mão (mas dá para alinhar com teclas WASD vendo o frame anterior) e ele não pega a cor de fundo automático...
Sugeri para o autor automatizar algumas coisas, mesmo que tenha que marcar frame a frame, se encolher a seleção pelo bb sozinho, é um processo rápido. Vamos ver se ele responde...

Edit: Consegui fazer um aplicativo que mais ou menos funciona, dê uma olhada:

http://dl.dropbox.com/u/15200241/bounding_box_fatiador5.gm81

Ele permite carregar um sprite sheet (se não carregar nada abre um de teste já pré definido), permite selecionar área com o mouse.
Se quiser encolher área para o bounding box do frame dentro (1 frame), pressione espaço. Se quiser fazer o mesmo para vários frames, alinhados horizontalmente, pressione Q. Ele detecta vários dentro da área selecionada, sendo que a cor de fundo é pega como o pixel superior esquerdo da seleção. Porém este sistema de detectar vários é meio instável, dependendo da seleção, definição da cor do sprite pode dar certo ou não. Se puder dar uma olhada para deixar o código funcionando 100% seria ótimo.

Em qualquer situação de seleção pode pressionar ENTER para exportar os frames como imagens individuais. Se usar o sistema de vários bb, cria uma sequência de imagem.

Então com estes frames exportados pode abrir no GM do jogo que quiser, pelo add from file ele deve usar o tamanho do maior, então tudo encaixa.

Caso um frame não fique bem alinhado, estou fazendo um outro aplicativo que permite tocar a animação na mão e transladar o frame que tiver ruim, até arrumar e então exportar de novo (inspiração naquele soft que achei).

Porém para este sistema funcionar tenho 2 dúvidas: como carregar uma sequencia de imagem para fomar um sprite animado via código? (o mesmo procedimento do add from file). E outra coisa simples mas que não funciona é colocar a cor do fundo da room igual a cor do primeiro pixel da imagem. Uso o getpixel e coloco este valor no background_color, mas não dá certo.

Sorry pela quantidade de informações, é que estou animado com o projeto que evoluiu bastante em pouco tempo Cool Agradeço a ajuda.

Edit: Consegui acabar a ferramenta que comecei aqui!

Divulguei neste post:

http://gmbr.forumeiros.com/t23101-ferramenta-para-recortar-sprite-sheet-e-alinhar-frames#172930

Mauricio

Número de Mensagens : 114
Data de inscrição : 13/06/2008
Reputação : 1
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   :

http://mbg3dmind.wordpress.com/

Voltar ao Topo Ir em baixo

Re: Sprite sheet com frames de tamanhos diferentes

Mensagem por Zero. em Qua 11 Jul 2012, 13:20

Só uma coisinha básica Happy :

pra calcular qual o tamanho de cada imagem no sheet é so pegar a width ou a height do sprite sheet e dividir pela quantidade imagens (horizontal ou vertical)

Zero.

Número de Mensagens : 1295
Idade : 20
Data de inscrição : 19/08/2010
Reputação : 47
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: Sprite sheet com frames de tamanhos diferentes

Mensagem por Mauricio em Qua 11 Jul 2012, 21:12

Sim, supondo que todos os frames tenham o mesmo tamanho...

A ferramenta em questão foi feita para detectar e exportar frames de tamanhos diferentes dentro do mesmo sprite sheet.

Mauricio

Número de Mensagens : 114
Data de inscrição : 13/06/2008
Reputação : 1
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   :

http://mbg3dmind.wordpress.com/

Voltar ao Topo Ir em baixo

Re: Sprite sheet com frames de tamanhos diferentes

Mensagem por Zero. em Qua 11 Jul 2012, 21:39

vc pode mandar ela em GMK ?
eu queria ver .

Zero.

Número de Mensagens : 1295
Idade : 20
Data de inscrição : 19/08/2010
Reputação : 47
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: Sprite sheet com frames de tamanhos diferentes

Mensagem por Mauricio em Qui 12 Jul 2012, 18:58

Diz a versão final das ferramentas? Segue:

Fatiador:
https://dl.dropbox.com/u/15200241/bounding_box_fatiador9.gm81

Editor alinhamento:
https://dl.dropbox.com/u/15200241/editor_alinhamento5.gm81

Mauricio

Número de Mensagens : 114
Data de inscrição : 13/06/2008
Reputação : 1
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   :

http://mbg3dmind.wordpress.com/

Voltar ao Topo Ir em baixo

Re: Sprite sheet com frames de tamanhos diferentes

Mensagem por Zero. em Qui 12 Jul 2012, 19:01

Mas está em gm81, eu queria em gmk. que é o formato do GM 8

Zero.

Número de Mensagens : 1295
Idade : 20
Data de inscrição : 19/08/2010
Reputação : 47
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: Sprite sheet com frames de tamanhos diferentes

Mensagem por Mauricio em Qui 12 Jul 2012, 19:03

Foi feito no GM 8.1, não tenho como abrir no 8 para salvar no formato dele.

Mauricio

Número de Mensagens : 114
Data de inscrição : 13/06/2008
Reputação : 1
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   :

http://mbg3dmind.wordpress.com/

Voltar ao Topo Ir em baixo

Re: Sprite sheet com frames de tamanhos diferentes

Mensagem por Conteúdo patrocinado Hoje à(s) 16:26


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