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
[resolvido] EXportar sprite de fonte
4 participantes
Página 1 de 1
[resolvido] EXportar sprite de fonte
Eu estou tentando criar uma sprite pra ser importada como fonte. A fonte já existe, mas eu quero que ela apareça colorida numa textura específica.
Então estou tentando criar uma sprite com todas as letras equidistantemente separadas pra importar depois, como fonte.
Então a idéia é:
- criar uma surface do tamanho necessário pra desenhar todas as letras
- cobrir essa surface com a textura
- a cada espaço, desenhar uma letra, num blend mode tal que fique a cor da textura no formato da letra
- como isso gera alguns espaços retangulares com a textura, eliminar esses espaços
Então criei o seguinte script:
- o texto não aparece na parte de baixo da surface (por isso eu somei 5 em várias linhas do texto)
- o retângulo branco come o começo de algumas letras (fica maior do que devia na letra anterior, provavelmente)
- o retângulo branco NÃO come todo o espaço entre as letras (fica menor do que deveria na letra em questão)
Eu poderia sim, criar um script pra ser usado no draw_event, que exibisse a surface que está sendo criada. Mas dependendo do tamanho do texto, eu temo que isso venha a deixar o jogo lento. Então gostaria de resolver esses problemas, se for possível.
Você sabe o que está errado no script?
Então estou tentando criar uma sprite com todas as letras equidistantemente separadas pra importar depois, como fonte.
Então a idéia é:
- criar uma surface do tamanho necessário pra desenhar todas as letras
- cobrir essa surface com a textura
- a cada espaço, desenhar uma letra, num blend mode tal que fique a cor da textura no formato da letra
- como isso gera alguns espaços retangulares com a textura, eliminar esses espaços
Então criei o seguinte script:
- Código:
//criaSpriteFonte(fonte, sprite da textura, primeira, última, altura, largura, save);
//retorna uma surface com o desenho dos caracteres (do inicial ao final) coloridos com a textura
//ainda requer alguns arranjos (eu preferiria usar fa_top e criar a surface na altura da sprite, mas não tem funcionado)
//prepara o jeito de desenhar (fonte e alinhamento)
draw_set_font(argument0);
draw_set_valign(fa_bottom);
draw_set_halign(fa_left);
var textura, inicial, final, altura, largura, larSurface, Surf, Surf2, pdx;
textura = argument1; //sprite com a textura
inicial = argument2; //a primeira letra (em ascii code)
final = argument3; //a última letra (em ascii code)
altura = argument4; //altura da fonte (não consegui usar algo como "font_get_height")
largura = argument5; //espaço entre uma letra e outra na imagem;
larSurface = (final - inicial + 1) * largura; //tamanho das surfaces
//Cria a surface
Surf = surface_create(larSurface, altura + 5); //não sei porque somar 5 na altura
surface_set_target(Surf)
//cobre a textura com a surface
pdx = 0; //ponto de desenhar
while (pdx < larSurface){
draw_sprite_ext(sprTextura, 0, pdx, 0, 1, 1, 0, $ffffff, 1); //usei o "_ext" pra poder mudar a cor e/ou alpha, mas depois achei bobagem
pdx += sprite_get_width(sprTextura);
}
// draw_set_blend_mode_ext(bm_zero, bm_src_alpha);
// desenha cada uma das letras
pdx = 0; //ponto de desenhar
for(i = inicial; i <= final; i +=1){
draw_set_blend_mode_ext(bm_dest_color, bm_zero); //letras na cor da tela, tela em alpha zero
draw_text_color(pdx, altura + 5, chr(i), $ffffff, $ffffff, $ffffff, $ffffff, 1); //não sei porque somar 5 na altura
draw_set_blend_mode(bm_subtract); //pra tirar a rebarba
draw_rectangle_color(pdx + string_width(chr(i)), 0, pdx + largura, altura + 5, $0, $0, $0, $0, 0);
pdx += largura;
}
draw_set_blend_mode(bm_normal);
//como o fundo fica na cor da textura, apesar do alpha ser zero, o paint mostra a imagem como se fosse um retângulo no padrão da textura
//o resto do code é pra consertar isso.
Surf2 = surface_create(larSurface, altura + 5);
surface_set_target(Surf2)
draw_clear_alpha($ffffff, 0);
draw_surface(Surf, 0, 0); //desenha na cor da imagem, no alpha do fundo; o que elimina as áreas de alpha=0 da imagem.
surface_reset_target();
surface_free(Surf); //a primeira surface realmente perde a utilidade, aqui
if (argument6 == true){ //se é pra criar um arquivo
surface_save(Surf2, "alfabeto.png");
}
return(Surf2);
- o texto não aparece na parte de baixo da surface (por isso eu somei 5 em várias linhas do texto)
- o retângulo branco come o começo de algumas letras (fica maior do que devia na letra anterior, provavelmente)
- o retângulo branco NÃO come todo o espaço entre as letras (fica menor do que deveria na letra em questão)
Eu poderia sim, criar um script pra ser usado no draw_event, que exibisse a surface que está sendo criada. Mas dependendo do tamanho do texto, eu temo que isso venha a deixar o jogo lento. Então gostaria de resolver esses problemas, se for possível.
Você sabe o que está errado no script?
Última edição por saim em Ter 03 Jul 2012, 15:50, editado 1 vez(es)
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: [resolvido] EXportar sprite de fonte
Pelo que eu testei, parece que isso não é um problema de cálculo. O cálculo do script tá certinho, o lance aí parece ser um problema com os blend modes (não erro seu, e sim alguma coisa ao sei lá, processar esses pixels das beiradas, vai saber...). Isso já aconteceu comigo desenhando sprites, ficava uma "beirada", uma linha em volta do sprite que eu até usei pra efeitos.
Com caracteres onde as beiradas não são muito arredondadas, isso não acontece:
Quando ao width e height de cada texto, o que eu faço normalmente é dar um loop em todos os caracteres e pegar o valor maior de tudo, com string_width e string_height.
Com caracteres onde as beiradas não são muito arredondadas, isso não acontece:
Quando ao width e height de cada texto, o que eu faço normalmente é dar um loop em todos os caracteres e pegar o valor maior de tudo, com string_width e string_height.
GameMakerTutoriais- Data de inscrição : 29/01/2011
Reputação : 26
Número de Mensagens : 800
Prêmios :
x 0 x 4 x 0
x 0 x 0 x 0
x 0 x 0 x 0
Re: [resolvido] EXportar sprite de fonte
Eu tava tentando criar algo como isto, só que deu um Unexpected Error.
O que eu realmente mudei foi que eu tirei o retangulo que se colocava depois do texto, a adição da fonte já no final e algumas mudançinhas no código.
- Spoiler:
- Código:
//criaSpriteFonte(fonte,textura)
draw_set_font(0)
draw_set_valign(0)
draw_set_halign(0)
var i,largura,altura,Surf,Surf2,spr,font;
largura=0 //a maior largura das letras
altura=0 //a maior altura das letras
//pegar todas as letras (acho que não é preciso colocar argumentos no script)
for(i=0;i<=255;i+=1) {
//se for maior que maximo de largura/altura atual, SER o maximo
if largura < string_width(chr(i)) {largura = string_width(chr(i))}
if altura < string_height(chr(i)) {altura = string_height(chr(i))}
}
//cap para não ter completion options, né?
Surf=surface_create(largura*255,altura)
surface_set_target(Surf)
//calculo para pegar a quantidade de texturas a serem desernhadas
for(i=0;i<floor((largura*255)/sprite_get_width(argument1))+1;i+=1) {
draw_sprite(argument1,0,i*sprite_get_width(argument1),0)
}
//saim: se achou bobagem porque ainda deixou lá?
//tudo bem, eu não sei nada sobre blend modes.
draw_set_blend_mode_ext(bm_dest_color,bm_zero)
draw_set_color(c_white)
//desenha todas as letras
for(i=0;i<255;i+=1) {draw_text(i*largura,0,chr(i))}
draw_set_blend_mode(bm_normal)
//apagar a "cor" do fundo
Surf2=surface_create(largura*255,altura)
surface_set_target(Surf2)
draw_clear_alpha(c_white,0)
draw_surface(Surf,0,0)
//surface_reset_target()
surface_free(Surf)
spr=sprite_create_from_surface(Surf2,0,0,surface_get_width(Surf2),surface_get_height(Surf2),0,0,0,0)
//^ Aqui dá o erro
surface_reset_target()
surface_free(Surf2)
font=font_add_sprite(spr,0,1,0)
sprite_delete(spr)
return(font)
O que eu realmente mudei foi que eu tirei o retangulo que se colocava depois do texto, a adição da fonte já no final e algumas mudançinhas no código.
Re: [resolvido] EXportar sprite de fonte
@luiz_eldorado
Luiz, acho que o problema no seu código é que você está tentando pegar tudo (a tabela toda). Tem alguns caracteres que não são impressos. Talvez seja isso. Tente reduzir esse número e veja se funciona...
Se não funcionar, abra um tópico pra gente te ajudar, assim fica mais organizado responder cada dúvida separadamente. o/
@saim
Saim, montei uma ideia base aqui, veja se resolve ou se pelo menos ajuda nisso que você quer. Eu acho que o problema pode ter sido o blend, como comentei antes. Desenhei a fonte e o fundo como se fosse uma máscara em preto e branco e depois apliquei a textura.
Também usei o draw_primitive pra texturizar, acho que fica mais legal e dá mais possibilidades de efeitos.
Falou!
GameMakerTutoriais- Data de inscrição : 29/01/2011
Reputação : 26
Número de Mensagens : 800
Prêmios :
x 0 x 4 x 0
x 0 x 0 x 0
x 0 x 0 x 0
Re: [resolvido] EXportar sprite de fonte
Talvez seja o tal do "jogo genérico" que eu uso. Ele tem uns comportamentos estranhos, mesmo. Se ajuda, eu testei as fontes Haettenschwiler e arial (a que eu quero mesmo é a Haettenscheiler). O problema ficou bem mais evidente com a arial, mas o "A" (maiúsculo) teve metade se sua imagem comida pela "@" anterior (mesmo que eu aumentasse MUITO o espaço entre as letras) nas duas fontes.Ninja8086 escreveu:Pelo que eu testei, parece que isso não é um problema de cálculo. O cálculo do script tá certinho, o lance aí parece ser um problema com os blend modes (não erro seu, e sim alguma coisa ao sei lá, processar esses pixels das beiradas, vai saber...).
Eu posso precisar desse script no futuro, então acho melhor generalizar (se for uma fonte que só escreva uma ou outra palavra, dá pra diminuir a sprite).luiz_eldorado escreveu://pegar todas as letras (acho que não é preciso colocar argumentos no script)
O comentário é mais pra mim mesmo. É que eu testei um monte de alternativas, uma delas funcionou, no sentido de não deixar as rebarbas de textura. Eu mantive a forma original de desenhar pra me lembrar das alternativas existentes.luiz_eldorado escreveu://saim: se achou bobagem porque ainda deixou lá?
Tem um tutorial na minha assinatura!luiz_eldorado escreveu://tudo bem, eu não sei nada sobre blend modes.
Acho que não, os argumentos da função estão ok. Unexpected errors normalmente acontecem quando a gente esquece de usar um argumento num script. O game maker usa o valor "zero" e o script pode não funcionar direito.luiz_eldorado escreveu:Surf2=surface_create(largura*255,altura)
(...)
spr=sprite_create_from_surface(Surf2,0,0,surface_get_width(Surf2),surface_get_height(Surf2),0,0,0,0)
//^ Aqui dá o erro
A dica do Ninja também tem fundamento, os primeiros caracteres não são imprimíveis. Não acho que seja essa a causa, mas vale a pena testar. Ah, se for procurar uma tabela ascii, ignore os valores acima de 127. Eles não batem.
Valeu, Ninja, mas o conetúdo do seu link está bloqueado aqui, pra mim. Vou dar uma olhada em casa.Ninja8086 escreveu:Saim, montei uma ideia base aqui, veja se resolve ou se pelo menos ajuda nisso que você quer. Eu acho que o problema pode ter sido o blend, como comentei antes. Desenhei a fonte e o fundo como se fosse uma máscara em preto e branco e depois apliquei a textura.
Também usei o draw_primitive pra texturizar, acho que fica mais legal e dá mais possibilidades de efeitos.
Agora, essa idéia de desenhar o texto primeiro e aplicar a textura depois, eu já testei (usando draw_set_blend_mode_ext(bm_dest_alpha, bm_zero), se não me engano) e o resultado ficou razoável, mas não muito bom. As partes em que a fonte têm um alpha diferente de um ficaram meio pretas, prejudicando o resultado final.
Se bem que talvez isso tenha acontecido porque eu desenhei a fonte em preto... Agora eu não lembro. Vou testar seu link à noite e falo se é a mesma coisa, se o problema era a cor do texto e se o caso está resolvido!
Valeu!!!
Quanto às primitives, eu também acho que dá pra fazer muita coisa bacana, mas nesse caso, não sei o que poderia acrescentar. Talvez um alpha em degradê de cima pra baixo, sumindo com a sprite, mas não muito mais que isso. Lembrando que a sprite vai gerar uma fonte, que pode ser usada em qualquer ordem (então não dá pra criar algum efeito radial, por exemplo).
Edit: quase lá!!!
Alterei um pouco os blend modes. Agora eu crio uma mask pra ser removida na surface com a textura, o que, teoricamente, deixa só a imagem das letras.
Funciona bem bonitinho.
Mas o código parou de gravar o arquivo .png. Não sei porque. O arquivo simplesmente não aparece mais.
Cheguei a pensar que eu estivesse entrando com o argumento errado, mas não. Coloquei um outro comando (mostrar uma mensagem) pra só ser executado se o primeiro também fosse. A mensagem aparece na tela, mas o arquivo não aparece em lugar nenhum. Onde foi que eu errei agora?
Eis o novo script:
- Código:
//criaSpriteFonte(fonte, sprite da textura, primeira, última, save);
//retorna uma surface com o desenho dos caracteres (do inicial ao final) coloridos com a textura
//ainda requer alguns arranjos (eu preferiria usar fa_top e criar a surface na altura da sprite, mas não tem funcionado)
//prepara o jeito de desenhar (fonte e alinhamento)
draw_set_font(argument0);
draw_set_valign(fa_top);
draw_set_halign(fa_left);
var textura, inicial, final, altura, largura, larSurface, Surf, Surf2, pdx; //
textura = argument1; //sprite com a textura
inicial = argument2; //a primeira letra (em ascii code)
final = argument3; //a última letra (em ascii code)
//define a altura e largura máximas dos caracteres
altura = 0; largura = 0;
for(i = inicial; i <= final; i += 1){
altura = max(string_height(chr(i)), altura); largura = max(string_width(chr(i)), largura);
}
larSurface = (final - inicial + 1) * largura; //tamanho das surfaces
//Cria a surface pra ser usada como tesoura
Surf = surface_create(larSurface, altura);
surface_set_target(Surf);
draw_clear_alpha($ffffff, 1);
draw_set_blend_mode(bm_subtract);
px = 0; //posição do desenho
for(i = inicial; i <= final; i += 1){
draw_text_color(px, 0, chr(i), $ffffff, $ffffff, $ffffff, $ffffff, 1)
px += largura;
}
draw_set_blend_mode(bm_normal);
//cria a surface pra ser recortada
Surf2 = surface_create(larSurface, altura);
surface_set_target(Surf2);
//cobre a textura com a surface
pdx = 0; //posição do desenho
while (pdx < larSurface){
draw_sprite_ext(sprTextura, 0, pdx, 0, 1, 1, 0, $ffffff, 1); //usei o "_ext" pra poder mudar a cor e/ou alpha, mas depois achei bobagem
pdx += sprite_get_width(sprTextura);
}
// recorta a surface anterior
// draw_set_blend_mode_ext(bm_zero, bm_inv_src_alpha); // -> NÃO É a mesma coisa que bm_subtract!!! (jurava que era...)
draw_set_blend_mode(bm_subtract);
draw_surface(Surf, 0, 0);
draw_set_blend_mode(bm_normal);
//agora volta com o resultado pra uma surface limpa, pra não dar confusão quando abrir no paint
surface_set_target(Surf);
draw_clear_alpha($ffffff, 0);
draw_surface(Surf2, 0, 0);
surface_reset_target();
surface_free(Surf2);
if (argument4 == true){ //se é pra criar um arquivo
surface_save(Surf, "alfabeto.png");
show_message("devia");
}
return(Surf);
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: [resolvido] EXportar sprite de fonte
Agora, essa idéia de desenhar o texto primeiro e aplicar a textura depois, eu já testei (usando draw_set_blend_mode_ext(bm_dest_alpha, bm_zero), se não me engano) e o resultado ficou razoável, mas não muito bom. As partes em que a fonte têm um alpha diferente de um ficaram meio pretas, prejudicando o resultado final.
Mas nesse caso, você estaria usando uma fonte por sprites (tipo um png)? Se sim, acho que o ideal seria que você usasse ela por inteiro (sem alpha) e deixasse pra aplicar o alpha como a última coisa. Aí ela não perde a qualidade em nada, porque fonte é um vetor no fim das contas (embora sejam convertidas pra imagens quando incorporadas no projeto, mas enfim... não perde qualidade)
Quanto aos efeitos das primitives.... Um dos que eu pensei foi redimensionar a textura pra cada caractere da fonte. Outro: rotacionar a textura, coisa que seria mais difícil "plotando" as imagens uma a uma dentro de um loop. Enfim, é opcional.
Mas o código parou de gravar o arquivo .png. Não sei porque. O arquivo simplesmente não aparece mais.
Estranho... eu já vi acontecer o contrário. Mas o que não aparece é o arquivo ou o conteúdo dele? Se for o arquivo, será que ele está gravando na pasta temporária (porque você não especificou um caminho...). Tenta lá, se for isso mesmo:
- Código:
surface_save(Surf, working_directory + "\alfabeto.png");
Falou!
GameMakerTutoriais- Data de inscrição : 29/01/2011
Reputação : 26
Número de Mensagens : 800
Prêmios :
x 0 x 4 x 0
x 0 x 0 x 0
x 0 x 0 x 0
Re: [resolvido] EXportar sprite de fonte
Não, fontes normais, mas com bordas arredondadas e linhas inclinadas (Haettenschweiler e Arial). Você perguntou isso porque eu mencionei o alpha != 1, né? Esses detalhes de suavização é que usam o canal alpha. Houve até uma lista de fontes pixeladas, sugeridas no concurso preto-e-branco, pra evitar que houvessem pixels semi-transparentes, resultando em tons de cinza.Ninja8086 escreveu:você estaria usando uma fonte por sprites (tipo um png)?
É, você tem razão. Já que o script vai ser guardado pra reuso, nada mais sensato que deixá-lo maleável, não é mesmo? Basta lembrar que pra usar texturas, o lado da sprite tem que ser uma potência de 2, mas isso eu acho que nem precisa acrescentar um comentário.Ninja8086 escreveu:Quanto aos efeitos das primitives....
É o arquivo, cara! Coisa mais estranha do mundo, num momento, ele grava tudo lindamente, depois parece simplesmente ignorar o comando. Até achei que estivesse faltando algum argumento ou que houvesse algum risco da surface estar totalmente limpa (o GM tem um comportamento bizarro, nesse caso), mas fiz diversos testes (inclusive escrever o endereço completo, como você sugeriu) e nada.Ninja8086 escreveu:Mas o que não aparece é o arquivo ou o conteúdo dele? Se for o arquivo, será que ele está gravando na pasta temporária (porque você não especificou um caminho...). Tenta lá, se for isso mesmo:
- Código:
surface_save(Surf, working_directory + "\alfabeto.png");
O pior é que antes ESTAVA gravando! O show_message ESTÁ mostrando a mensagem!
Adicionei a linha "surface_save(canvas, "teste.png");" no seu script e o arquivo foi gravado!
Aliás, seu script é muito bom, mas ainda dá aquele problema das beiradas escuras. Realmente é um problema de blending, mas não sei qual combinação usar. Quando eu crio uma máscara branca (com o texto como "buracos") e uso pra recortar (bm_subtract) uma surface com a textura, as beiradas ficam na cor esperada. Já que não estou conseguindo consertar o meu script, acho que vou adaptar o seu pra fazer isso. Assim que der certo (claro que vai dar!) eu volto aqui, posto o script corrigido e peço pra trancar o tópico.
Ah, você fez uma pequena confusão com sprite e textura, no script (definiu o argumento como a textura, mas usou sprite_get_width/height). Eu testei e até funciona, mas a textura fica esticadona. Modifiquei pra usar a sprite como argumento, posto a versão alterada assim que chegar no resultado completo.
Edit: Resolvido!!!
O problema era a cor do fundo, não os blend modes. Colocando branco, resolveu tudo!
Eu achei que branco seria um problema, porque estávamos usando bm_dest_color em src, mas revi o manual e bm_dest_color leva em conta o valor de alpha, também. No paintbrush, ficamos com a impressão que nada foi feito (a textura aparece inteirinha, sem letras), mas acrescentei algumas linhas pra redesenhar a surface sobre outra totalmente limpa e gravei o novo resultado. Foi mais simples do que eu esperava.
- Código:
/*
--------------------------------------------------------------
criaSpriteFonte(fonte, sprite da textura, primeira, última, save);
retorna uma surface com o desenho dos caracteres (do inicial ao final) coloridos com a textura
--------------------------------------------------------------
*/
var c, sheet_font, sheet_sprt, sheet_patt, inicial, final, gravar, maxw, maxh, text_length, ch, canvas, canvas2, xrepmax, yrepmax;
sheet_font := argument0; // Fonte
sheet_sprt := argument1; // sprite da textura
sheet_patt := sprite_get_texture(sheet_sprt, 0); // Padrão da textura
inicial := argument2; // primeira letra
final := argument3; // última letra
gravar := argument4; // se é pra criar o arquivo da fonte
maxw := 0;
maxh := 0;
text_length := final - inicial + 1; // Pega quantos caracteres há no texto
// Anula se não houver nenhum
if (text_length <= 0){
exit;
}
draw_set_font(sheet_font);
draw_set_valign(fa_top);
draw_set_halign(fa_left);
// Máximo vertical e horizontal
for (c := inicial; c <= final; c += 1){
ch := chr(c);
maxw := max(string_width (ch), maxw);
maxh := max(string_height(ch), maxh);
}
canvas := surface_create(maxw * text_length, maxh);
surface_set_target(canvas);
draw_clear_alpha(c_white, 0);
// Prepara pra "desenhar" o texto
draw_set_alpha(1);
// draw_set_color(c_white);
for (c := 0; c <= text_length; c += 1){
ch := chr(c + inicial);
draw_text_color(c * maxw, 0, ch, $ffffff, $ffffff, $ffffff, $ffffff, 1); // Escreve o caractere na posição apropriada
}
draw_set_blend_mode_ext(bm_dest_color, bm_inv_src_alpha);
/*
Achei essa forma de aplicar a textura mais maleável
número de repetições, etc
*/
xrepmax := (maxw * text_length) / sprite_get_width(sheet_sprt); // quantas vezes a textura vai se repetir na horizontal
yrepmax := maxh / sprite_get_height(sheet_sprt); // quantas vezes a textura vai se repetir na vertical
texture_set_blending(bm_normal);
texture_set_repeat(true); // Repita automaticamente
// Desenha pegando os pontos da textura (0 a 1)
draw_primitive_begin_texture(pr_trianglestrip, sheet_patt);
draw_vertex_texture(0, 0, 0, 0);
draw_vertex_texture(0, maxh, 0, yrepmax);
draw_vertex_texture(maxw * text_length, 0, xrepmax, 0);
draw_vertex_texture(maxw * text_length, maxh, xrepmax, yrepmax);
draw_primitive_end();
draw_set_blend_mode(bm_normal);
// desenha o resultado numa surface limpa (pra visualizar a fonte no paint, que não conhece o que é alpha)
canvas2 := surface_create(maxw * text_length, maxh);
surface_set_target(canvas2);
draw_clear_alpha($ffffff, 0);
draw_surface(canvas, 0, 0);
// Reseta e retorna a surface, com o texto já texturizado
surface_reset_target();
surface_free(canvas);
if (gravar == true){
surface_save(canvas2, "alfabeto.png");
}
return (canvas2);
Edit2: Ah, e parece que o problema dele não gravar mais é por causa do game genérico mesmo! Eu já tinha notado que o game genérico tem um limite de caracteres pra texto, mas não imaginei que isso fosse influenciar nesse caso (já que cada texto tem apenas um caractere). Parece que o limite existe também com relação ao tamanho das surfaces... Bastou diminuir a diferença entre a letra inicial e a final. Acho que quando eu criar um arquivo com o game maker propriamente dito, essa limitação some.
Última edição por saim em Ter 03 Jul 2012, 16:45, editado 2 vez(es)
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: [resolvido] EXportar sprite de fonte
Hoy!
eu não entendi muito bem o que você esta tentando fazer.
mesmo assim eu fiz um script que transforma font para sprite texturizada com background
é muito simples de usar
funciona com os 255 caracteres de qualquer fonte
eu não entendi muito bem o que você esta tentando fazer.
mesmo assim eu fiz um script que transforma font para sprite texturizada com background
- Código:
/*********
font_to_sprite(first,prop,texture);
example:
font=font_to_sprite(32,127,Background);
Writed by Washiro Seito.
*********/
var cW,cH,c,surf,_spr,_sprtex,_sprtmp;cW=0;cH=0;_spr=-1;
for(i=argument0;i<argument1;i+=1;)
{c=chr(i);
cW=max(string_width(c),cW);
cH=max(string_height(c),cH);
}surf=surface_create(cW,cH);
surface_set_target(surf);draw_set_color(c_white);
draw_set_halign(fa_center);
for(i=argument0;i<argument1;i+=1;)
{draw_clear(0);draw_clear_alpha(0,0);
draw_text(cW/2,0,chr(i));//draw_point(cW-1,cH-1);
if(i==vk_space){draw_point(0,cH-1)draw_point(cW-1,cH-1);}
_sprtmp=sprite_create_from_surface(surf,0,0,cW,cH,0,0,0,0);
draw_clear(0);draw_clear_alpha(0,0);
draw_background_tiled(argument2,-i*cW,0);
_sprtex=sprite_create_from_surface(surf,0,0,cW,cH,0,0,0,0);
sprite_set_alpha_from_sprite(_sprtex,_sprtmp);sprite_delete(_sprtmp);_sprtmp=_sprtex;
if(_spr==-1)_spr=_sprtmp;else{sprite_merge(_spr,_sprtmp);sprite_delete(_sprtmp)};};
surface_reset_target();
sprite_index=_spr;draw_set_halign(fa_left);
surface_free(surf);
return(font_add_sprite(_spr,argument0,argument1,0));
é muito simples de usar
- Código:
font=font_to_sprite(32,127,Background);
draw_set_font(font);
draw_text(mouse_x,mouse_y,"Fonte de Sprite Texturizado!");
funciona com os 255 caracteres de qualquer fonte
Re: [resolvido] EXportar sprite de fonte
Uau, Jiraya, você foi além do necessário. O que eu queria mesmo era exportar um arquivo, pra poder importar em outro jogo, como fonte.
Mas agora, pensando bem, eu posso simplesmente importar a fonte-base e a textura e, com seu script (alterando aqui e ali), criar a fonte logo no começo de cada jogo.
Eu estava evitando esse raciocínio porque achei que seria demorado pra iniciar, mas pensando bem, a demora é pequena. O ganho no tamanho de arquivo é pequeno (uma imagem de "0" a "z", tamanho da fonte = 36 resultou num arquivo de 52Kb, enquanto a textura por si só - 128 x 128 -ocupa 44 Kb). Agora não sei qual a melhor abordagem pra padronizar, parece que tanto faz.
Agora, tenho umas perguntas quanto ao seu script (ainda não testei pra ver como funciona):
- pra que usar draw_clear se logo em seguida você usa draw_clear_alpha?
- como funciona a função sprite_set_alpha_from_sprite? Eu já usei ela antes, mas nunca entendi o que ela faz, exatamente. O manual fala em "valores de intensidade", o que não quer dizer nada, pra mim
- eu achei que vk_space fosse só o valor da TECLA, não do caractere. Coincidência ou existe uma relação aí?
Ainda quero entender melhor seu script, mas tenho que ir. Ficam essas perguntas, por enquanto. Acho que surgirão mais.
Mas agora, pensando bem, eu posso simplesmente importar a fonte-base e a textura e, com seu script (alterando aqui e ali), criar a fonte logo no começo de cada jogo.
Eu estava evitando esse raciocínio porque achei que seria demorado pra iniciar, mas pensando bem, a demora é pequena. O ganho no tamanho de arquivo é pequeno (uma imagem de "0" a "z", tamanho da fonte = 36 resultou num arquivo de 52Kb, enquanto a textura por si só - 128 x 128 -ocupa 44 Kb). Agora não sei qual a melhor abordagem pra padronizar, parece que tanto faz.
Agora, tenho umas perguntas quanto ao seu script (ainda não testei pra ver como funciona):
- pra que usar draw_clear se logo em seguida você usa draw_clear_alpha?
- como funciona a função sprite_set_alpha_from_sprite? Eu já usei ela antes, mas nunca entendi o que ela faz, exatamente. O manual fala em "valores de intensidade", o que não quer dizer nada, pra mim
- eu achei que vk_space fosse só o valor da TECLA, não do caractere. Coincidência ou existe uma relação aí?
Ainda quero entender melhor seu script, mas tenho que ir. Ficam essas perguntas, por enquanto. Acho que surgirão mais.
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: [resolvido] EXportar sprite de fonte
isso era apenas para ter certeza que a surface seria completamente limpa.
- pra que usar draw_clear se logo em seguida você usa draw_clear_alpha?
mas pessoalmente acho que só o draw_clear_alpha resolvia.
isso faz uma sprite remover a area apartir dos pixels de outra sprite
- como funciona a função sprite_set_alpha_from_sprite? Eu já usei ela antes, mas nunca entendi o que ela faz, exatamente. O manual fala em "valores de intensidade", o que não quer dizer nada, pra mim
técnicamente seria como se vc recorta-se uma figura de uma folha de papel.
sim vk_space é apenas um atalho para ord(" ")
- eu achei que vk_space fosse só o valor da TECLA, não do caractere. Coincidência ou existe uma relação aí?
o game maker parece ter um problema na hora de usar sprites como fonte.
ou seja, ele ignora imagens vazias, e n desenha no draw_text, resultando em um texto todo "grudado"
então eu coloquei dois pontos literalmente, nas imagem vazias, assim a imagem n seria ignorada, na hora de desenhar o texto.
Re: [resolvido] EXportar sprite de fonte
saim escreveu:Ah, e parece que o problema dele não gravar mais é por causa do game genérico mesmo! Eu já tinha notado que o game genérico tem um limite de caracteres pra texto, mas não imaginei que isso fosse influenciar nesse caso
Ué, sério? Caramba, isso eu não sabia! Já aconteceu algumas coisas estranhas comigo também usando só código externo, mas agora que você comentou isso é que eu liguei as coisas. Jamais imaginaria... Se for realmente esse o problema, vou pensar seriamente em parar de usar scripts em txt's.
GameMakerTutoriais- Data de inscrição : 29/01/2011
Reputação : 26
Número de Mensagens : 800
Prêmios :
x 0 x 4 x 0
x 0 x 0 x 0
x 0 x 0 x 0
Re: [resolvido] EXportar sprite de fonte
Parece que não sou o único que não entende completamente essa função... Ela vai além disso! Quando eu usei, foi pra remover gradualmente o alpha de uma sprite, usando as funções de draw. Quando você desenha uma sprite que vai do branco ao preto , ambos totalmente opacos, e usa essa função numa outra sprite também totalmente opaca, o alpha resultante é uma gradação de totalmente opaco a totalmente transparente, onde o preto original é o transparente resultante. Acho que é daí que vem o "intensidade" (e não "opacidade" ou "alpha") do manual. Variações no alpha original, obviamente, também impactam o resultado. Não sei como prever o que cores diferentes dos tons de cinza e/ou com alphas intermediários causariam no resultado final.Jiraya escreveu:isso faz uma sprite remover a area apartir dos pixels de outra sprite
- como funciona a função sprite_set_alpha_from_sprite? Eu já usei ela antes, mas nunca entendi o que ela faz, exatamente. O manual fala em "valores de intensidade", o que não quer dizer nada, pra mim
técnicamente seria como se vc recorta-se uma figura de uma folha de papel.
Será que "intensidade" é uma média entre vermelho, verde, azul e alpha? Ou será a média das cores MULTIPLICADA pelo valor de alpha (0-1)? Hmmm... Isso dá pra descobrir testando, na base da tentativa-e-erro... Se ninguém se manifestar enquanto eu testo, volto a postar aqui.
Edit: Aparentemente, ele aplica a média das cores de uma sprite (independente do valor de alpha) no valor de alpha da outra sprite (independente das cores). Mas essa média é não uma média muito precisa. Teoricamente, as cores $ff8800 e $888888 seriam iguais, mas um olhar atento identifica uma diferença sutil.
Um fundo branco com alpha zero resultou num alpha de 100%, ao ser aplicado numa sprite de alpha 100%.
Edit2: Hm, achei que ele vinha ignorando o comando de desenhar o quadrado preto-transparente sobre o fundo branco-transparente, mas agora voltei à estaca zero quanto ao alpha... desenhei um quadrado branco(50% alpha) num funto preto e apliquei essa sprite como fonte. Se fosse só a cor, o resultado seria 100% opaco, mas saiu semi-transparente. Porque, então, o branco-transparente usado como fonte resulta numa opacidade de 100%?...
Heheh! Deve ser alguma salvaguarda do programa, pra evitar que alguém crie um tal de "jogo genérico" e use isso como um crack meia-boca...Ninja8086 escreveu:vou pensar seriamente em parar de usar scripts em txt's.
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
Tópicos semelhantes
» [Resolvido]Fonte em sprite?
» [RESOLVIDO] Usar sprite como fonte
» Como é carregado uma fonte no sprite?
» [RESOLVIDO] Fonte na HUD
» [Resolvido]Fonte com borda
» [RESOLVIDO] Usar sprite como fonte
» Como é carregado uma fonte no sprite?
» [RESOLVIDO] Fonte na HUD
» [Resolvido]Fonte com borda
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos