Proyecto realizado por Antonio Ruiz Gijón, de Ingeniería Multimedia en la Universidad de Valencia, para la asignatura de Animación.
Se trata de un juego de plataformas donde el escenario a recorrer es infinito, ya que se generan los bloques de forma aleatoria y continua.
Está programado en HTML5 y javascript, utilizando la biblioteca three.js.
El objetivo del personaje es recoger la mayor cantidad posible de monedas en su recorrido, lo que provocará que la velocidad aumente y sea más complejo superar los nuevos bloques ya que deberá evitar caer en la lava o ser golpeado por obstáculos móviles.
La interfaz está distribuida de la siguiente forma:
El funcionamiento es sencillo.
Al empezar una nueva partida se mostrará el escenario de juego y el personaje. Para esquivar los obstáculos, no caer a la lava y coger monedas se debe saltar utilizando la barra espaciadora
.
Si se consiguen obtener más de 20 monedas se puede acceder al ránking de la aplicación.
Se han implementado las siguientes funcionalidades:
(La spline es calculada por la propia biblioteca three.js)
(el modelo es original de QuakeII, el personaje tekk-blade)
, que posteriormente se ha convertido gracias a un addon que se facilita
en la biblioteca three.js: Three.js Blender Import/Export
letra V
o poder pausar el juego letra P
Para utilizar esta aplicación, y en general WebGL, se necesita alguno de los navegadores de la siguiente tabla que sea compatible:
Además, también es necesario un ordenador con una GPU ya que son gráficos 3D acelerados por hardware.
En el caso de no cumplir con los requisitos técnicos para hacer funcionar el juego, aquí se muestra un vídeo de demostración
¡¡Vídeo temporal!!
Todo el código está comentado a un nivel de detalle muy alto, La tecnología utilizada:
Gracias a toda la información que he recapitulado durante la investigación sobre este tipo de juegos, he creado el juego de modo en que el personaje nunca altera su posición en el eje X, sino que lo que se desplaza es todo el espacio hacia la izquierda. De este modo se evita que el float pierda precisión cuando alguien llevara muchísimo tiempo jugando y la posición del personaje alcanzara un número superior al que acepta un float.
Para garantizar que tampoco se pierda precisión en los bloques pero en negativo y para garantizar una mejor optimización, cuando un bloque ya no aparece en pantalla se elimina (esto ocurre exactamente con las monedas).
En cuanto a la bola de lava que realiza una trayectoria sinusoidal, cuando ésta alcanza una posición no visible por la izquierda se vuelve a posicionar por delante del personaje en una posición aleatoria entre unos márgenes.
También, se ha utilizado la variable "delta" (tiempo entre la última entrada en el bucle de pintado y la actual) para garantizar el correcto funcionamiento en ordenadores con más o menos frames per second (por ejemplo: que no salte más alto en un ordenador con 60FPS que en uno que sólo alcance 15FPS).
Los bloques se generan mediante splines que pasan por una serie de puntos aleatorios. Para crear la mesh del bloque se añaden los vertices y las faces puestos todos en el orden correspondiente. (Falta ampliar con datos, imágenes y código)
Para el salto del personaje se han utilizado unas variables con la fuerza con la que salta y la gravedad. Tras comprobar con el rayo el estado actual del personaje, realiza la acción correspondiente.
La altura que alcanza con cada salto es diferente en función al tiempo que se mantenga la barra espaciadora
. (Falta ampliar con información sólida y datos)
El efecto de la luz que genera la lava incandescente se ha hecho posicionando 4 luces puntuales que emiten luz roja por debajo del plano que tiene la textura de la lava. Y moviéndolas se consigue el efecto deseado. (falta ampliar con código y fórmulas)
La bola de lava se desplaza con una trayectoria sinuosidad. (Falta ampliar con fórmulas y datos)
Valoración sobre la asignatura [en readacción]
Una cosa que siempre intento en los proyecto finales de asignatura es ser capaz de aplicar los conocimientos que he aprendido de otras asignaturas en el propio proyecto.
En este, he sido capaz de crear los bloques del terreno aleatorio gracias a la asignatura de Informática Gráfica y Gráficos Avanzados y Sonido
. Sobre cómo situar las caras y su dirección, orden de los vértices, etc. El conocimiento de shaders me dio la posibilidad de crear la lava con el efecto típico de un fluido, pero finalmente se desechó porque era demasiado costoso para los resultados. Esta asignatura también me ha ayudado a saber cómo colocar las luces, las diferencias entre una luz puntual o direccional, y la cámara.
Por otra parte, siendo un videojuego donde la misión es conseguir el mayor número de monedas, pensé que una buena opción era integrar un ránking donde se contemplaran estos resultados. Así que la asignatura de Programación Hipermedia
(aunque utilizo PHP en vez de JSP), y la asignatura de Bases de Datos
, me han hecho ser capaz de implementar este sistema.
Por último, en la asignatura de Comunicación Interactiva
se nos hizo mantener un blog durante toda la duración del cuatrimestre y esta memoria está redactada como un hipertexto con sus relaciones entre contenido mediante links.
Desde el primer momento que se propuso hacer proyecto me pareció la mejor idea. Además de ser algo que puedes enseñar al resto de gente para que vean qué eres capaz de hacer, es una forma de aprendizaje diferente a limitarse a estudiar unos apuntes y luego mostrar todo lo que has sido capaz de aprender sobre un papel.
Con este proyecto he aprendido lo que se pretendía de la asignatura y también aprender la utilización de una biblioteca en constante desarrollo como es three.js.
Personalmente, he visto muchos de los proyectos de otros compañeros y matemáticamente me parece que el mío no tiene tanta complejidad, pero un proyecto de este calibre, en mi opinión, merecía tener todo tipo de detalles que hicieran un proyecto completo.
Desde el primer momento se me avisó que era demasiado ambicioso y sólo se debería hacer si poseía experiencia con la biblioteca, pero quizás fue eso lo que me motivó más a seguir adelante y crearlo. El problema de esta elección ha sido que en vez de las 30 horas propuestas para realizar el proyecto, debo haber invertido 5 veces más de tiempo, aunque para mí han merecido la pena.
Ahora mismo, tengo un proyecto que, aunque no es un "juegazo", puede llegar a ser entretenido. Y por cómo está implementado es escalable a otros modos de juego para hacerlo todavía más entretenido.
He conseguido algo que me hace estar muy satisfecho, y es un proyecto completo. Que no está limitado a las exigencias de la animación (parte a la que me hubiera gustado ampliar mucho más) sino con la integración de los conocimientos de otras asignaturas.
Ahora tengo algo más que añadir al portafolio y poder enseñar mis conocimientos. Además de haber aprendido cómo funcionan este tipo de juegos, que inicialmente pensaba que se implementaban de otra forma muy distinta, y a saber proponerme objetivos complejos y investigar hasta alcanzarlos.
Considero, por tanto, que ha sido una buena forma de aprender cómo animar objetos en un entorno 3D y demostrar así los conocimientos aprendidos en la asignatura.