miércoles, 10 de diciembre de 2014

Mecánica de caída al vacío

Cuando quise que Temet Nosce tuviera partes de plataformas también había que definir cómo iban a funcionar. Aquí es donde surgió una de las mecánicas medianamente novedosas del juego, aunque no inventé nada nuevo del todo.

Caída en Temet Nosce


La primera elección es si las plataformas son tipo montañas que ir escalando, pero siempre caes en algo, si es desde mucha altura con salto; o del tipo abismo, donde caes al vacío. Normalmente en los juegos de este tipo al caer al vacío mueres, y tienes que volver a comenzar la pantalla o desde el último checkpoint.

Eso no me convencía porque en este juego me parecía importante sentir el agobio, esa lucha contrarreloj contra el veneno, y volver a empezar una y otra vez desde el principio te sacaba de la ambientación, además de romper la continuidad. Se puede hacer que vuelvas a aparecer en el punto desde el que has fallado el salto, pero para penalizar el fallo, y que el que falla no esté en las mismas condiciones que el que hace el salto bien deberíamos perder algo de vida. Pero ¿reaparecer parpadeando y perdiendo algo de vida? La excusa me parece pobre.

Aquí nace mi pequeña aportación, hacer que una vez que has caído al vacío reaparezcas en el cielo y te estrelles contra el suelo al borde de donde te has caído. No conozco ningún juego que haya aplicado este sistema a las plataformas, pero es muy viejo, ya en el asteroids o en el comecocos si algo sale por la izquierda de la pantalla aparece por la derecha. Esto es lo mismo, si caes por abajo, apareces por arriba. Es muy parecido a reaparecer parpadeando con menos vida, pero aquí hay algo de continuidad y la hostia que te das contra el suelo es la explicación de que te baje la vida.

Es un concepto sencillo, otra cosa es implementarlo. El demonio está en los detalles. Lo primero es detectar si estamos en el suelo o cayendo. De hecho saber si caes no es tan trivial como parece. Puedes poner una distancia mínima, por ejemplo a -60 en altura considera que te has caído al vacío y haces el respawn. Pero no quería comprometer el diseño de escenarios, no sabía si iba a hacer escenarios que bajasen o subieran mucho. Si bajan mucho podría llegar a ese -60, si sube mucho puede pasar que la caída sea mucho más larga que desde otros sitios y no queda bien si representas un salto de tipo abismo. Así que tenía que hacer que no fuera la altura en bruto del personaje lo que hiciera saltar las alarmas de caída en el abismo, sino relativa respecto al suelo.

Para eso hay que saber la altura por la que vamos andando en cada momento. Lo primero que hice fue un sistema de raycasting, que lanzaba un rayo desde el personaje hacia abajo y comprobaba colisión contra el suelo y me daba la altura del rayo, si no colisionaba contra el suelo o la distancia era muy grande consideraba que estaba en el aire, saltando, cayendo, lo que fuera, pero si estaba en el suelo, tomaba la altura del personaje como referencia. En mejoras posteriores vi que hay una forma de tener un evento que directamente salta si estamos pisando el suelo, por lo que solo tenía que almacenar la altura en estos casos.

Al igual que almaceno la altura, podría almacenar la posición recorrida y mandar caer sobre la última con suelo conocido, pero en ese caso quedaba justo al borde, pero justo justo justo, de tal forma que el jugador podría volver a caer con equivocarse un poco de tecla, una caída injusta. Incluso podría quedar el personaje sin tocar nada con un pie fuera o algo así, feo. Una opción era ir buscando tierra con rayos hacia el suelo desde la posición del personaje hacia la cámara. Suponiendo que la cámara siempre estuviera detrás, pensaba que encontraría tierra siempre. Pero me pasó lanzarme al vacío de una forma rara, encontrar un ángulo extraño y que el programa entrase en bucle infinito al no encontrar nunca tierra. Un bug demasiado grave, que el juego se pueda congelar como para poder dejarlo.

Había una versión más disimulada, que era mover un poco el personaje tierra adentro, para que no caiga en el borde. Pero en el caso de plataformas pequeñas, ese echar hacia atrás una distancia prudencial puede hacer que caiga sobre el abismo anterior. Y además siempre supongo la dirección “hacia atrás” como hacia la cámara, pero si el jugador por alguna razón está volviendo hacia atrás en el juego y se cae, quedaría bonificado, ya que el juego le volvería a colocar más cerca de su objetivo.

No conseguí un sistema automático para esto, programarlo y olvidarme, al final opté por una solución más apañada. Poner puntos de reinicio al principio y final de cada zona donde haya abismos, y si nos caemos, el jugador se golpeará contra el suelo en el punto de reinicio del trozo de tierra del que viniera. De esta forma no cae exactamente donde se la pegó, pero si al principio de la zona de plataformas donde cayó, lo que da a estar zonas un aspecto de “hay que pasarlas enteras sin caerse” interesante, pero no corta tanto la continuidad como volver a media pantalla y volver a matar enemigos que ya habías matado o tener que recorrer escenario ya recorrido y encima sin enemigos. 

No hay comentarios :

Publicar un comentario