[CODE] scrollSuperCam, uno de esos códigos mágicos jeje..

Started by Erkosone, June 19, 2013, 02:04:28 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Erkosone

Hola Gente, esta vez os traigo uno de esos códigos que suelen aparecer cada cierto tiempo, se trata de algo que seguramente todos hemos querido programar alguna vez pero que seguramente pocos han conseguido, una cámara suave para un juego que use scroll.


El código no es mas que otra de las posibles aplicaciones de la integral de Verlet, se nota que me encantan los teoremas de este tío no? XD..


La cosa es bien simple, y por supuesto es compatible con cualquier juego que ya esté terminado, solo hay que copiar y pegar y listo, funcionará sin quejarse ;)


- Desde el programa en bennu se llama al proceso scrollSuperCam() y no hace falta nada mas..
- Funciona de la siguiente manera:


scrollSuperCam( int scrollNumber, int idToFollow, float elasticity );


PARAMETROS:
- scrollNumber: Indicar el número de scroll al cual se desea activar la superCam.
- idToFollow : Indicar el clásico IDPLAYER, osea.. se le dice el ID del proceso que lleva la cámara en el juego.
- elasticity: La elasticidad de la cámara.


Creo que os gustará jeje, os dejo un test mínimo con un scroll, usando las teclas de cursor podemos mover el proceso personaje, ajustando elasticity en la linea 28 podemos ajustar la dureza de la cámara del juego.


Ale! otro código de los que yo llamaba antiguamente 'mágico' hehe.. a disfrutarlo!

Erkosone

He actualizado el zip, tenía un pequeño error, ahora ya si, disponible ;)

JaViS

Working on Anarkade. A couch multiplayer 2D shooter.

Erkosone

Gracias, me alegro que te guste  ;D


Lo que estaba pensado es que no se si sería buena idea sugerir una cámara así ya nativa en el lenguaje, creo que podría darle un toque mucho mas atractivo a los juegos, y solo hace falta añadir a la estructura de scroll 2 variables para hacerlo funcionar.


En cualquier caso ando haciendo un juego de plataformas al cual le he colocado esto de la scrollSuperCam() y el resultado es excelente, lo ha grabado en vídeo para mostrar lo que se puede lograr en un juego real, en unos minutos cuelgo el link al vídeo, creo que se verá claramente el atractivo de esto.  :)




Erkosone

Así es como queda el tema usando esto, donde mas se nota es en las caidas y en los saltos, creo que se nota claramente lo que hace jejejej..
http://www.youtube.com/watch?v=-5QW3dibx2g&feature=youtu.be

SplinterGU

iba a poner que sin video esto no tiene valor.

juro que no me doy cuenta que hace... hoy estoy medio lerdo parece.

demas esta decir que el video que pusiste se ve genial, tiene un movimiento, excelente.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

JaViS

si te fijas la camara tiene una demora en seguir al personaje
Working on Anarkade. A couch multiplayer 2D shooter.

SplinterGU

pero eso me suena que tambien se puede hacer con el scroll actual...

estaria bueno, un video con el efecto exagerado, para que se note.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Erkosone

Vale Splinter prueba este ejemplo, con esto te va a quedar completamente claro lo que hace, está muy exagerado el efecto y tanto la cámara integral/proporcional de verlet como el proceso que hace que lleva la cámara en el juego tienen un cartel que los diferencia, con esto creo que podrás ver en 2 segundos el efecto ;)




Erkosone

Puedes hacer mas pruebas, como por ejemplo aumentar la distancia y la elasticidad, con esto se consigue el efecto que tenía div de las 2 regiones para el movimiento de la camara del scroll, osea, dejas que la superCam se quede a 300 pixel, que en realidad serán en este ejemplo 150 por el * 0.5 y aumentas la elasticidad, con eso tienes que el idToFollow puede alejarse de la cam real hasta 150 pixel y en ese momento la superCam comenzará a interpolar su posición respecto al idToFollow proporcionalmente a la distancia que se encuentra de el.


Esta es la base de cualquier librería de física, es el concepto basico de contraint donde puedes unir 2 cuerpos con una simple regla de distancia, y además esta función tiene la opción de tomar a una, a otra o a ningúna como estática, que es lo que realmente la hace polivalente y permite todas estas cosas ;)

JaViS

Me gusta mucho cuando se exagera mas el efecto, pero quizas deberias hacer algun tipo de comprobación para que el proceso de la camara nunca quede fuera de la region visible, es decir, cuando se va a un extremo, seguirlo a la velocidad que haga falta para que no desaparezca nunca
Working on Anarkade. A couch multiplayer 2D shooter.

Erkosone

Realmente no es necesario, se logra ajustando la elasticidad.


La idea de la superCam es que la distancia sea cero con el idToFollow, así siempre interpolará hasta la posición del proceso que lleva la cámara "con un ligero error por que las coordenadas de los procesos son del tipo INT y hace falta castear a float con buffers pero eso ralentiza innecesariamente", también es cierto que en ese ejemplo que he colgado ultimo no hay ningún tipo de control de colisión y el idToFollow se sale del escenario, pero en un juego normal esto no pasa jeje.

SplinterGU

Quote from: Erkosone on June 19, 2013, 04:26:31 PM
Puedes hacer mas pruebas, como por ejemplo aumentar la distancia y la elasticidad, con esto se consigue el efecto que tenía div de las 2 regiones para el movimiento de la camara del scroll, osea, dejas que la superCam se quede a 300 pixel, que en realidad serán en este ejemplo 150 por el * 0.5 y aumentas la elasticidad, con eso tienes que el idToFollow puede alejarse de la cam real hasta 150 pixel y en ese momento la superCam comenzará a interpolar su posición respecto al idToFollow proporcionalmente a la distancia que se encuentra de el.


Esta es la base de cualquier librería de física, es el concepto basico de contraint donde puedes unir 2 cuerpos con una simple regla de distancia, y además esta función tiene la opción de tomar a una, a otra o a ningúna como estática, que es lo que realmente la hace polivalente y permite todas estas cosas ;)

bennugd tambien tiene eso de las 2 regiones, por eso es que no entiendo que hace esto.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

lamento decir que eso ya se hace en bennugd, incluso se hacia en fenix.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Erkosone

Ya lo se Splinter, lo hace, pero sin interpolación, esto es proporcional, no ves como acelera en función de la distancia?


Lo que hace esto es un efecto muelle con la posibilidad de ajustar la fuerza del muelle.
En este articulo tienes una serie de ejemplos de aplicación de esto, sirve para exactamente estos ejemplos, solo que aquí está aplicada a la camara de un scroll.
http://codeflow.org/entries/2010/sep/01/hard-constraints-easy-solutions/