[DevLog] Planet Squad - El retorno del príncipe de los .io

M

Buenas gente, soy Midgard. No sé cuántos quedarán por aquí de la vieja escuela, de cuando nació el gamedev en mediavida, pero bueno, el que estuvo en aquel grupo de Telegram hace muchos años entenderá la coña del titulo, y el que no pues os hago una breve introducción:

Background

Ahora, más de 10 años más tarde, y con decenas de proyectos a las espaldas, habiendo trabajado en estudios de desarrollo de videojuegos de tamaño pequeño y mediano, y teniendo mi propio estudio desde hace bastantes años, vuelvo para recordarme lo que era trabajar en proyectos por pasión.

Hoy en día mi estudio de videojuegos llamado SakiGames vende servicios de desarrollo a otras empresas, haciendo una facturación anual de entre 100-200mil dólares.

Voy a aprovechar este proyecto para, ahora que tengo un buen colchón de seguridad, mientras trabajo para mis clientes, además desarrollar y lanzar Planet Squad mientras lo documento todo, desde fase temprana de desarrollo hasta pulido, lanzamiento y marketing; por si fuese de ayuda o inspiración para alguien, también con la intención de diversificar ingresos en mi estudio, para que no todo dependa de clientes, que si bien a día de hoy después de una década son muy sólidos, vender servicios a otros no es todo lo que me apetece hacer en mi vida, tengo muchos proyectos de pura pasión en mente, como Planet Squad, que quiero sacar al mundo, pase lo que pase.

Así que empecemos.

Planet Squad
Planet Squad va a ser un juego tipo shooter RPG multijugador masivo instantáneo multiplataforma (web, PC, Android e iOS), con un twist muy goloso. Estoy hablando de que el gameplay va a acontecer en planetitas, con gráficos cartoon muy simples y cucos. La inspiración para este proyecto viene de Super Mario Galaxy y de un proyecto abandonado por otro dev que me llamó mucho la atención hace 8 años.

En el juego vamos a ser un soldadito que va a descender en una cápsula hacia una variedad de planetas (el primero de todos algo parecido a la Tierra), al aterrizar, obtendremos control del soldadito y entraremos en un entorno PvPvE (jugador contra jugador y también contra entorno), en el que, a tiros, iremos matando bichos de distintos tipos y niveles para recoger loot y experiencia, para mejorar nuestro personaje, todo mientras también nos pegamos tiros contra otros jugadores (o hacemos grupo junto a ellos).

El juego está siendo diseñado para soportar partidas de hasta 100 jugadores en el mismo servidor (+ bichos y otros eventos).

Tecnologías usadas
Game Engine: PlayCanvas con modificaciones. (para quien no sepa, PlayCanvas es un motor primeramente enfocado a web).
Lenguajes: JS (tanto en client-side como en server-side usando nodejs).
Backend: NodeJS, uWS, y varias librerías propias con utilidades de todos estos años, sobretodo para leer, escribir y enviar paquetes en el netcode.

El proyecto lo empecé hace 1 semana, y la idea es tenerlo jugable para después de Navidades; De ahí, iré desarrollando el juego con builds públicas para coger feedback y ir haciéndolo crecer.

Aquí os dejo un screenshot de cómo se ve el planeta prototipo actualmente:

En unos minutos escribiré un pequeño update para hoy.

La idea es tener updates diarios, o casi diarios para llegar al deadline inicial que me he puesto. Y el devlog también ayuda a darle caña.

Sé que es probable que a la mayoría todo esto os pueda sonar muy laborioso e imposible, pero ya veréis a medida que pasan las semanas!

PD: Probablemente también me abriré un devlog en inglés, aún no sé donde, pero ya lo compartiré por si alguno quiere. Esos updates serán semanales muy probablemente, englobando todo lo que haya sucedido cada semana.

8
M

Update 1

La semana pasada estuve programando las físicas del jugador contra el planeta, controlador de cámara básico y creando el planeta prototipo en Blender, de ahí escribí un sistema para leer el .GLB que exporto de Blender y poder usar Blender como editor, ya que estoy usando PlayCanvas a pelo y no tiene editor como lo pueden tener Unity o Godot.

Al terminar ese parser, pude hacer que el servidor spawnee árboles en determinadas áreas establecidas con esferas en blender, como podéis ver aquí:

En un principio, no voy a dedicar tiempo a un editor propio para el juego, ya que puedo usar Blender para todo, como veis. Después las esferas se borran in-game y listos.

Al unirse un jugador al juego, recibe los puntos de spawn de los árboles y se ve tal que así:

Hoy me he puesto a extender este parser y netcode para mandar datos iniciales sobre el juego para soportar rocas! Así que nada, me he puesto en el blender y he hecho esta roca básica, que rotando y posicionando queda suficientemente convincente para esta fase temprana del juego:

Después de la horita de trabajo dedicada, ahora no sólo tenemos árboles, si no que también rocas sincronizadas por red! (vamos que todos los jugadores ven exactamente lo mismo).

Así se ve ahora:


https://sakigames.com/dist/ps/first_overview.mp4

2
javifugitivo

¡Cuanto tiempo! Me alegro que sigas haciendo juegos y abriendo diarios dev como true dev. Iré siguiendo tus progresos.

1 respuesta
YaW

Qué grande, todo un ejemplo a seguir. Espero que tengas algún JDM pepino con esos ingresos.

1 respuesta
K

Grande

1 respuesta
VerZ

Heroe

1 respuesta
Czhincksx

Olé! Pinta muy bien.

1 respuesta
M

Gracias a todos, veo que la vieja escuela sigue por aquí :D

Vengo a escribir el update de hoy.

Update 2

Tema del update (música que iba escuchando mientras trabajaba):

Hoy he empezado toqueteando valores de spawn de objetos de entorno en el planeta, para ver más o menos por dónde quiero tirar en cuanto a densidad de determinados objetos, como árboles, que son enormes y bloquean la vista así que hay que bajar su densidad bastante para que el juego no sea sólo rodear orillas.

Después, he seguido escribiendo netcode, principalmente la clase Player tanto en cliente como servidor que básicamente va a mantener una lista de jugadores activos, con sus estados y sincronización de posiciones, rotaciones, animaciones, vida, armas, etc; además de tener métodos para pedir spawn y recibir spawns aleatorios en base al mundo esférico. Aprovechando, también he hecho algo de trabajo de UI, para indicar qué está sucediendo en el momento en el que abrimos el juego.

Hasta ahora el spawn era inexistente y realmente el jugador no existía en el server-side, lo que se veía en los gifs y vídeos de ayer era simplemente un controlador que escribí y puse ahí a mano.

Así que ahora, de verdad cuando abrimos el juego, nos conectamos al servidor y éste nos asigna un ID único en esa sesión, una entidad en el mundo y un cuerpo (en físicas) que servirá para detectar colisiones y aplicar fuerzas de daño en área en server side más adelante.

Como podéis ver, la primera implementación del spawn estaba rota, pero por qué?

Pues muy simple; Simplemente estaba creando una posición aleatoria según el radio del planeta y haciendo un raycast en server side para encontrar en qué punto el player iba a ser creado. En principio hasta ahí todo bien, pero debido a que el cuerpo del player tiene volumen (en concreto es una esfera con escala 1), al entrar en juego las físicas, la esfera quedaba dentro del cuerpo del planeta, haciendo que éste se comiese al player y atravesáramos el suelo.

Para arreglar esto, simplemente he tenido que tener en cuenta el normal devuelto por el raycast y sumarlo a la posición de spawn. Así, tenemos un offset del tamaño del volumen del cuerpo del jugador, y ya no atravesamos el suelo:

Muy bien, después de ya tener realmente al player existiendo en el mundo del servidor y viceversa, he decidido incorporar unas flores blancas al mundo, que estaba muy soso. Así de paso, he re-hecho el paquete que enviaba al principio del juego al jugador para que viese los árboles y rocas, lo he metido en el Player State (en la clase del Player), y ha quedado mucho más ordenado.

He abierto el blender y he hecho las flores más cutres de mi vida, pero creo que in-game no quedan tan mal :joy:
Y si no, más adelante las mejoro.

He creado nuevas esferas para representar el punto de spawn de las flores en el .GLB del planeta:

Y lo he cargado al servidor, lo cual ha generado este escenario en el juego:

He hecho otras pequeñas cosas como ajustes a la cámara y adición de un modo nuevo (el planet overview que sucede al principio del todo). Otro día me pongo a jugar con las densidades de las flores también.

Posiblemente mañana diseñaré la cápsula en la que debe descender el jugador antes de realmente spawnear en el planeta. Ahí hay curro pero bien ejecutado va a ser una buena experiencia de spawn. Similar a caer del cielo como en un battle royale.


#3 un placer ver que sigues por aquí tú también, en qué andas?

#4 gracias YaW y #5 kikillo, habéis venido uno detrás del otro :D

Pues no, no tengo un japo, ahora voy con un AMG y una R6 de 2019

#6 Verzzzz, cómo va eso? Sigue Brainwash Gang adelante o qué?

#7 Muchas gracias, la verdad es que el prototipo de este juego ya de entrada se siente bien, y no es algo que pueda decir de la mayoría de proyectos en los que he trabajado.

PD: Comentar que en realidad he escrito este post a las 19.30hrs pero lleva más de media hora subiéndose los gifs, estaba usando un conversor de mp4 a gif online pero he tenido que descargarme ffmpeg y usarlo en la CLI para no perder más tiempo, pero aún así al subir todo a mi webserver está tardando un huevo, Andorra Telecom lleva reventada 2 días.

PD2: Al final ni se ha subido bien todo, lo estoy volviendo a intentar xd

1 1 respuesta
javifugitivo

#8 Pues como gamedev llevaba años sin hacer nada (la vida, man) pero hace poco que he vuelto a tener tiempo para hacer movidas. Por ahora estoy con un proyecto de remake de un juego que presenté a una jam. A ver si me animo a abrir un dev diary para luego abandonarlo eternamente.

Por ahora pinta guay el proyecto, mola sobre todo que vaya a funcionar en html5. Yo estoy poniendo mucho énfasis en que mi juego al menos vaya en html5 para la hora de controlar el rendimiento, testeo, etc. ¡Mucha suerte con el proyecto!

Por cierto para los gifs y minivídeos, yo uso: https://gyazo.com/

M

Hoy no hay update. O sea, sí, he estado programando el spawn de la cápsula del jugador, que vaya cayendo, que se hostie contra el planeta y que spawnee el jugador al colisionar con el planeta.

Pero mi internet sigue yendo como la mierda (8mbps de bajada y menos de 0.1mbps de subida), así que no hay fotos ni nada.

Espero mañana poder terminar la cápsula con algunos efectos y poder subir vídeo.

Salu2

M

Update 3

Tema del update:

Esta tarde me he dedicado a terminar la lógica de la cápsula del jugador. Inicialmente el jugador simplemente hacía spawn en un punto random en el radio del planeta. Ahora, la cápsula aparece en un radio muy alejado del planeta, y el jugador sólo hace spawn una vez ésta ha aterrizado.

Hay que decir que mejoraré todo a medida que avance, pero de momento, así ha quedado el modelo (junto al pupurrí de efectos que voy activando y desactivando según la cápsula va descendiendo):

Una vez teniendo el modelo, he escrito una nueva clase PlayerCapsule para controlar todo lo que pasa con las cápsulas del jugador. El ID de la cápsula es el mismo que el ID del jugador, para hacer aún más fácil el lookup cuando se necesite.

Aún me queda por implementar los efectos de sonido, que por alguna razón están bug, mañana me pondré a mirar el engine, ya con todo el tiempo de un sábado que pinta super lluvioso, perfecto para trabajar a full y pegarle un buen progreso al proyecto.

A medida que la cápsula desciende, he simulado la entrada a la atmósfera del planeta con un pequeño efecto como de impacto con el aire (rompiendo la barrera del sonido o yo que sé), seguido de un efecto de fuego que se verá reforzado por efectos de sonido acompañándolo además de un screenshake que empieza suave y acaba fuerte una vez aterrizados.

También he añadido un pequeño detalle al inicio, pero bueno, creo que no se nota demasiado.

Cuando pase a revisar la lógica de la cápsula haré que al aterrizar la cámara no pase de un modo a otro de sopetón, si no que sea suave.

Mañana, me pondré a arreglar el bug del sonido y muy probablemente a modelar el soldadito que controlaremos (o al menos el soldado base, ya que después habrá personalización de varios tipos), después de ello más sincronización de estados de jugador y después a hacer algún bicho con la excusa de poder empezar ya las mecánicas de tiros.

Salu2

M

Me he tirado el finde trabajando en el proyecto? Confirmamos, pero nada vistoso. Estoy tan reventado que sólo voy a poner la lista de commits recientes, y el que sepa inglés entenderá.

Esta semana que entra se deberían venir cosas vistosas :D

7 días después
M

Update 4

Tema del update:

Va a ser que me he dado cuenta de que escribir un devlog cada día o casi cada día es jodido. Así que nada, supongo que los escribiré cuando pueda.

El juego va viento en popa; Es cierto que me he ido encontrando con unos retos guapos guapos debido a la naturaleza esférica del mundo del juego, pero la verdad es que me lo estoy pasando como un niño solventando los puzzles y haciendo funcionar todo como debe ser.

La semana pasada, posteé #12, que no fue un update como tal, así que voy a extenderme en todos esos commits.

El fin de semana pasado, en concreto el sábado, me dispuse a diseñar un prototipo de modelo humanoide que poder usar para el jugador y enemigos en esta fase tan temprana del desarrollo. Todo eran florecitas de colores hasta que fui a importarlo al juego y me percaté de que aún no había pensado en cómo iba a orientar el modelo según el ratón del jugador.

En concreto, había que orientar el modelo del jugador sólamente en el eje Y (el vertical), para que el modelo mirase hacia el ratón pero se quedase "de pie", vamos, como en cualquier juego top-down.

El tema es que en un juego top-down normal y corriente en el que el mundo es plano (sí terraplanista), orientar el modelo hacia el ratón es tan fácil como obtener la dirección entre la posición del ratón en el mundo y la posición del jugador, aislar el eje Y y hacerlo igual para tanto el jugador como el ratón, y usar Math.atan2 para encontrar el ángulo de diferencia en el eje Z (forward) para orientar.

Estuve rompiéndome la cabeza literalmente todo el sábado porque básicamente no funcionaba, intenté aislar el eje Y de mil maneras, teniendo en cuenta que el eje Y en un mundo esférico en donde el jugador lo camina a sus anchas es básicamente relativo y cambia constantemente mientras te mueves.

En un debido momento me di cuenta de que los problemas sólo empezaban cuando la posición del ratón estaba bastante lejos del jugador, así que estuve intentando solventar, pero no hubo manera.

Al final desistí de usar Math.atan2 y le estuve dando vueltas a cómo podía hacerlo. Le expuse el caso a ChatGPT y amablemente me indicó que si Math.atan2 no funcionaba podías hacerlo con los productos cross y dot de los vectores de dirección. Me puse a probarlo y funcionaba prácticamente a la perfección, sólo tuve que pulir un par de cosas más y conseguí solventarlo. Lo malo es que no tengo más que esta screenshot:

Pero ojo que eso no termina ahí. Una vez orientado el modelo del jugador con éxito, todavía me quedaba orientar el brazo derecho a mirar al ratón.. sudores fríos invadieron mi cuerpo después de todas las horas invertidas en conseguir orientar bien el jugador.

Nah, al final no fue tan jodido, también tuvo lo suyo pero ya no tuve que estar todo el día para hacerlo, en una hora o dos conseguí tener el bracito apuntando al raycast del ratón, y quedaba guay, aunque no tengo imágenes de ello, estaba bastante quemado de haberme tirado tanto tiempo en la tarea anterior.

Después de eso decidí que no me gustaba el primer modelo humanoide que hice para el prototipo del jugador y enemigos, especialmente porque le puse un huevo de detalle y al final al ser un juego en el que los personajes se van a ver desde arriba, no hace falta tanto; Así que me puse a hacer lo que cualquier buen ingeniero haría: Simplificarlo hasta que todo vaya de lujo. Y así quedó:

Lo animé con dos estados básicos "quieto" y "caminar" y lo importé al juego, vi que todo guay.

Después me puse a seguir escribiendo el netcode del juego para sincronizar también la orientación del modelo y la del brazo.

Al final, terminé re-escribiendo mil cosas más y llegué a algo muy sólido. En un principio el netcode iba a simplemente actualizar todos los jugadores a la vez y mandar paquetes para que cada cliente lo interpretase. Pero se me ocurrió que.. para qué un jugador en la otra punta del planeta iba a necesitar sincronizar a otro jugador en la otra punta en donde ni siquiera podía verlo por la curvatura del planeta? Eso iba a costar muchos recursos de computación, no sólo a nivel netcode si no también de renderizado en cada cliente.

Así que me puse a diseñar un concepto que he llamado Awareness Bubbles, o "burbujas de conciencia".

La manera en la que funciona este concepto es que cada jugador, y cada NPC, tienen una burbuja de conciencia en el servidor. Todo lo que entra en esta burbuja de conciencia, emite un evento para que ese actor aparezca en el cliente con el que ha tocado, y cuando sale, igual, pero para desaparecer.

Al terminar, ahora todo lo que esté a 5 metros de un jugador, aparece como debe.

Después de eso, tocaba empezar a darle caña a algo divertido de verdad: Sistema y lógicas de tiros, poder sujetar un arma con tu personaje y poderla disparar. Para ello simplemente escribí una nueva clase para gestionar todo esto que se llama WeaponController, y que emite eventos al servidor cuando se quiere disparar, para que el servidor haga la simulación e informe a los clientes.

Qué pasa? Que iba avanzando yo muy rápido y al principio todo bien probando a disparar contra el planeta. Pero cuando quise disparar a los árboles o las rocas.. me di cuenta de que algo no iba bien:

Así que desactivé todo el código de proyectiles y en su lugar hice que al disparar, el jugador emitiese un Raycast al servidor, y éste lo simulase y devolviese el resultado de la simulación.

Pues nada, acorde a mis sospechas, la esfera del proyectil atravesaba los árboles y las rocas porque las mallas no estaban bien.

Tras mucho meditar y probar, encontré el problema en mi workflow para descargar datos del cliente (las mallas que usa PlayCanvas) y volcarlo al servidor, donde las físicas que rulan gracias a CANNONJS, se encargarían de simular todo igual que en el cliente (porque usan ambos el mismo motor de físicas).

Solucioné el problema, que simplemente era que estaba volcando datos de mallas escaladas en lugar de con escalas originales, y el servidor, al escalar de manera aleatoria para darle variedad al mundo, todavía la liaba más, terminando con colisiones y raycasts que no representaban lo que se veía en el lado del cliente.

Y ahora, por fin, todo va bien:

Lo siguiente es jugar un poco con tema de simulación de proyectiles y luego me pongo de cabeza a escribir la lógica que van a usar los NPCs y a solventar otro puzzle enorme, que va a ser, nada ni menos: cómo cojones hacer que un BOT/NPC sea capaz de encontrar puntos en el mundo esférico; rutas más cortas y navegarlas sin problemas para encontrar puntos de interés como, jugadores.

2
M

Update 5

Tema del update:

Sinceramente, no pensé volver a escribir un update al día siguiente, pero la verdad es que ha sido un día muy productivo!

Ayer terminé el tema de colisiones de los proyectiles pero me quedaba jugar un poco con todos los valores para hacer que los proyectiles fuesen a una velocidad buena y comprobar que la simulación no se rompía por ningun lado.

Así que lo primero que he hecho ha sido ponerme con eso mismo. He desactivado los paquetes de actualización de estados de proyectiles para que el cliente únicamente reciba los paquetes de dónde se crean y dónde se destruyen los proyectiles.

El tema de actualización de estados de proyectiles es algo que activaré de nuevo para otro tipo de proyectil, en concreto aquellos proyectiles cuya trayectoria NO SEA RECTA y por tanto no se pueda simular determinísticamente en el cliente la trayectoria de éste (dependeremos de los paquetes del servidor para ello). De todas maneras, esto será para proyectiles tipo granadas, cohetes teledirigidos o algo de ese rollo. Por ahora no hace falta reactivar esos paquetes.

Así que después de ajustar también valores en el cliente, los proyectiles han quedado así:

Después de ello me he puesto de lleno con el sistema de navegación que van a usar los enemigos. Como he dicho no pensaba poder postear tan rápido sobre ésto y no iba a escribir un update sólo para el tema de los proyectiles, pero lo cierto es que ha sido bastante fácil de escribir este sistema.

Estuve pensando días atrás sobre cómo podría hacer que los enemigos se muevan por el planeta de buena manera, pudiendo dirigirlos con lógica hacia puntos de interés (como las posiciones de los jugadores); o lo que fuese.

Para este proyecto, debido a la naturaleza esférica del mundo, iba a ser muy jodido usar librerías de navegacaión típicas como A* o similares. Así que lo primero en lo que pensé fue en hacer algún tipo de NavMesh, que ya había usado hace muchos años en Unity, pero claro, Unity te lo hace fácil de cojones.

