PDA

Ver la versión completa : Redimensionar imagenes de un FPG de forma automatica



bleim
12/01/2006, 23:34
Hola!

Sigo sin conseguir redimensionar las imagenes de forma automatica con un programita de fenix, para ahorrarme el hacerlas una a una (y son muchas).

El programita es el siguiente:

---------------------------------------------------------------------------------------
PROGRAM CONVERSOR2X;

GLOBAL
//contador
contador;

fpg_origen; fpg_dest; graph_orig; graph_dest; alto; ancho; //para el cambio

//fpg's nuevos
nfpg_general;


//fpg's antiguos
fpg_general; //cosillas generales como pantalla de presentacion
fpg_marcador; //marcadores
fpg_bonus; //para los bonus
fpg_final; //enemigo final

fpg_vegeta; //se hace carga/descarga de fpgs xa ahorrar memoria
fpg_ken;
fpg_arjona;
fpg_javi;
fpg_hacker;
fpg_pawer;
fpg_agente;

fpg_golpes; //golpes y efectos especiales
fpg_carga; //carga de mana
fpg_pantallas; //pantallas (+adelante carga/descarga)
fpg_raton; //graficos del raton

LOCAL

BEGIN
set_mode(m320x240);
set_title("Conversor de fpgs a mitad de tamaño v1.0");

//carga de fpg's (excepto de los jugadores, que se cargan/descarg dinamicamente)
put(fpg_general,20,160,120); FRAME; //barra al 0 % de carga
fpg_general=load_fpg("fpg/general.fpg");

put(fpg_general,21,160,120); FRAME; //barra al 25 % de carga
fpg_marcador=load_fpg("fpg/marcador.fpg");
fpg_pantallas=load_fpg("fpg/fase1.fpg");
fpg_golpes=load_fpg("fpg/golpes.fpg");
fpg_carga=load_fpg("fpg/carga.fpg");
fpg_raton=load_fpg("fpg/raton.fpg");

put(fpg_general,22,160,120); FRAME; //barra al 50 % de carga
fpg_vegeta=load_fpg("fpg/vegeta.fpg");
fpg_ken=load_fpg("fpg/ken.fpg");
fpg_arjona=load_fpg("fpg/arjona.fpg");
fpg_javi=load_fpg("fpg/javi.fpg");
fpg_hacker=load_fpg("fpg/hacker.fpg");
fpg_pawer=load_fpg("fpg/pawer.fpg");
fpg_agente=load_fpg("fpg/agente.fpg");

//carga de fuentes
put(fpg_general,23,160,120); FRAME; //barra al 75 % de carga


put(fpg_general,24,160,120); FRAME; //barra al 100 % de carga

fade_off(); WHILE(fading) FRAME; END //oscurecemos y borramos la pantalla

nfpg_general=fpg_new();

//TOCAR AQUI
fpg_origen=fpg_general;
fpg_dest=nfpg_general;

for(contador=1;contador<=100;contador++)

graph_orig=map_clone(fpg_origen,contador);
ancho=GRAPHIC_INFO (fpg_origen, contador, g_wide);
alto=GRAPHIC_INFO (fpg_origen, contador, g_height);
graph_dest=new_map(alto/2,ancho/2,16);
map_xput(0,graph_dest,graph_orig,0,0,0,50,0);
fpg_add(fpg_dest,contador,0,graph_orig);
unload_map(0,graph_orig);
end

fade_on(); WHILE(fading) FRAME; END //oscurecemos y borramos la pantalla

write (0,120,140,4,"CONVERSION COMPLETADA");
loop
if (key(_esc)) break; end
frame;
end

//creamos y salvamos el nuevo fpg
//INT SAVE_FPG ( INT librería, STRING fichero )
//TOCAR AQUI
save_fpg(fpg_dest, "nfpg_general.fpg" );

FRAME;
END



---------------------------------------------------------------------------------------
Este programa crea un fpg nuevo, pero es exactamente igual al anterior, excepto que donde antes no habia graficos (por ejemplo tenemos una animacion del numero 1 al 12 y la siguiente animacion del 15-20, pues ahora hay un grafico repe en 13 y 14, que no molesta pero ahi está).

Segun la documentacion:
MAP_XPUT ( INT librería, INT gráfico, INT gráfico-origen, INT x, INT y, INT ángulo, INT tamaño, INT flags, INT region ), es decir 9 campos, pero no va sin quitar el ultimo.
Por tanto debería haber un ",0" al final del xput, pero si lo pongo peta. ¿Qué está pasando? ¿Es por la versión de fenix usada?

bleim
13/01/2006, 06:46
Bien, ya va MAS O MENOS.
Pilla un FPG y saca una copia con la MITAD de tamaño para cada imagen del FPG.
Luego es cuestion de ver como ha quedado y retocar. Lo cierto es que el redimensionado es malillo, pero como en todo redimensionado la definición del algunos elementos, como las letras se pierden con mucha facilidad.
Al terminar, hay que pulsar ESC para salir.

Ahi va el codigo: (grabar como conversor2x.prg)

