escalar imagen

Started by juguefre, April 15, 2017, 09:44:51 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

juguefre

Hola,

La pregunta es la del titulo, como escalo una imagen por codigo? estoy usando una imagen de 320x240 en un modo de 640x480 y la imagen obviamente no llena la pantalla.

estuve buscando y encontre que se hace con size o con size_x y size_y pero no logro hacer que funcionen......es que no soy programador apenas estoy aprendiendo.

este es el codigo que renderiza la imagen:

import "mod_video";
import "mod_map";
import "mod_screen";

process main()
private
   int idfpg;
end

begin
   set_fps(60,1);
   set_mode(640,480,32);
   idfpg=load_fpg("graphics/Level_01.fpg");
   put_screen(idfpg,4);
   
   frame;
   loop
      frame;
   end
   
end

si alguien puede modificar el codigo le quedo muy agradecido por que de una vez por todas aprendo a escalar imagenes.

Mil gracias por su tiempo.

Goku jr

Hola
siempre puedes utilizar la imagen con graph y luego con el comando size Aumentarla.


Saludos

juguefre

Hola Goku, podrias por favor mostrarme la forma de usar graph y size en el codigo que estoy usando.

Por que no se como se usan y a ciegas es muy dificil.

Mil gracias.

juguefre

eeeeh que cosa mas enredada....

begin
   set_fps(60,1);
   set_mode(640,480,32);
   idfpg=load_fpg("graphics/Level_01.fpg");   
   //put_screen(idfpg,4);
   //frame;
   graph=put_screen(idfpg,4);
   x=320;
   y=240;
   size=100;
   frame;
   loop   
      if (key(_esc))
         break;
      end
      frame;
   end
   unload_fpg(idfpg);

end

pero en realidad eso dibuja el grafico 2 veces, 1 en el tamaño original y luego lo dibuja otra vez sobre el anterior pero esta vez ocupa toda la pantalla.....no hay forma de escalarlo sin dibujarlo 2 veces??????

Goku jr

Hola
Puedes borrar put Screen y dejar solo graph con el número de gráfico que tengas en el fpg.
No puedo decir más ahora mismo,estoi en el trabajo

Saludos

juguefre

Funciona perfecto, mil gracias!

Drumpi

Size, size_x y size_y afectan sólo al gráfico asignado a GRAPH para ese proceso, o sea, en tu caso:
import "mod_video";
import "mod_map";
import "mod_screen";

process main()
private
   int idfpg;
end

begin
   set_fps(60,1);
   set_mode(640,480,32);
   file=load_fpg("graphics/Level_01.fpg");
   graph = 4;
   size = 200;  //Esto hace que la imagen se vea el doble de grande
   
   loop
      frame;
   end
   
end


Mientras ese proceso viva, podrás ver esa imagen.

SIN EMBARGO, si lo que quieres es poner una imágen en el fondo, te sugiero que leas lo siguiente:
http://wiki.bennugd.org/index.php?title=Put
http://wiki.bennugd.org/index.php?title=Xput
Son de la misma familia de funciones que PUT_SCREEN, pero más avanzadas, es decir, que te dan más opciones. Y por curiosidad, te recomiendo que mires las funciones relacionadas ;)
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

juguefre

Esto se pone muy interesante, ok tengo una duda que en mi falta de experiencia en 2D voy a tratar de solucionarla como si fuera 3D.

un escenario side scroller, el escenario no puede estar en una sola imagen verdad? por que entonces tendría que ser una imagen de resolución ridícula, algo como 12800x480 .....

yo pienso abordarlo dividiendo el escenario en multiples imagenes de 640x480 y renderizando cada una en la coordenada correspondiente para que se vea como un escenario continuo (algo muy similar a como se haria en 3D) mi pregunta es si esto se hace así realmente? o existe un método ya pre-establecido que funciona perfecto?

Mi primer ensayo funciona, no se si voy a encontrar errores luego, el código es este:

begin
   set_fps(60,1);
   set_mode(640,480,32);
   idfpg=load_fpg("graphics/Level_01.fpg");   
   put_screen(idfpg,1);
   frame;   
   graph=2;
   x=960;
   y=240;
   frame;
   loop   
      if (key(_esc))
         break;
      end
      frame;
   end
   unload_fpg(idfpg);

end

esto tiene sentido? es viable hacerlo así desde la perspectiva de un  programador?

juguefre

Ok graph no me funciona multiples veces, renderiza solo el ultimo "graph".

En cambio con put si funciona multiples veces pero encontre este problemita:



Hay una imagen "detras" de la que se renderiza mal.

este es el codigo:

begin
   set_fps(60,1);
   set_mode(640,480,32);
   idfpg=load_fpg("graphics/Level_01.fpg");   
   put_screen(idfpg,1);
   frame;
   
   put(0,2,320,240);
   put(0,3,320,400);

Yo no logro entender que es el primer valor del paréntesis despues de put

put(0,2,320,240);

El cero no tengo ni idea de que es cuando lo cambio a otro valor la imagen ya no se renderiza, el 2 es il id de la imagen en el archivo fpg y los valores 320 y 240 son las coordenadas en x y.

alguien me puede ayudar a comprender como se usa put correctamente.


juguefre

ok el error anterior se corrige simplemente colocando las imagenes en coordenadas diferentes:



lo que me lleva a una nueva duda, como controlo el orden en que se dibujan las imagenes en la pantalla?

ejemplo el escenario en el fondo, el personaje sobre el escenario y digamos algun elemento (un auto) sobre todos los anteriores creando el efecto de que el personaje camina entre el escenario y el auto......?

Help.....

Goku jr

Buenas
lo suyo esque crees procesos diferentes


process nivel1();
begin
put..
loop
frame;
end
end


process prota();...
...
..
end


process auto();...


etc


saludos

Drumpi

A ver por partes, porque no puedes usar algo sin entenderlo del todo:

En PUT, el primer parámetro es el valor que devuelve LOAD_FPG, que es el código que identifica a ese FPG. No pasa nada si sólo cargas uno, porque el primero siempre tiene valor 0, y el siguiente 1, y el siguiente 2... pero cuando empiezas a descargarlos, o a cargarlos en diferentes procesos, nunca sabes a ciencia cierta cuál es el valor que vas a obtener.
Por eso, lo ideal es realizar toda la carga de recursos al principio del juego, menú o nivel, y guardarlo en variables que puedas acceder más adelante (variables globales, paso de parámetros...).

Lo que te sucede que "parece que hay una imágen por detrás" se debe a que Bennu te está interpretando esos pixels como transparentes. Si usas un FPG "estandar", será de 16bits (a menos que lo hayas puesto de otra profundidad de color) y en ese caso, el color negro puro se interpreta como pixel transparente. En 32bits sí que hace caso al canal alpha, pero en 16 hace eso, en 8bits es el color 0 el que hace las veces de transparente, y en 1 bit... pues eso, el 0 es el transparente :P
Puedes evitarlo usando XPUT y el flag 128 (más conocido como NO_COLORKEY), que lo que hace es pintar la imagen ignorando los pixels transparente.

Pero vamos al meollo:
Sí, para lo que tu quieres, por lo general se usan dos imágenes en sendos procesos diferentes, que se van recolocando a medida que se avanza en el escenario. Si los vas a usar del mismo tamaño que la pantalla, sugeriría que fueran tres, porque en un momento dado tienes dos imágenes en pantalla y quieres ir preparando la siguiente.
Como poder, puedes usar un mapa gigante, aunque 12800x480 se me antoja un poco grande, pero burradas más gordas he visto (como tres mapas de 2208x1664, 1344x2144 y 2840x920, y sus respectivos mapas de dureza 8 veces más pequeños, usados en tres modo7 funcionando en una Wiz). Además, te quitarías de en medio los posibles tirones que te pueda dar si tienes que ir cargando imágenes.
Pero si las tienes todas en el mismo FPG, lo mismo te da usar procesos que añadirlo al scroll de Bennu: la memoria ya la has gastado al cargarlas todas juntas :D

Siendo tu primer proyecto, iría a lo simple: una imágen grande y directo al scroll. Como mucho, intenta dividir el mapa en secciones, con cargas entre una y otra, como castlevania cuando entras por una puerta, o Zelda cuando la ventana hace autoscroll. Si no, intenta lo de los dos procesos e ir cargando las imágenes a medida que avances (y si puedes usar la carga en modo dinámico, mejor, aunque pocos aquí la hemos usado). Y si te pones exquisito, puedes usar un scroll tileado, o ingeniarte un motor propio con un scroll construido a base de pequeños gráficos.

El orden de dibujado en pantalla te lo da la variable local predefinida Z. Si no sabes lo que es una variable, qué son variables locales, o cuales son las predefinidas, deberías echarle un vistazo al manual de Osk o algún tutorial para hacer un juego de ejemplo ;)
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

juguefre

#12
Mil gracias, muy útil la información de ambos.

@drumpi volvi a crear el .fpg para asegurarme que fuera 32 bits y aun asi continuo teniendo los errores de renderizado, alguna idea de que podria estar causando el error?

l1nk3rn3l

El ejemplo cazamuertos de Dreamcast esta todo lo que preguntas (scroll + personaje + menus)

uso de imagenes PNG en lugar de FPG haber si te va mejor... (puedes abrir las del ejemplo
en gimp o en photo paint para mantener sus propiedades de transparencia(alpha))

creo que el dreamcast debe tener video en 16 bits / no si si en 32 bpp tenga problemas con el color o no funcione...

set_mode(320,240,16); 

set_mode(320,240,32); // no probado




Drumpi

Quote from: juguefre on April 17, 2017, 01:18:43 PM
Mil gracias, muy útil la información de ambos.

@drumpi volvi a crear el .fpg para asegurarme que fuera 32 bits y aun asi continuo teniendo los errores de renderizado, alguna idea de que podria estar causando el error?


Por alguna razón, tu editor de FPG (no sé cuál es) te está tomando ciertas partes de la imagen como transparentes, y tienes que averiguar si es porque la imágen de verdad tiene esos pixels transparentes o si es porque estás usando el color negro puro. Tendrás que buscar la manera de arreglarlo.
Si no, haz una cosa: sube al foro tu FPG y el que pueda te mirará a ver qué puede estar pasando (incluso si lo acompañas de las imágenes originales te podríamos dar más pistas.

Si no, haz lo que te he dicho: usa XPUT y en la variable flags usa el valor NO_COLOR_KEY, o si estás ya usando procesos, en sus variables locales predefinidas FLAGS usa el mismo valor.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)