[Tecnica] Un zoom en un scroll

Started by KeoH, July 11, 2011, 03:51:30 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

KeoH

Pues eso .. q abro este mensaje para preguntar si a alguno de vosotros se os ocurre como hacer para q haya zoom en un scroll.
Pongo un ejemplo: imaginemos un juego de plataformas clasico (Sonic por ejemplo) donde el personaje se mueve en un scroll lateral, según va mas rápido sería mas comodo q la camara del scroll se alejara del personaje para que se viera mas terreno.
Pues eso... a alguien se le ocurre como hacerlo? porq en un scroll normal habria que rehacer el scroll (un stop scroll y un start_scroll) con un mapa distinto y reducirle el size a todos los procesos ... pero lo un coñazo y poco util xD.
Otra forma q se me ocurrió fue utilizar un motor de tiles como el de Echo por ejemplo .. q tendria sus propias funciones para simular un scroll ... lo veo complicao tambien .. pero lo mas viable ....¿que se os ocurre? xD

Esto es un post participativo para describir una tecnica de programación para nuestros juegos que igual nos puede ser util xD .. como el post ese para hacer la niebla de guerra y los replays de las jugadas xD

FreeYourMind

Tienes q montarte un scroll por procesos

Arcontus

Yo también necesito un zoom en el scrool, y la unica solución que encuentro al asunto es hacerlo uno mismo, usando tiles y variables resollution, pero si, es un coñazo tremendo.

Saludos!
5Leaps, el primer juego comercial desarrollado para BennuGD. http://www.5leaps.com

Trecek

Lo unico que se me ocurre a mi es poner el grafico de scroll como un proceso, tal y como ha dicho free.

Esto te daria libertad para controlar su tamaño, tendrias que programar tu mismo el movimiento del "falso scroll", pero en cambio modificar el area de pantalla que ves (zoom in-out) seria relativamente sencillo, por ejemplo una variable global que indique al scroll, personaje, enemigos, plataformas, etc su size, en base a la velocidad del personaje del jugador.

Lo siento, pero no se me ocurre nada mas "elegante" (de todas formas soy muy chapucero programando, ya lo ireis viendo si al final consigo hacer algo que pueda mostrar)

KeoH

voy a intentar hacer algo con tiles a ver q churro me sale xDD

KeoH

bueno .. estoy pensando en como montar esto .. y me surgen algunas preguntas ... por ejemplo .. con define_region() .. es posible definir una region que este parcialmente fuera de la pantalla?? por ejemplo .. si yo tengo mi juego corriendo a 800x600 .. puedo definir una region cuya esquina superior izquierda este en (-100,-100), y su esquina inferior derecha esté en (900,700) ??


Trecek

segun lo que acabo de mirar en el manual de osk, define_region no admite numeros negativos, en cuanto a numeros positivos pero fuera de pantalla.. ni idea, en principio no dice que no se pueda.

pagina 246
QuoteFíjate dónde lo hemos puesto, no es casualidad, define_region() no admite números negativos, por eso lo hemos puesto antes, así nos aseguramos que siempre energia_jugador sea positivo.

mas adelante tienes la descripcion de define_region (pag 363) y no pone nada de ese caso concreto.

Trecek

de todas formas... me pica la curiosidad... para que quieres una region mas grande que la pantalla? a fin de cuentas no se va a ver

KeoH

nose .. toy pensando como montar un scroll de tiles, y para q no consuma mucha memoria se me ocurrió congelar o destruir a los tiles que no solo estan fuera de la pantalla, sino un poco mas allá, pero no mucho mas .. no se solo toy pensando como hacerlo xD

FreeYourMind

Que es muy facil, necesitas repetir la misma imagen 2 veces por scroll, la imagen (tile) tiene el tamaño de pantalla en la horizontal, no necesitas destruir nada, porque se vera siempre parte de una de las 2 imagenes.

Drumpi

Como técnica, sólo se me ocurre lo dicho: tiles o trozos grandes del mapa con size... o esperar a que se implemente el scroll dibujado sobre un map ^^U

