INTRODUCCIÓN
¡Hola! Qué calor, ¿eh?
La newsletter anterior probablemente la estaba redactando con una sudadera puesta y la bata de estar por casa, mientras que esta la estoy redactando con un pijama de verano y la ventana bien abierta para que corra el aire.
Así que no sé, disfruta de esta edición de ChumasNews que igual para la siguiente se ha derretido el planeta o algo.
RESUMEN MES

Este mes ha vuelto a ser bastante tranquilito en general, aunque hay cosas en proceso que aún no puedo comentar por aquí. Hay muchas ideas en el aire que todavía tienen que coger forma pero que algún día te enseñaré, lo prometo.
Algo de lo que sí te puedo hablar es de mi nuevo… ¿portfolio? ¿página web? no sé cómo llamarlo exactamente. Durante todo este tiempo, siempre que me he encontrado con el típico campo de “página web” en un formulario, he puesto mi página de itchio o mi linktree con mis redes ya que no tengo una web como tal.
Pero la solución a ese problema ha sido esta de aquí.
¿Qué te parece? A mí me gusta poder tener varias cosas ahí juntitas en un mismo sitio, y aunque seguramente cambie cosas en un futuro, estoy muy contento con el resultado final.
NOVEDADES

Si no has leído la edición de ChumasNews anterior te recomiendo encarecidamente que lo hagas, ya que esta sección es en realidad la continuación de una especie de devlog dividido en dos partes.
Bien, si has hecho los deberes y sabes de qué proyecto te hablo, seguro que recuerdas el proceso creativo detrás de él desde el primer boceto hasta la primera versión jugable. También expliqué cómo nació la idea del proyecto, las necesidades más importantes… sin embargo, detrás de un juego incluso tan simple como este, hay muchísimas cosas interesantes que me gustaría enseñar (¡y más ahora que ya está 100% terminado!).
¿CÓMO SE JUEGA?
Como expliqué, el juego se basa en un deporte llamado gaga ball en el que debes golpear una pelota dentro de un recinto para eliminar a tus rivales. Es muy parecido al balón prisionero pero no puedes agarrar la pelota y esta puede rebotar en las paredes del recinto, así que jugar con los rebotes es crucial.
Los controles son muy sencillos: Por un lado tienes un joystick que te permite moverte en cualquier dirección y por el otro tienes un botón que sirve para golpear la pelota. Así de simple.

Personaje siendo eliminado (y mandado a volar)
En cada partida hay 4 equipos formados por 3 integrantes y tu objetivo es conseguir la mayor puntuación posible para tu equipo golpeando la pelota y eliminando a los personajes rivales.
Mi misión principal con el juego era que se sintiera rápido, frenético, caótico, divertido... y a la vez, aunque el juego sea difícil, he querido que no se sienta injusto. Y para eso he tenido que hacer uso de algunas pequeñas trampas:
¿CÓMO ENGAÑAR AL JUGADOR?
Mentir está feo, pero a la hora de desarrollar jueguitos, hay un concepto que se repite muchas veces: Engañar al jugador para que este sienta que lo está haciendo mejor de lo que lo está haciendo en realidad. Puede parecer algo “negativo” pero créeme, muchas veces esto es la clave para que un juego no se sienta injugable.
Uno de los mayores ejemplos es el conocido coyote time presente en la mayoría de juegos de plataformas. Esta “mecánica oculta” otorga al jugador la capacidad de poder saltar incluso unos instantes después de haber dejado de tocar el suelo y empezar a caer al vacío. Esto es prácticamente imperceptible pero te permite ajustar mucho más los saltos, el personaje ya está en el aire pero a ti te da la sensación de que has saltado justo en el borde de la plataforma. Y esto no se hace para hacerlo más fácil sino para evitar que se sienta injusto.
En mi juego no hay plataformas ni saltos, pero lo que sí que hay es una pelota que se mueve muy rápido. Una pelota que debes golpear en el momento justo para desviar su trayectoria y evitar que te elimine y, literalmente, te mande a volar.
Aquí es donde entran las áreas de colisión. La pelota es sencilla: tiene un radio de colisión que se adapta a su sprite. Este radio define cuándo la pelota está impactando con otro objeto (un personaje, otra pelota, una pared…)
Los personajes, sin embargo, son un poco diferentes. Cada personaje tiene dos radios: El radio de colisión, que define cuándo el personaje es golpeado (y eliminado) por la pelota y el radio de golpeo, que es la distancia a la que el personaje puede golpear (y desviar) la pelota.

Radios de colisión
Si te fijas, el radio de colisión es bastante pequeño y no cubre todo el sprite del personaje, mientras que el radio de golpeo es bastante más grande. De esta manera, el jugador tiene mucho más margen para golpear la pelota sin que esta llegue a eliminarlo.

Ejemplos de colisiones
En la imagen A puedes ver que los sprites del personaje y de la pelota se solapan claramente. Sin embargo, como la pelota no ha entrado en el radio de colisión del personaje, esta no le estaría eliminando.
En la imagen B puedes ver cómo la pelota y el personaje están claramente separados. Pero como la pelota está dentro del radio de golpeo del personaje, este ya podría golpearla a esa distancia.
Además, cuando un personaje hace la acción de golpear, esta dura un tiempo (0,4 segundos para ser exactos) para que el jugador pueda anticiparse al golpeo.
La combinación de todas estas cosas provoca la sensación al jugador de que es capaz de esquivar la pelota por los pelos o de que es capaz de golpearla en el momento justo. Y, de nuevo, si esto no fuese así, el juego se sentiría mucho más difícil e injusto.
No se trata de hacerlo realista, sino de hacerlo satisfactorio.
LA IA
No te asustes, no vamos a hablar de esa IA. Antes de que la inteligencia artificial se dedicara a robar arte y esas cosas, el concepto IA se asociaba más con el comportamiento de NPCs o enemigos dentro de los videojuegos.
Las decisiones que toma un Sim en base a sus necesidades, Luigi lanzándote un plátano a la cara en Mario Kart o un Creeper encontrando el camino más corto para explotarte por la espalda, junto a tus cofres, en Minecraft. Todo eso son ejemplos de IA (de la buena).
Los personajes en mi juego también tienen un comportamiento que les permite ponértelo difícil. ¿Pero cómo hago que estos personajes jueguen lo suficientemente bien para que no sea aburrido pero sin que llegue a ser frustrante perder contra ellos?
Lo primero que pensé fue añadir un % de acierto a la hora de golpear la pelota. Por ejemplo: si este valor era un 50%, el NPC tendría una probabilidad de ½ de golpear la pelota cuando esta estaba en su radio de golpeo. Si le adjudicaba un % distinto a cada personaje, daría la sensación de que había algunos más buenos que otros.

Momento del saque inicial
Esto podía funcionar más o menos bien pero había un gran problema: Al principio de la partida, la pelota se mueve muy lento y va acelerando a medida que recibe golpes. Por lo tanto, no tenía sentido que el % de acierto fuese el mismo independientemente de la velocidad del balón. Era muy posible eliminar a uno o varios personajes nada más empezar a jugar, cosa que se sentía “forzada”, como si hubiese NPCs que estaban ahí solo para ser sacos de boxeo con los que ganar unos puntos sin mucho esfuerzo.
Entonces pensé: “¿Y si hago que ese % sea inversamente proporcional a la velocidad de la pelota?”. De esta manera, si la pelota va muy lenta, el % de acierto a la hora de golpear es mayor, mientras que si va muy rápida, es más probable que fallen.
Esto parecía una buena solución para el problema anterior pero… causó otro problema distinto. Mientras que antes era muy fácil eliminar a los rivales al inicio de la partida, ahora era demasiado fácil eliminarlos hacia el final. Y aunque eso suene lógico, se seguía sintiendo forzado y poco orgánico. Golpear a un rival a velocidad máxima era una eliminación casi segura, no se sentía tenso.

