¡Hola! Soy Andrés Matías González Ros, también conocido como "MaKu".
Llevo toda la vida jugando videojuegos (a los 3 años recibí mi primera
Nintendo DS). Siempre estuve un poco perdido porque no sabía qué quería
hacer para el futuro, hasta que, en 3º de la ESO, nos enseñaron a
programar cosas básicas en C++ y me gustó tanto que desde ese momento
quería convertirme en programador. Si quería ser programador y me gustan
los videojuegos, ¿por qué no combinar las dos cosas?
Yo preparado para ir a ESNE el día del traje.
Mi experiencia en el mundo de los videojuegos hasta ahora
ha sido muy variada. He vivido muchas experiencias (trabajos en
equipo, conflictos internos, falta de organización, estrés, ...) No me
he limitado a aprender programación, ya que en la universidad en la que
estudio nos enseñan todo el proceso de creación de videojuegos y todas
las herramientas que nos podrán servir para el futuro, como a crear
guiones y escenificarlos, dibujar y editar imágenes en Adobe Photoshop, diseñar logotipos en Adobe
Illustrator, entre otras cosas.
En cuanto a experiencia de mi sector y mi conexión con el mundo real,
lamentablemente no he asistido a ninguna Game Jam todavía ya que me he
estado centrando en mis estudios. Soy buen programador de C++ y C# y los
motores que he aprendido a usar estos años han sido Construct 3, Unity y
Unreal Engine 5, el cual estoy en proceso de aprendizaje y programamos
con BluePrints. También soy capaz de crear el GDD (Game Design
Document), el Ten Pager, el Concept, el Pitch, el Proposal y hacer tanto
la página de itch.io del juego como encuestas de satisfacción durante el
beta testing, y responder adecuadamente ante semejante feedback. Por
último, me gusta diseñar logotipos y editar imágenes en Adobe Photoshop
y Adobe Illustrator. A continuación os muestro unos ejemplos de los
logos que he hecho yo.
Mi marca personal.
Para un juego que he desarrollado en equipo (disponible en
itch.io).
Para el juego anual del segundo curso (disponible en itch.io).
Empresa ficticia con mi grupo de trabajo del tercer curso (Lost
Paradox).
Mi otro personaje original.Mi versión del logo de Batman vs Superman.
Un logo para un equipo de Esports en el que participé.
Proyectos en los que he participado
Joaquín
Joaquín es el primer juego que hice. Lo hice con unos compañeros de
clase en Construct 3 y fue con el que nos enseñaron a hacer el GDD y el
Ten Pager, además de aprender a trabajar en equipo y distribuirnos las
tareas equitativamente. No tengo muy buenos recuerdos de este juego, ya
que no congeniábamos muy bien algunos miembros del equipo entre
nosotros, por no mencionar que hay algunos que no cumplieron sus
responsabilidades hasta el día previo a la entrega final.
Como mencioné antes, yo hice la función de programador, así que a continuación pondré varias capturas de pantalla de trozos de código que escribí yo:
En este fragmento de código, aumenta en 1 el contador de plumas cada vez que colecciona una y, si llega a la meta, transporta al jugador al siguiente nivel. (Reinicia la escena porque, si no, en el siguiente nivel el jugador aparece en un punto más avanzado de lo normal).Si el jugador le lanza una bola de fuego o le salta encima a un enemigo, recoge todos los enemigos de la escena y elige el que ha sido dañado por el jugador y le resta 1 de vida. Si tiene 0 de vida o menos, se destruye.Si el enemigo colisiona con el jugador, le hace daño. Cuando la flecha del enemigo sale de la pantalla, desaparece. Si están en pantalla, los enemigos que se mueven con el modificador de plataforma se activan. Función de knockback cuando el personaje se hace daño con un enemigo.Gestiona las interacciones con el jefe. Cuando te acercas por primera vez, aparece su barra de vida y su nombre, empiezan a aparecer chiles que te puedes comer para lanzar bolas de fuego, él te lanza bolas que tienes que esquivar y tú puedes o lanzarle bolas de fuego si has comido chile o saltar en su cabeza. Cuando se muere, te lleva a los créditos.
Theo y la Puerta de las Sombras
Con este proyecto aprendimos a realizar el concept (un documento en el que escribimos más o menos la idea general que tenemos del juego), el pitch (una presentación del concept con más ideas), el proposal (un documento ya más específico con fecha de salida, competencia del mercado, modelo de negocio,...) El trabajo en equipo fue mejor, pero no el más óptimo, ya que había poca comunicación del equipo (cada uno hace su parte y luego lo juntamos todo). Hay pocas cosas que destacar del código, ya que me repartí el trabajo con otros compañeros y lo poco que programé tampoco es que sea nada del otro mundo. Pero igualmente, voy a compartir mi código:
Revisa si está tocando la pared. Si la está tocando pero no pulsa el botón de salto, se desliza por la pared. Si se está deslizando por la pared o simplemente está tocando la pared y pulsa la tecla W (para saltar), salta de la pared.Se gira al hacer el salto.Si pulsa la tecla para ir hacia la izquierda, va hacia la izquierda orientado en esa dirección y ejecuta la animación de movimiento. Si pulsa la tecla para moverse hacia la derecha, pasa lo mismo pero mirando hacia la derecha, si no se mueve hace su animación estática. Si le da a la W, salta. Si está mirando hacia la derecha y pulsa la tecla de ir hacia la izquierda, se gira y viceversa.IsGrounded revisa si está en el suelo o no. Jump ejecuta la animación de salto, le quita todas las fuerzas anteriores y le añade una fuerza de impulso hacia arriba. ClearForces elimina todas las fuerzas que está recibiendo el RigidBody en ese momento. Flip gira 180° el objeto si no está atacando en ese preciso instante. Si pulsa la tecla S y no está tocando el suelo, empieza a hacer un salto bomba.
GroundPoundAttack simplemente sirve para empezar las otras dos funciones a la vez, para hacer el código más legible. StopMidAir sirve para que el personaje se quede un rato parado en el aire, ya que se desactiva la gravedad. DropAndSmash sirve para esperar el tiempo deseado que se quede en el aire y añadirle una fuerza de impulso hacia abajo. CompleteGroundPound es para que le vuelva a afectar la gravedad. ClearForces sirve para limpiar todas las fuerzas que le afectan en ese momento al rigidbody.
Esto fue una idea descartada porque no pude acabarlo a tiempo. La idea era que hubiesen zonas en las que la cámara se congelase en un punto fijo cuando el jugador entrase en contacto con un trigger invisible y empezasen a spawnear enemigos de ambos lados de la pantalla y que no se pudiese mover hasta que no matase a todos los que aparecían, y una vez ha matado a todos, volvía a seguir al jugador como de costumbre, pero la cámara se seguía bloqueando cada vez que el jugador entraba en contacto con el trigger.Spawner de enemigos. Cada vez que se instancia, tiene que esperar 5 segundos para poder instanciar otro. En el momento en el que se han instanciado 10 furbies, deja de hacerlo.Este es otro código descartado, que iba ligado con el de la cámara. Cuando entraba en contacto con el trigger que bloqueaba la cámara, aparecían paredes en los bordes de la cámara para que el jugador no pudiese salirse. Cuando derrotaba a los 10 enemigos, se destruían las paredes.
Alien Parapocalypse
Este juego es en el que más horas he invertido, la verdad. Es un juego arcade interminable en el que tienes que matar al mayor número de alienígenas posible (sin límite de tiempo, sólo estás limitado por la vida del personaje). Aquí sí que voy a meterme mucho en código:
Un IEnumerator en el que recibe la longitud de la animación de ataque, activa la hitbox de ataque y al acabar la animación la desactiva.Revisa todos los enemigos en escena, ya sean enemigos de tipo 1 (que se mueven por el suelo) o de tipo 2 (aéreos que se mueven a puntos aleatorios del cielo). Si le pega con el ataque de tierra, ese enemigo en específico empieza la animación de muerte.La bala del enemigo 2 se vuelve estática (deja de afectarle la gravedad), si colisiona con el jugador le resta vida, empieza la animación de explosión y le pasa la duración al IEnumerator, el cual espera a que se deje de reproducir la animación para destruir la bala.Si la bala se destruye, se queda en el sitio. Tuve que poner esto porque al colisionar con una bala del jugador, salía disparada hacia arriba mientras ejecutaba la animación, cosa que no tendría que pasar.Si se sale de la pantalla, se destruye sin más. Si toca al jugador una vez, le resta una vida al jugador y empieza la animación de daño del jugador y la de explosión de la bala. La bala al explotar empieza la animación y no desaparece hasta que no ha dejado de ejecutarse la animación de destrucción de la bala.
Super Fruit Slasher
Alien Parapocalypse y Super Fruit Slasher son dos juegos con aproximadamente 2 semanas de desarrollo, y por eso son tan pequeños. En Super Fruit Slasher tienes que cortar un trozo de fruta presente en medio de la pantalla, y el que más rápido lo corte gana un punto, hasta llegar a 10. Hay veces que lo que aparece no es una fruta y no hay que intentar cortarlo, porque si lo haces, serás penalizado, siendo restado un punto a tu puntuación total. Solo debes esperar a que desaparezca.
En esta imagen se pueden apreciar los controles del jugador 1. Si le da a la tecla A y la fruta todavía no está cortada, cambia su estado de idle a ataque, espera los segundos especificados de la animación y regresa a su posición original. Para el jugador 2 lo único que cambia es que la tecla pulsada es la L, no la A.En el array de imágenes, los objetos que no son fruta están del 0 al 5, entonces todo lo que sea más de 5 es fruta. Si la fruta ha sido cortada por cualquiera de los dos jugadores (o simplemente lo que hay ahí no es una fruta), espera los segundos de la animación, asigna los booleanos de las espadas a falso para que puedan volverse a mover y se autodestruye para que el GameController pueda volver a instanciar otra fruta.Este es el FixedUpdate del GameController. Aquí, si no hay ninguna fruta instanciada, lo hace y cambia el booleano a verdadero para no instanciar varias veces frutas distintas. Actualiza los textos de puntuación de los jugadores, y revisa si alguno de los dos jugadores ha ganado cada vez que se corta una fruta.Si alguna de las puntuaciones de los jugadores es 10, se detiene el tiempo, se activa el texto de "Ha ganado el jugador 1!" (o el 2, o es un empate) en el respectivo color (azul para jugador 1, rojo para jugador 2, gris para empate) y se reproduce un sonido.En este código, la mitad que cae revisa si ha colisionado con el jugador 1 o con el jugador 2 y le suma puntuación a quien lo haya hecho. Se activa el trigger para la animación y se reproduce un sonido. Si no es una fruta, dependiendo del jugador que le da, reduce en 1 la puntuación de ese jugador y reduce la velocidad de animación a la que se reproduce la vuelta.
Memory Madness
Un juego de memoria que hice en solitario para una asignatura, haciendo tanto el diseño de las cartas en Adobe Illustrator así como la programación en Unity.
Se crea un array de cartas de filas*columnas y se instancian automáticamnete en su lugar correspondiente.
El primer if sirve para guardar x números aleatorios en un array para agarrar de ahí parejas. Si no está ya en el array, lo añade. Si está en el array, busca otro número hasta que haya uno que no esté presente.
Luego, se elige un número aleatorio de ese array y se instancian por parejas. Mientras que no hayan 2 parejas instanciadas de esa pareja y que todas las parejas no hayan sido instanciadas 2 veces, sigue el bucle instanciando carta por carta hasta que estén todas. En el momento en el que todas están presentes, puede comenzar el juego.
Si hace click en la carta, el tiempo no está pausado y hay menos de 2 cartas volteadas, empieza la animación de volteo de la carta. Si no hay ninguna carta volteada, se mete en la variable card1. Si hay una carta volteada y no hay una segunda carta volteada, se mete en card2. En el IEnumerator, se espera a que se dé la vuelta por completo para resetear el trigger y asignarle el booleano de que está dada la vuelta a verdadero.
Si dos cartas están dadas la vuelta, revisa si un contador auxiliar es menor o igual a 0. Si se cumple esta condición, aumenta el número de movimientos y aumenta en uno el contador para ponerlo en 1 y que no vuelva a contar otro punto. Recibe los animadores de las cartas que están dadas la vuelta y la duración de la animación que están reproduciendo en ese instante. Si las cartas son iguales, aumenta la puntuación, el número de cartas dadas la vuelta se vuelve 0 y las cartas almacenadas se vuelven nulas.
Si ha conseguido 8 puntos (hay 16 cartas en total, eso es fijo), significa que ha ganado. Si ha ganado, el botón de reseteo se desactiva. De las animaciones que recibió antes, si la animación de la carta 1 tarda más que la de la carta 2, se usa ese tiempo. Si no, se usa el otro. El booleano de que hay un proceso inacabado se vuelve verdadero.
Si las dos cartas no son iguales y se ha acabado la animación de darse la vuelta, empieza otra corutina para darles la vuelta otra vez y ponerlas boca abajo.
Este código sirve para poner las cartas boca abajo si no son iguales mediante una animación.
Meireki no Hikeshi
El juego anual que mencioné en la sección anterior. Va sobre un bombero en Japón del siglo 16, yendo de casa en casa apagando incendios. Las mecánicas son muy simples: moverse, saltar, rescatar personas, subir escaleras, recoger agua, soltar agua, variar la velocidad de movimiento y el impulso de salto dependiendo del nivel de agua que tengas actualmente.
Menú principal para cargar el nivel, volver y salir.
Menú de pausa. Empieza con ambos canvas desactivados. Si el número de NPCs rescatados es igual al número total de NPCs, carga directamente la escena de "Nivel Completado". Si pulsa la tecla Escape, activa el canvas de pausa. El canvas de pausa contiene un texto diciendo "Pausa", y tres botones con "Continuar", "Menú Principal" y "Salir".
Si pulsa el botón de reanudar, se reanuda el juego. Si pulsa o el botón de Menú Principal o el de Salir, aparece el canvas de "Estás seguro?" con opciones "Sí" y "No".
Carga la escena. Si el jugador ha pulsado el botón "Main Menu", le lleva al menú principal. Si por el contrario le da al de "Salir", se cierra la aplicación.
Si la velocidad en el eje y es negativa, significa que se está cayendo, entonces reproduce la animación de caída. Si no está tirando agua, se puede mover, saltar y escalar.
Si se acaba la animación y el tanque de agua no es igual a cero, resta un nivel al tanque de agua, resetea el trigger y los booleanos respectivos. La función Water() convierte el booleano a verdadero.
La función de escalar tira un rayo hacia arriba y si detecta una escalera y el jugador pulsa la tecla "W", empieza a escalar. Sólo puede escalar si el nivel de agua no está en 4. Se anula la gravedad para que pueda escalar.
Recarga el agua. Si la capacidad del tanque es menor de 3 y lo que está tocando el jugador es agua, empieza el temporizador. Si el temporizador es mayor o igual que el tiempo que tiene que pasar, aumenta en 1 el nivel de agua. Si pulsa la tecla para lanzar agua, la lanza.
Switch para cambiar la velocidad de movimiento, el impulso del salto y la velocidad de las animaciones. ReFuel para recargar agua.
Si el agua cae en el fuego, el fuego se apaga.
Si el jugador colisiona con el NPC, cambia la animación a "Salvado".
Menú principal para cargar el nivel, volver y salir.
Si el agua toca el fuego, este se vuelve invisible. Al volverse invisible, empieza un temporizador. Al acabar el temporizador, vuelve a ser visible.
En el hub, si está en frente de la puerta de una casa (la entrada a un nivel), le aparece un sprite de la tecla "W". Si la pulsa entonces, entra en el nivel.
Cambia el texto que aparece en la escena de "Nivel Completado" y aumenta en uno el número de niveles totales completados (solo suma uno la primera vez que completas un nivel).
Si los niveles completados son 3, añade un texto diciendo que el nivel final ya está disponible.
Tiene el mismo código que la puerta, con la diferencia de que a este sólo se puede acceder cuando has completado ya los 3 niveles anteriores.
Es una mecánica desechada. Si tienes nivel 4 de agua y te pones sobre esta plataforma, se rompe.
The Nerfir Protocol
Proyecto en desarrollo por mi equipo de trabajo Lost Paradox, un equipo de 6 personas, los mismos con los que he hecho Alien Parapocalypse, Super Fruit Slasher y Theo y la Puerta de las Sombras. Es un proyecto que estamos haciendo al completo: estudio de mercado previo hasta para el naming, lista de tareas inicial para saber quién hace qué, la creación de una IP única con lore que iremos expandiendo a través de productos transmedia (novelas, juegos de mesa, series y películas, merchandising, ...). El proyecto se está llevando a cabo en Unreal Engine 5.
Mis hobbies
Pen Spinning
Pen Spinning es una disciplina en la que, con un bolígrafo modificado para que sea más largo, más pesado y tenga el peso más repartido, giras el bolígrafo alrededor de tus dedos. Llevo 4 años practicando, y aquí está uno de mis vídeos:
Gym
Llevo 1 año entrenando desde casa (tengo una barra, dos mancuernas y suficientes discos como para poder cargar 47kg al mismo tiempo), 1 año en el Holiday Gym al lado de UDIT, y actualmente estoy yendo al Basic-Fit con mi novia. No busco nada específico, sólo ser más saludable y estar más fuerte.
Jugar Videojuegos
Últimamente lo estoy dejando mucho de lado, pero de vez en cuando me gusta viciarme a un juego en específico y jugarlo hasta completarlo al 100% o jugar hasta cansarme. Juego mayormente juegos del género plataforma, de carreras, de deporte, de peleas, cualquier juego competitivo que no sea shooter. A veces, también hago streams en Twitch, link aquí.