Lo malo es precisamente eso, que no estoy usando Unity, es todo bastante personalizado con PlayCanvas, vamos que te lo tienes que picar tú.

Me estuve mirando posibles librerías que me pudiesen funcionar en el backend con NodeJS pero no di con nada concluyente.

Así que volví a pensar como un buen ingeniero e intenté simplificar el asunto. Hasta que pensé: Un Navmesh no es más que una colección de polígonos en base a una malla, ¿no?

Pues por qué simplemente generar los puntos yo mismo?

Total que al final he hecho un raycaster que crea puntos alrededor de la malla del planeta usando eso, raycasts, para saber exactamente dónde debería quedar cada punto. Al principio, estaba generando demasiados puntos y he pensado que escribir un algoritmo para tantísimos puntos y que encima fuese rápido sería mucho pedir, así que he decidido hacer puntos más grandes, y que le den, seguramente quedará bien, y si no, siempre puedo modificar los valores para generar más puntos y optimizar el algoritmo más adelante.

Dicho y hecho, he escrito un algoritmo bastante simple que lo que hace es encontrar un camino según un punto inicial y un punto final, comparando las distancias de los puntos vecinos y ir encontrando el camino en base al vecino de cada vecino.

Al final, me ha quedado bastante guay, y haciendo pruebas he visto que un enemigo (o los que sean) van a poder encontrar puntos y moverse por el planeta a una velocidad óptima.

Y al final así ha quedado, en este gif he hecho que el servidor mande rutas cada 5 segundos al cliente a la vez que visualice todos los puntos envolviendo el planeta:

Finalmente, puedo decir que lo siguiente que se viene ya es hacer las clases para los enemigos y mover sus cuerpos usando este sistema de navegación, y luego proceder a que los proyectiles hagan daño! Jajaja

A ver si le puedo dar a esto mañana, que va a hacer que el juego ya empiece a parecer un juego de verdad. Poco a poco van estando más mecánicas desarrolladas que le dan forma a esto, a ver si llego a tener una build pública para navidades con el MVP!

3
10 días después
M

Update 6

Tema del update:

No va a haber ninguna imagen nueva del juego así que podéis ignorar, he tenido que invertir prácticamente 7 días en re-escribir todo el juego

El fin de semana pasado volvió a ser jodidamente duro. Pensé que lo tenía ya todo bien encarrilado y me puse de cabeza a meter el primer enemigo al juego.
Como todo buen RPG, iba a ser un Slime.

Así que me levanté bien temprano el Sábado pasado y me dispuse a extender la clase Actor que básicamente crea un actor en el mundo, con sus estados; Posición, orientación, cuerpo en físicas (rigidbody), etc, de manera que pudiese usar esta clase como base para cualquier tipo de NPC controlado por el servidor.

En cuestión de hora y media tenía una esfera que simulaba un Slime navegando el mundo con el sistema de waypoints que diseñé días atrás.

Todo iba de lujo (o eso creía yo).

Para realmente testar éste nuevo NPC que había diseñado para ser el primer enemigo en el juego, en lugar de crear uno al inicio, me puse a crear 100.

Y ahí.. empezaron los problemas. Me di cuenta de que el juego iba jodidamente lento, y después de indagar un poco en los problemas, me di cuenta de que el problema principal era CannonJS, la librería de físicas que estaba usando tanto en cliente como en servidor, parece ser que ésta librería es tan amateur que no puede soportar calcular las colisiones para 101 esferas (100 enemigos + 1 jugador) contra un trimesh de unos 5000 triángulos.

Me puse a probar todo tipo de cosas para evitar cambiar la librería de físicas porque tan avanzado ya en el prototipo iba a significar re-escribir absolutamente todo y no me apetecía nada, era sábado, joder :joy: y se suponía que iba a avanzar y tener el juego jugable para navidades!

Entre las cosas que probé, fue separar el mesh del planeta en 6 partes, pensando que así CannonJS tendría menos trabajo.

Pero.. no fue así, y además, splittear el planeta generaba otros bugs de colisiones que tampoco me apetecía ponerme a solventar..

Así que nada, me puse a buscar si alguien había tenido problemas con éste motor de físicas tan ligero y tan cuco que había elegido para simular toda colisión en Planet Squad.

Y voy y me encuentro con un issue cerrado en github, me alegré y pensé que simplemente tenía una versión desactualizada de la librería, me la volví a descargar y nada, mismo problema. Leí en más detenimiento el issue y veo que el creador de este motor de físicas sólo había testado el algoritmo de Esferas<->Trimesh estático con UNA sola esfera.


Así que nada. Desistí, eran como las 12 del mediodía, y pensé.. sé qué motor puedo usar como reemplazo y sé que no me va a dar estos problemas.. pero me apetece pasarme todo el sábado y probablemente también el domingo re-escribiendo todo e implementando el motor de reemplazo?

Y obviamente no me apetecía pero es lo que hay, si queremos sacar proyectos adelante hay que currar, ya tendré tiempo para relajarme cuando lo publique. Pero ponéos en mi piel.. toda la semana trabajando como un cabrón, para llegar el fin de semana y tener este problemón..

En fin, por eso el gamedev es lo que más calvas, ganas de morir y buenas barbas genera junto al culturismo.

Así que me dejé de tonterías y me puse a re-escribir todo el código de colisiones para implementarlo con Bullet Physics, reconocido mundialmente en nuestra industria como uno de los mejores motores de físicas Open Source, usado por nombres enormes como Rockstar o Psyonix con los GTA y Rocket League, diría que hasta Unreal Engine solía correr con ello, y iba a implementarlo tanto en cliente como servidor, que es lo que he terminado haciendo.

Al final, me tiré todo el sábado, todo el domingo, una buena parte del Lunes y del Miércoles, y hoy, por fin, he llegado a la paridad entre cómo estaba el proyecto con CannonJS, pero con Bullet Physics.

He realizado la misma prueba, con 100 Slimes y 1 jugador, y todo aguanta, y no sólo aguanta, si no que le puedo echar más leña al fuego si quiero y tener no 100 si no 200, 300 y quizás hasta 500 Actores en el mismo planeta y servidor.

Cabe recalcar, que a parte de cambiar el motor de físicas por Bullet Physics, también he separado el servidor del juego en 2 threads/hilos. El principal, simula todo el mundo, físicas, actores, sistema de waypoints, etc. El secundario, es el que se encarga del netcode, preparación y envío de paquetes.

He de decir que ha sido profundamente divertido re-hacer todo aunque no tenía putas ganas porque ha sido como volver al punto de partida, pero ahora el juego va de lujo, y de hecho ya lo he puesto en un VPS de 2 Cores y 2GB de RAM, con 101 entidades (Slimes y jugador), se sitúa el consumo de CPU y RAM muy tranquilito, así que me da margen para realmente hacer lo que me salga de los cojones. Va a salir un juego "muy guapo", como diría un famoso streamer.

Y sí, NodeJS puede ser multithreaded, aunque la gestión de memoria es bastante incordio, pero me he hecho una helper class que mantiene todo genial en SharedArrayBuffers y puedo escribir y descifrar actores a través de ellos, que es todo lo que necesito por ahora.

Ahora sí que sí, mañana empieza por fin, lo vistoso y divertido. Empezar a hacer más mecánicas y a repasar gráficos y demás. Sobra decir que no tendré el juego jugable para el Lunes, pero igual droppeo enlace con lo que haya. Veremos. Soy bastante partidario de ir desarrollando los videojuegos online en público.

PD: Nunca en la vida vuelvo a usar CannonJS para algo mínimamente complejo.
PD2: Viva Bullet Physics.

3
M

Update 7

Feliz Navidad!

Hoy sólo os traigo este pequeño gameplay porque me da pereza explicar todo, pero ya funciona todo increíble y he podido añadir el primer enemigo sin problemas, los proyectiles ya hacen daño, se puede matar Actores (incluye NPCs y Jugadores), y se pueden crear más "on the fly", así que ahora tengo un mundo multijugador masivo en el que podemos matar Slimes y a otros jugadores, y siempre habrá Slimes apareciendo.

https://sakigames.com/dist/ps/firing_gameplay.mp4

Saludos a todos y felices fiestas.

2
KarlosWins

Qué viejos somos.

Me alegro de que te vaya bien y suerte con el proyecto.

17 días después
K

nos has dejado a medias saki! :(

2

Usuarios habituales