Ha habido un montón de interés en como hacer un juego con las mecánicas de gravedad así que he decidido escribir este tutorial, mi primero, para enseñarte lo fácil que es.
Lo primero que debes saber es que este metido fue concebido por Yann Granjon. No fui idea mía, yo simplemente lo implemente. Eso si, me ayudo mucho durante el proceso y no hubiese sido lo mismo sin el.
Lo básico
##
La cosa mas importante para este proyecto es la habilidad de las plataformas de cambiar el angulo de gravedad. Una vez esto funciona, lo siguiente que nos debe importar es... como sabrá el juego que gravedad aplicar a cada angulo?
Asi que Yann sugirio y yo implemente: Zonas de Gravedad.
(perdonad por las imágenes borrosas)
Aqui podemos ver un nivel como ejemplo. Lo que nos interesa es las zonas coloreadas que rodean las plataforma.
Estas zonas coloreadas son en realidad instancias del mismo objecto "GravZone (Area de Gravedad)". Hay 5 formas diferentes para usarlas según el tipo de terreno.
Pero principalmente, hay dos atributos que tienes que incluir. "Relativo" y "NoRelativo" que son del tipo "Boolean".
El código
El código es muy simple:
Básicamente, hay un angulo para cada "GravZone". Este angulo esta determinado si la variable "GravZone" es "Relativa".
Generalmente, las "GravZones" que son "Relativas" son las redondeadas y las que son planas son las "NoRelativas". La diferencia es que las "GravZones" relativas atraen a un único punto, mejores para las superficies redondas, mientas que las que no son relativas sirven mejor para las rectas.
Bueno, volvamos al código. Todo lo que hace, es, por cada "GravZone" con el que el jugador choca, el juego determina el angulo correcto (gravzone.a para las "NoRelativas" y angle(player.x,player.y,gravzone.x,gravzone.y) para las "Relativas". y cambia los ángulos en vectores, añadiendo vectores nuevos sobre los viejos señalando la dirección que apuntan las "GravZones" con las que choca nuestro personaje.
Así puedes chocar con dos o mas "GravZones" e ir al angulo correcto al que apuntas.
Cambiando 180º
Si quisiéramos cambiar de mecánica e implementar un cambio de gravedad dentro de la otra "GravZone" nos encontraríamos con un pequeño problema, que la media de los ángulos se cancelan a si mismo y es personaje avanza hacia una posición extraña. Así que he creado un objeto invisible, llamado flip_assist (asistente de giro).
Esto cancela el método de gravedad de las "GravZones" cuando el jugar choca con el flip_assist.
Este código lo que hace es cambiar los ángulos de gravedad por unos determinados por lo que introducimos en el código del Flip-Assist. Y cuando sales el, nuestro jugador vuelve a su gravedad normal.
También tienes que saber que hay dos flip_assists por cada barra amarilla. Uno para ir al siguiente "planeta" y otro para volver al anterior. Esto necesita un "Boolean" llamado "cannot_reset_flip (no puedo cambiar el asistente)" para que funcione.
Y eso es básicamente todo lo que necesitas saber.
Ahora tenemos la mecánica básica. Mira otros ejemplos para entenderlo mejor.
Espero que lo hayas entendido y suerte con tu juego.