Racha de 3 ¡+300 puntos!
Entonces, me vino la inspiración y se me ocurrió otra idea más: Un porcentaje de acierto que disminuye un 1% cada vez que el personaje golpea la pelota. Además, añadí otra variable que hace que un NPC siempre acierte su primer toque.
¡Y funciona! Ahora las partidas se sienten mucho más intensas, todos los personajes tienen más probabilidades de fallar en función de cuántas veces han golpeado la pelota durante la partida, independientemente de lo rápido que vaya. Es como si, a medida que un personaje juega, aumentase su “cansancio” y fuese más propenso a fallar.
Ah, y esto es solo la lógica de golpear la pelota, no te he explicado cómo funciona el movimiento. Me gustaría decir que he creado un increíble sistema ultra complejo que hace que los personajes se posicionen en el punto exacto para desviar la pelota hacia ti, que son capaces de predecir hacia dónde va a rebotar la pelota y que pueden esquivarla con una precisión milimétrica pero… la realidad es que se mueven aleatoriamente (siento decepcionarte).
Los personajes se mueven en círculos mientras que frenan o aceleran de manera aleatoria. Unos se mueven en sentido horario y otros en sentido antihorario. La cosa es que queda realmente bien y muchas veces parece que se mueven con sentido y todo.
Algo que llegué a programar pero que más tarde descarté fue que cada NPC pudiese tener un comportamiento diferente. Unos te seguían todo el rato, otros seguían la pelota, otros intentaban ponerse siempre detrás de ti para usarte como escudo… Era interesante pero quedaba incluso demasiado caótico.
Dentro de la simplicidad encontré un punto medio que me encajó bastante bien. Al final el juego es caótico e impredecible, nunca sabes cuando un NPC se va a cruzar en tu camino y va a golpear la pelota en tu cara, o cuando tu propio compañero de equipo va a decidir no esquivar tu disparo (gracias por los -50 puntos, crack).
Irónicamente, siento que una buena IA también se debe sentir “tonta” a veces para que sea realmente divertido (obviamente depende del tipo de juego y de la experiencia que quieres crear), siento que hacer que un NPC siga un comportamiento muy rígido quizás lo vuelve demasiado predecible y, en consecuencia, más fácil. No sé, esto creo que da para una newsletter aparte.
En resumen, mis NPCs son un poco tontos, pero saben jugar y no te lo van a poner fácil.

Un NPC se autoelimina (-100 puntos…)
PARA ACABAR
Como puedes ver, este juego tan sencillito da para mucho. Y no te he contado el sistema de puntos, no he indagado en el sistema de colisiones con las paredes, no te he enseñado las animaciones de los personajes cuando salen volando o cuando celebran la victoria…
Tampoco te he hablado del sistema de textos, de los menús (odio los menús), de la UI… Ah, ¿y sabías que si te eliminan, te reencarnas en otro personaje de tu equipo para que puedas seguir jugando? (gracias por esa sugerencia, cielo <3).
En fin, que me podría tirar aquí escribiendo infinitamente pero tengo hambre y me quiero ir a comer. Gracias de corazón si me has leído hasta aquí y dime si te interesan este tipo de explicaciones más “técnicas”. Espero haberme explicado bien jeje
Como agradecimiento, voy a dejarte jugar al juego gratis aquí. ¡Puedes jugar tanto en PC como en móvil! El proyecto está en privado en mi cuenta secundaria de itchio y te pide una contraseña para poder entrar: “gagaball123“.
Espero que te guste el juego. Y si superas los 3.020 puntos envíame una captura, que es mi récord personal.
TU TURNO

Durante las largas sesiones de programación y desarrollo, hay algo que nunca puede faltar: la música.
En mi caso, una de mis opciones favoritas es escuchar bandas sonoras de videojuegos. Normalmente prefiero escuchar canciones sin letra para distraerme menos y las bandas sonoras son perfectas para ello.
De hecho, tengo una playlist en la que recopilo varios vídeos del estilo, te la dejo por aquí por si te interesa. (Hay OSTs de jueguitos indie, mucho Nintendo, covers, anime… de todo un poco, para cada mood).
¿Tú sueles escuchar música cuando trabajas? Si es así, ¿eres de las personas a las que no le importa escuchar cualquier tipo de música? ¿Prefieres música instrumental?
¿Qué música sueles escuchar cuando trabajas?
¡Anímate a participar!
Muchas gracias por leerme, de corazón. Hasta el próximo mes,
Xavi :)

