PDA

Ver la versión completa : Esacalar gráficos y guardarlos en un .fpg



masteries
04/12/2011, 15:48
Editado: El título es "Escalar gráficos y guardarlos en un .fpg", lo que tienen las prisas...


Saludos "compañeros del metal":

He estado intentando escalar gráficos y guardarlos en un .fpg ya escalados, para luego después no tener que utilizar la sentencia "size". Mi intención es guardar los gráficos ya preescalados.

Hasta ahora he estado haciendo esto a mano con Paint Shop Pro 8, pero es una tarea muy tediosa, y con la gran cantidad de sprites que necesito no es una opción viable.

El código que he utilizado es el siguiente, pero de momento no me ha funcionando porque no guarda el gráfico escalado, parece que no obedece a "size", tampoco me funciona la sentencia "save_fpg", no me la reconoce (Fénix 0.92a):



program spriteador;

global
int id_fpg;
int id_graph;
int id_new_graph;
BYTE aux_g;
end

BEGIN
full_screen=false;
set_mode(320,240,16);//Ventana de 320x240 color de 16 bits
set_fps(30,0);//30 fps por segundo
id_fpg=load_fpg("sprite.fpg");
graph=1;
x=160;
y=120;
frame;
for(aux_g=1;aux_g<=26;aux_g++)//empieza en el 1 porque la posición 0 es la original con size=100
switch(aux_g)
case 1:
graph=1;
size=100;
end
case 2:
graph=1;
size=95;
...
...
...
case 26:
graph=1;
size=11;
end
end//fin del switch
fpg_add(id_fpg,aux_g,id_fpg,graph);
frame;
end//fin del for
//fpg_save(id_fpg,"sprite");
write(0,160,10,4,"Comprobando...");
for(aux_g=1;aux_g<=26;aux_g++)
graph=aux_g;//no chuta, obedece al último size,
frame;//por lo que supongo que hace 26 copias iguales en tamaño al
end//original
//save_fpg(id_fpg,"sprites");
delete_text(all_text);
unload_fpg(id_fpg);
exit();
END


Si conoceís alguna manera de hacer esto mismo con algún programa de gráficos en lugar de programando, pues también me valdría.

Gracias anticipadas por las respuestas.

juanvvc
04/12/2011, 18:36
Me sospecho mucho que "size" en realidad hace una copia del gráfico y escala la copia (es decir, internamente se utiliza SDL_rotozoom) Así en el siguiente frame podrías cambiar el tamaño sin perder calidad, porque en realidad siempre escalas el original. Si esta suposición es verdad, la copia escalada no estará accesible desde Fenix/Bennu, así que no podrías guardarla con save_fpg(): siempre guardarías la imagen original sin escalar.

Puedes utilizar programas de procesamiento por lotes ("batch processing" en inglés). En linux, por ejemplo, prueba:



comando_para_sacar_todos_los_pngs_del_fpg
for img in *png; do
imgns=`basename $img .png`
convert -geometry 80% $img $imgns-80.png
convert -geometry 60% $img $imgns-60.png
convert -geometry 40% $img $imgns-40.png
convert -geometry 20% $img $imgns-20.png
done
comando_para_meter_pngs_en_fpg


Hay muchos programas para hacer esto gráficamente en cualquier sistema. En Linux, por ejemplo, Digikam es capaz de hacerlo. Pero creo que la línea de comandos es mucho más cómoda, sobre todo si vas cambiando los gráficos.

GameMaster
04/12/2011, 18:50
Mirando el código rapidamente, creo que sólo tienes que hacer una copia del grafico en el case a un nuevo mapa, y al salvar guardar el nuevo mapa en cada caso.

masteries
04/12/2011, 21:27
Voy a probar con ImageMagick que tiene un comando "convert" de estos.

Después de cenar os cuento.

Si, Juanvc, "size" hace eso que has explicado, y no merece la pena comerse más la cabeza teniendo un convert por ahí suelto.

Gracias por las respuestas.

juanvvc
04/12/2011, 22:49
Sí, eso decía, el convert de ImageMagick. En Linux está casi-casi por defecto aunque también se puede instalar en Windows.

masteries
04/12/2011, 23:28
Sí, eso decía, el convert de ImageMagick. En Linux está casi-casi por defecto aunque también se puede instalar en Windows.

Si, funciona perfecto bajo Windows. Sólo que hay que recordad que en la consola de Windows (y en el .bat que escribas) el carácter % se debe escribir duplicado %%, y durante unos minutos no había recordado esto.

Que suerte tenéis, os vais a hinchar a gráficos con la próxima entrega de Thunder Blade.:hype: