mod_text alternativo!

Started by panreyes, April 21, 2013, 11:21:36 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

panreyes

Hola,


Para intentar mejorar el problema que tengo de descontrol con los FNTs desde tiempos inmemoriales, he creado mi propia implementación (en Bennu) de la librería mod_text (parcial).


Como todos los códigos que hago, son una ponzoña porque están hechos para funcionar sobre otros juegos míos, pero bueno, añadiendo un par de globales y locales lo podréis hacer funcionar.




Const
all_text=-1;


Global
matatextos;
fpg_texto_margen=-5;
fpg_texto_espacio=30;

Local
rand_y;
rand_angle;


Process test_text();
Private
id_texto;
retraso_repintado=5;
Begin
//stop_scroll(0);
//let_me_alone();
//delete_text(all_text);
id_texto=write(fpg_texto,0,0,0,"Hola, soy Pablo. Feliz Navidad");

while(!key(_Esc))
if(key(_a)) fpg_texto_margen--; end
if(key(_s)) fpg_texto_margen++; end
if(key(_q) and fpg_texto_espacio>0) fpg_texto_espacio--; end
if(key(_w)) fpg_texto_espacio++; end
if(key(_z) and id_texto.rand_y>0) id_texto.rand_y--; end
if(key(_x) and id_texto.rand_y<5) id_texto.rand_y++; end
if(key(_u) and id_texto.rand_angle>0) id_texto.rand_angle-=1000; end
if(key(_i) and id_texto.rand_angle<30000) id_texto.rand_angle+=1000; end
if(key(_left)) id_texto.angle-=1000; end
if(key(_right)) id_texto.angle+=1000; end
if(mouse.left) id_texto.size+=3; end
if(mouse.right) id_texto.size-=3; end
id_texto.x=mouse.x;
id_texto.y=mouse.y;
if(retraso_repintado<5)
retraso_repintado++;
else
retraso_repintado=0;
id_texto.accion=1;
end
frame;
end
exit();
End


Process write(fpg_fuente,x,y,centrado,string texto);
Private
mi_ancho;
mi_alto;
Begin
z=-512;

//1. pintamos texto en un mapa de bits
graph=dibujame_el_texto(fpg_fuente,texto,fpg_texto_margen,rand_y,rand_angle,0);

//2. centramos
centrame(file,graph,centrado);

//3. permanecemos
while(accion!=-1)
if(accion==1) //redibujamos
unload_map(0,graph);
//1. pintamos texto en un mapa de bits
graph=dibujame_el_texto(fpg_fuente,texto,fpg_texto_margen,rand_y,rand_angle,0);

//2. centramos
centrame(file,graph,centrado);


accion=0;
end
frame;
end
OnExit
unload_map(0,graph);
End


Process write_fixed(fpg_fuente,x,y,centrado,string texto,int fixed_width);
Private
mi_ancho;
mi_alto;
Begin
z=-512;

//1. pintamos texto en un mapa de bits
graph=dibujame_el_texto(fpg_fuente,texto,fpg_texto_margen,rand_y,rand_angle,fixed_width);

//2. centramos
centrame(file,graph,centrado);

//3. permanecemos
while(accion!=-1)
if(accion==1) //redibujamos
unload_map(0,graph);
//1. pintamos texto en un mapa de bits
graph=dibujame_el_texto(fpg_fuente,texto,fpg_texto_margen,rand_y,rand_angle,0);

//2. centramos
centrame(file,graph,centrado);


accion=0;
end
frame;
end
OnExit
unload_map(0,graph);
End


Function write_in_map(file,string texto,int centrado);
Begin
//1. pintamos texto en un mapa de bits
graph=dibujame_el_texto(file,texto,fpg_texto_margen,rand_y,rand_angle,0);

//2. centramos
centrame(file,graph,centrado);

return graph;
End


Function write_in_map_fixed(file,string texto,int centrado,fixed_width);
Begin
//1. pintamos texto en un mapa de bits
graph=dibujame_el_texto(file,texto,fpg_texto_margen,rand_y,rand_angle,fixed_width);

//2. centramos
centrame(file,graph,centrado);

return graph;
End


Process write_int(fpg_fuente,x,y,centrado,*numero);
Private
mi_ancho;
mi_alto;
anterior_numero;
Begin
z=-512;

//1. pintamos texto en un mapa de bits
graph=dibujame_el_texto(fpg_fuente,*numero,fpg_texto_margen,rand_y,rand_angle,0);

//2. centramos
centrame(file,graph,centrado);

//3. permanecemos
while(accion!=-1)
if(anterior_numero!=*numero) //redibujamos
unload_map(0,graph);
//1. pintamos texto en un mapa de bits
graph=dibujame_el_texto(fpg_fuente,*numero,fpg_texto_margen,rand_y,rand_angle,0);

//2. centramos
centrame(file,graph,centrado);


accion=0;
end
anterior_numero=*numero;
frame;
end
OnExit
unload_map(0,graph);
End


Function delete_text(cual);
Private
id_texto;
Begin
if(cual==-1)
while(id_texto=get_id(type write))
if(exists(id_texto))
id_texto.accion=-1;
end
end
while(id_texto=get_id(type write_int))
if(exists(id_texto))
id_texto.accion=-1;
end
end
else
if(exists(cual))
cual.accion=-1;
end
end
End


Function centrame(file,graph,centrado);
Private
mi_ancho;
mi_alto;
Begin
mi_ancho=graphic_info(file,graph,G_WIDTH);
mi_alto=graphic_info(file,graph,G_HEIGHT);


switch(centrado)
case 0: set_center(file,graph,0,0); end
case 1: set_center(file,graph,mi_ancho/2,0); end
case 2: set_center(file,graph,mi_ancho,0); end
case 3: set_center(file,graph,0,mi_alto/2); end
case 4: set_center(file,graph,mi_ancho/2,mi_alto/2); end
case 5: set_center(file,graph,mi_ancho,mi_alto/2); end
case 6: set_center(file,graph,0,mi_alto); end
case 7: set_center(file,graph,mi_ancho/2,mi_alto); end
case 8: set_center(file,graph,mi_ancho,mi_alto); end
end
End


Function dibujame_el_texto(file,string texto,int margen,rand_y_max,rand_angle_max,fixed_width);
Private
mi_alto_max;
mi_ancho_total;
Begin
texto=ucase(texto);


//1. contar el espacio horizontal y vertical
from i=0 to len(texto)-1;
if(asc(texto[i])==32)
mi_ancho_total+=fpg_texto_espacio+margen;
else
mi_ancho_total+=graphic_info(file,asc(texto[i]),G_WIDTH)+margen;
if(graphic_info(file,asc(texto[i]),G_HEIGHT)>mi_alto_max)
mi_alto_max=graphic_info(file,asc(texto[i]),G_HEIGHT)+(rand_y_max*2);
end
end
end
if(fixed_width>0)
mi_ancho_total=fixed_width*(len(texto)+1);
end


//2.creamos el gráfico
graph=new_map(mi_ancho_total,mi_alto_max,bpp);

//3. ponemos todas las letracas
from i=0 to len(texto)-1;
if(rand_y_max>0) rand_y=rand(-rand_y_max*2,0); end
if(rand_angle_max>0) rand_angle=rand(-rand_angle_max,rand_angle_max); end
if(fixed_width)
x=fixed_width+(fixed_width*(i));
y=mi_alto_max-(graphic_info(file,asc(texto[i]),G_HEIGHT)/2)+rand_y;
map_xputnp(0,graph,file,asc(texto[i]),x,y,rand_angle,100,100,0);
else
if(asc(texto[i])==32)
x+=fpg_texto_espacio+margen;
else
if(i==0)
x=(graphic_info(file,asc(texto[i]),G_WIDTH)/2);
else
x+=(graphic_info(file,asc(texto[i-1]),G_WIDTH)/2)+margen+(graphic_info(file,asc(texto[i]),G_WIDTH)/2);
end
y=mi_alto_max-(graphic_info(file,asc(texto[i]),G_HEIGHT)/2)+rand_y;
map_xputnp(0,graph,file,asc(texto[i]),x,y,rand_angle,100,100,0);
end
end
end

//4. devolvemos el id del gráfico
return graph;
End
[size=78%]


Podéis probarlo con el FPG que adjunto[/size]

DCelso

¿sabes que fpg-editor 4.0 puede abrir y guardar fns al estilo como hacía fpgs? quizas esto te ahorraría tiempo en crearte tu propio fpg para manejar fuentes.
E incluso puedes abrir un fnt, guardarlo en fpg y viceversa. (además puedes usar los puntos de control para guardar los offests de las letras)

Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

panreyes

No sabía nada de eso, tiene muy buena pinta :|


Lo utilizaré por lo menos para exportar las FNT a FPG

DCelso

Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

SplinterGU

Download Lastest BennuGD Release: http://www.bennugd.org/node/2