Scroll lateral en una ventana

Started by Ryo Suzuki, February 10, 2016, 08:47:29 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Ryo Suzuki

Resulta que estoy haciendo una pequeña demo tipo visual-novel aventura y como soy muy novato me he encontrado con otra dificultad.

Necesitaba mover una imagen hacia la derecha haciendo un scroll para que diera la impresión de un travelling de cámara. Una imagen vale más que mil palabras, para que me entendáis mejor:



Es una imagen de fondo con el bosque más ancha de lo que se ve y encima pongo una imagen en negro y con la transparencia en la "ventana" que deja ver solo una parte de la imagen detrás del bosque.

Bien, pues lo que hago es desplazar la imagen de detrás en la coordenada x en bucle for que le suma + 1 a esa coordenada. Sé que será una burrada, pero en mi PC actual queda muy bien el efecto y muy fluido, da la impresión que la cámara se esta moviendo hacia la izquierda haciendo una panorámica-travelling y consigo lo que buscaba.

El problema es que lo estoy haciendo para correrlo luego en Dreamcast y claro, una consola del 98 no puede con lo que se traga un PC de hoy en día y ahí va lentísimo y a tirones.

Estoy casi seguro que con un scroll implementado en Bennu sí que funcionaría bien también en Dreamcast, ya que no tengo pintar las dos imágenes en cada ciclo como hago con mi chapuza del for, el problema es que no sé hacerlo bien.

He probado modificando y estudiando algunos ejemplos a hacer un scroll lateral, pero la imagen del bosque se me ve repetida y no consigo poner la mascara negra delante.

¿Cómo debería hacerlo?

Muchas gracias por la ayuda, un saludo a la comunidad!!


P.D: Creo que podría crear una window con una función de Bennu propia y evitar hacer la máscara poniendo una imagen negra y con transparencia como si fuese un recorte, pero tampoco sé hacerlo

panreyes

No tengo tiempo para contestarte ahora, pero la pista está en define_region :)

Ryo Suzuki

Perfecto, estoy en ello!! (tengo el scroll ya moviéndose, ahora tengo que coseguir encajarlo bien en esa región)

Thnks!!

Drumpi

Experimenta también con start_scroll/stop_scroll, y sus variables globales scroll[0].x0 y scroll[0].y0 (y si usas una segunda imágen para un scroll parallax, scroll[0].x1 y scroll[0].y1).

De hecho, investiga después, sólo por curiosidad, la estructura global de datos de los scrolls.
Y si tienes el código de ejemplo que venía con Fenix y BennuGD, hay un apartado dedicado a los scrolls y a las cosas que puedes hacer como usuario avanzado.
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)

Ryo Suzuki

Ya lo he conseguido, muchas gracias por la ayuda.

En la Dreamcast va fino también a 24 frames sin frameskip (aunque me he tenido que andar con ojo con la calidad de la imagen de fondo que muevo y optimizarla al máximo)

Aquí el código:

clear_screen();
  start_scroll(0,imagen_fondo,1,0,1,1);
 

  for (longitud=0; longitud<250; longitud++) // una travelling lateral de hasta 250 es lo que da la imagen

   scroll[0].x0=scroll[0].x0+1;

  frame;
  end
frame(8000);
  stop_scroll(0);


Una vez definida la región, que es lo que me faltaba.

De todas formas me ha resultado muy incomodo ya que parto de una imagen inicial fija que se mueve al iniciar el scroll y acaba en otra final tambien fija cuando este acaba, pues bien he tenido que colocar las imagenes de principio y de final perfectas al pixel haciendo encaje de bolillos (para que no se notará el "cambiazo" en el scroll), no se si se hará así o hay alguna otra forma (aunque lo tengo ya listo es un poco coñazo)

También me ha parecido curioso que si no paras el scroll si quiero poner un sprite  luego lo pinta debajo del scroll en esa región, no se como se pintaba encima y ese ha sido el motivo por el que he tenido que parar el scroll (aunque estaba parado en si por animación por que había llegado al final del for) y poner la imagen en las mismas coordenadas manualmente.

Una duda final, solo por curiosidad, al    scroll[0].x0=scroll[0].x0+1;, etc.. ¿solo se le puede dar números enteros? Intentaba variar la velocidad usando decimales y no funcionaba entonces...

Drumpi

Lo ideal es que uses el scroll de principio a fin. Si se te quedan los personajes por detrás del scroll puedes:
- Variar la Z del scroll.
- Variar la variable local Z de los procesos personajes.
- Poner los personajes fuera de la región (o dentro del scroll).
Lo cierto es que no recuerdo los valores por defecto de la Z de los scrolls para decirte si por defecto están por delante o por detrás.

También puedes usar "scroll[0].x0++;" para los incrementos.
Y sí, todas las coordenadas usan valores enteros, porque los pixels de pantalla son valores enteros (por definición, es la unidad mínima de representación de un gráfico en pantalla). Pero puedes usar la variable local "resolution" para modificar esto. No recuerdo si los scrolls tenían una variable resolution dentro de su estructura, pero si no, siempre puedes usar una variable temporal que use los valores que quieres x10, y luego le asignes el valor al scroll dividiéndola por 10 (es decir, que si quieres mover el scroll 0'3 pixels, pongas

loop
  x_temp = x_temp + 3;
  scroll[0].x0 = x_temp / 10;
  frame;
end
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)

Ryo Suzuki

Muchas gracias, Drumpi, que olvidé contestarte.

Me funcionó bien todo y el consejo del truco con los valores enteros es genial para varias cosas. Un saludo.