OJETE-> El programa no esta automatizado. Ahi que tocar desde DENTRO del archivo varias cosas (se indica, hecha un vistazo). Si alguien quiere que lo retoque, yo ahora mismo no tengo ganas, pero quizá me anime.
OJETE2->De momento es para 8 bits. Si lo quieres para 16 cambia esta linea:
graph_dest=new_map(nancho,nalto,8);
por esta:
graph_dest=new_map(nancho,nalto,16);
Supongo que ira, pero ya lo probare.


----------------------------------

PROGRAM CONVERSOR2X;

/////////////////////DEFINIMOS VARIABLES///////////////////////////////
GLOBAL
//contador
contador;

/////////////////////////////////////////////////////////////////////////////////
//para el cambio ¡no toques esto!
fpg_origen; fpg_dest;
graph_orig; graph_dest;
alto; ancho; nancho; nalto;
NUM_FRAMES_FPG_A_MODIFICAR;
texto;

//////////////////////////////////////////////////////////////////////////////
//fpg nuevos
nfpg_general; //no toques esto!

///////////////////////////////////////////////////////////////////////////////
// los fpgs antiguos a convertir
fpg_general; //no toques esto!


////////////////////// PROGRAMA EN SI ///////////////////////////////////


nfpg_general=fpg_new(); //no toques esto!



/////////ATENCION: LO QUE DEBES TOCAR ESTA AQUI ABAJO /////
//primero cargamos los archivos. pon la ruta al fpg original
fpg_general=load_fpg("fpg/general.fpg");
//aqui pon el frame mas alto del fpg (ojo: NO TE PIDO la cantidad total de frames //del fpg original, si no el del numero mas alto)
// (en mi caso 122 es el ultimo frame)
NUM_FRAMES_FPG_A_MODIFICAR=122;

// Vale, el resto hacia abajo no lo toques :P ////////////
/////////////////////////////////////////////////////////////////////


//aqui no toques nada
fpg_origen=fpg_general;
//el nombre del fpg nuevo siempre es el mismo (al acabar lo renombras
//desde el explorador mismamente) no toques esto
fpg_dest=nfpg_general;


for(contador=1;contador<=NUM_FRAMES_FPG_A_MODIFICAR;contador++)
graph_orig=map_clone(fpg_origen,contador);
ancho=GRAPHIC_INFO (fpg_origen, contador, g_wide);
alto=GRAPHIC_INFO (fpg_origen, contador, g_height);
nancho=abs(ancho/2);
nalto=abs(alto/2);
graph_dest=new_map(nancho,nalto,8);
//MAP_XPUTNP (FILE_DST, GRAPH_DST, FILE_SRC, GRAPH_SRC, X, Y, ANGLE, SCALE_X, SCALE_Y, FLAGS)
MAP_XPUTNP (fpg_dest, graph_dest, fpg_origen, graph_orig, nancho/2, nalto/2, 0, 50, 50, 0);
fpg_add(fpg_dest,contador,0,graph_dest);
unload_map(0,graph_orig);
end


write (0,120,140,4,"CONVERSION COMPLETADA.");
loop
if (key(_esc)) break; end
frame;
end

//creamos y salvamos el nuevo fpg
save_fpg(fpg_dest, "nfpg_general.fpg" );

FRAME;
END

--------------------------------

Saludos!

Hokutoy
13/01/2006, 07:18
Gracias!

Supongo que esto irá muy bien para el tema de portar juegos con fpgs a distintas resoluciones.
Nice! :)

chipan
13/01/2006, 07:23
No está nada mal, yo lo haría leyendo uno de cada 2 pixels de cada 2 lineas del mapa de origen para pasarselos al de destino ya que la función size no rula muy bien que digamos. O también se podría hacer que leyera 4 pixels de cada vez, hallase la media del color, buscase el mas parecido en la paleta y lo pusiese en el mapa de destino; eso si, si en los cuatro pixels elegidos hay 2 pixels o menos en color 0, que los ignore y si hay mas que ponga directamente color 0.

bleim
13/01/2006, 07:25
Gracias, pero recordar que aun hay que pulirlo y en cualquier caso esto NO es al vuelo, porque es un bucle y segun el fpg puede tardar un huevo. A parte, deberia saltarse cuando no hay grafico (por ejemplo en el 12 tengo un grafico y el siguiente en el 15, en este caso deberia saltar el 13 y 14).

saludos!

bleim
15/01/2006, 22:51
Vaya! No iba tambien como pensaba!
El programa actual no tiene en cuenta los puntos de control, y este es un defecto grave. Los personajes de mi juego tienen el punto de control 0 en los pies, y todo el código cuenta con ello por lo que es importante.

Lo que pasa es que, ademas, no redimensiona bien. Mientras el punto de control 0 esté en el centro, va perfecto el programilla. Pero si no lo esta... cagada!
Al parecer al redimensionar se hace desde este punto, no desde el centro del mapa.
¿alguna idea?

ahora estoy haciendo una nueva version que coge el punto de control 0 y lo pone en el nuevo mapa en el lugar correcto, veremos si puedo corregir lo del redimensionado!

bleim
15/01/2006, 23:09
Ya va perfecto.
De momento SOLO recoge el punto de control 0.

Lo adjunto junto con este mensaje. Tan solo teneis que adaptarlo a vuestros fpgs. Creo que se entiende bastante.