De todas formas, es una mejora que tengo pendiente para mi motorcillo. Sí, el del Echo, está disponible con ejemplos y todo, por si lo quereis mirar. Su sistema es un poco complejo de explicar, porque tiene muchísimas optimizaciones, pero la idea es tener un proceso por tile visible no nulo, y evitar en todo lo posible la eliminación/creacion de procesos, ya que consume bastante tiempo de CPU.

También se podría usar un scroll cíclico con un mapa del tamaño de la pantalla, y una técnica de repintado similar a la que uso en el Thunder Blade (sí, también está en la pila de proyectos). Como sólo repinta la fila/columna nueva, no creo que consuma tanto como el repintado completo (que eso sí que era la muerte de la GP2X), pero no estoy tan seguro de que sea mejor que el método actual a base de procesos.
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)

KeoH

Drumpi .. he he estado echando un vistazo a la forma en la que montas los escenarios en el echo xDD pero es un caos xDD y menos mal q tienes comentadas muchas lineas!! xD no se .. a ver q hago .. porq he probado en hacer un tileao chustero ... pero el problema se agrava .. porque al aumentar el size de cada tiel, también tengo q cambiar su posición x e y en el scroll .. para q de verdad de la sensación de que es un zoom y no q están creciendo los tiles xD .. jodido la verdad xD .. me temo q me voy a tener q poner a programar mas seriamente .. porq me he dado cuenta q programo muy chustero xD.

La momia que fuma

Una opción bruta/chapucera es usando get_screen para capturar la pantalla a cada frame, y ponerlo en un gráfico por encima de todo lo demas con size ajustado (Obviamente, esto solo vale para zoom-in y no para zoom-out)

Cosas a tener en cuenta: Consume bastantes recursos, hay que ocultar el gráfico del zoom antes de cada nuevo get_screen (Para que no este capturandose la misma imagen continuamente) y hay que descargar el grafico de memoria a cada frame, para no petar la ram a base de capturas de pantalla.

SplinterGU

Quote from: La momia que fuma on July 21, 2011, 01:50:15 PM
Una opción bruta/chapucera es usando get_screen para capturar la pantalla a cada frame, y ponerlo en un gráfico por encima de todo lo demas con size ajustado (Obviamente, esto solo vale para zoom-in y no para zoom-out)

Cosas a tener en cuenta: Consume bastantes recursos, hay que ocultar el gráfico del zoom antes de cada nuevo get_screen (Para que no este capturandose la misma imagen continuamente) y hay que descargar el grafico de memoria a cada frame, para no petar la ram a base de capturas de pantalla.

eso ya no sirve, get_screen da el ultimo frame dibujado... (antes que digan cualquier cosa, se que es una mierda)
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

JaViS

Quote from: SplinterGU on July 21, 2011, 03:22:16 PM
Quote from: La momia que fuma on July 21, 2011, 01:50:15 PM
Una opción bruta/chapucera es usando get_screen para capturar la pantalla a cada frame, y ponerlo en un gráfico por encima de todo lo demas con size ajustado (Obviamente, esto solo vale para zoom-in y no para zoom-out)

Cosas a tener en cuenta: Consume bastantes recursos, hay que ocultar el gráfico del zoom antes de cada nuevo get_screen (Para que no este capturandose la misma imagen continuamente) y hay que descargar el grafico de memoria a cada frame, para no petar la ram a base de capturas de pantalla.

eso ya no sirve, get_screen da el ultimo frame dibujado... (antes que digan cualquier cosa, se que es una mierda)
no me parece una mala tecnica, y no me parece tan terrible, claro, si el juego es para PC.


es la forma mas facil y mas directa, poner un proceso llamado ZOOM con priority bien baja para asegurarse que se va a ejecutar al ultimo de todos los frames, capturar todo lo que hay en pantalla, y hacer zoom en base a eso.

con eso no hace falta añadir mucha mas logica a los procesos ni andar jodiendo con los sizes
Working on Anarkade. A couch multiplayer 2D shooter.