[Mini-Proyecto] :: Re-Entombed

AikonCWD

Re-Entombed

Descripción

Re-Entombed es una implementación rápida en Godot del juego original de Atari 2600 - Entombed. Un sencillo juego tipo infinite runner+topdown por el cual deberemos adentrarnos en el interior de un laberinto, recolectar monedas y evitar morir a mano de los esqueletos o del propio laberinto.

La curiosidad de este juego reside en su algoritmo de generación del laberinto. Dicho algoritmo utiliza una tabla de 32 bits para generar las paredes. Dicha tabla no parece tener ninguna lógica, ni patrón. La leyenda cuenta que dicha tabla la generó el programador estando borracho, de forma aleatoria.

Jugabilidad

Los controles son sencillos:

  • Desplazamiento: Flechas teclado / d-pad gamepad
  • Romper muro: Espacio / Botón A

El audio en chrome quizás no funciona a no ser que hagas un click en la pantalla antes de empezar el juego.
Hay algún que otro bug con los esqueletos, pero da un poco igual.
Una vez te mueres no hay reset, tienes que recargar el juego con F5.

Cada 10 monedas aumenta la velocidad del laberinto.
Cada pico otorga 3 usos
Mi record está en 116 monedas

Algoritmo Laberinto

Para calcular cuando hay que dibujar una pared o dejar el huevo vacío, el algoritmo comprueba 5 celdas adyacentes de la siguiente forma:

La X representa la celda que queremos calcular. Las celdas a, b, c, d y e son las celdas que se comprueban. La celda "a" corresponde a la celda situada 2 casillas a la izquierda, la celda "d" corresponde a la celda situada justo encima de la que queremos calcular, etc...

Dependiendo de si hay un muro en las celdas a, b, c, d y e, se salculará el valor de la celda x. Para ello se utiliza la siguiente tabla de 32 bits:

Pongamos un ejemplo:

  • a = 1
  • b = 0
  • c = 0
  • d = 1
  • e = 0
    Según la tabla, el valor de X será 1, es decir, pintaremos un muro. Podemos observar que hay ciertos patrones que devuelven "random", eso significa que el juego decidirá de forma random si pintar un muro o no, así cada partida es diferente a la anterior.

Excepciones

Hay que tener en cuenta 2 excepciones en este algoritmo. Primero de todo, las 2 primeras casillas siempre serán un muro (para delimitar el área de juego). Para evitar que los primeros cálculos siempre sean iguales, cuando vayamos a calcular la tercera casilla, el valor de "a" siempre será 1, "b" siempre será 0 y "c" será random. En el momento de calcular la casilla 4, el valor de "a" siempre será 0

Al calcular la casilla 10, el valor de "e" será random.

Finalmente solo se calculan 10 casillas por fila, y se repite el resultado en el lado opuesto, dentro de una cuadrícula de 20, en modo espejo. Formando un laberinto simétrico.
Dejo un ejemplo práctico:

Referencias

18
totespare

92 monedicas he recogido! Muy chulo, pequeñito y finiquitao para despejarte del curse gem. Ahora a volver para terminarlo! Jajaja

1
VonRundstedt

Este es el juego en el que estabas currando u otro proyecto?

Muy guapo, el sonidito de cuando te hieren lo cambiaría por otra cosa, un grito o algo.

1 respuesta
AikonCWD

#3 El juego con el que estoy currando es este: https://www.mediavida.com/foro/gamedev/devlog-cursed-gem-622552

Esto lo he hecho como practica y para pasar el rato.

HeXaN

Cómo te gustó el artículo. Me alegro mucho.

3
kesada7

Toma bug!! El algoritmo no funciona!! xD

Oye pues buena game jam te has marcado tu solito mis dieses

1 respuesta
AikonCWD

#6 Lo tengo visto, pero todavía no sé como solventarlo. Te explico:

Actualmente el algoritmo genera líneas del laberinto y luego genera items en los huecos de esa línea (monedas, corazones, esqueletos...). El bug reside en que si genera un esqueleto y éste se va hacia abajo, se puede situar en una zona que todavía no se ha generado. En el siguiente ciclo se generará una línea de laberinto nuevo y el esqueleto puede quedar aprisionado:

Aquí se ve claramente como se genera un esqueleto y decide ir hacia abajo, provocando el bug en futuras líneas del laberinto.


Para intentar solventarlo, decidí atrasar la generación de items, 5 líneas por detrás del laberinto, minimizando así que un esqueleto pueda empezar a bajar y salirse del mapa. Pero como muestro a continuación, todavía hay posibilidad de que el bug vuelva a suceder:

Así que por el momento no se me ocurre nada para solucionarlo. Voy a merendar a ver si se me aclaran las ideas.

2 respuestas
puntocom

#7 ¿Un collider en la zona gris que va avanzando a la vez que se generan nuevas líneas, para evitar que los enemigos pasen?

PD: está guay el concepto.

1 1 respuesta
AikonCWD

#8 Pues sí xd. A veces las soluciones más obvias no las veo xddddd.

Gracias, voy a intentarlo

1
Scottie

Muy entretenido @AikonCWD 🤗

kesada7

#7 Supongo que la parte que se va generando aleatoriamente es fuera de pantalla. Haz que los esqueletos estén parados y no se activen hasta que entren en pantalla o en una zona segura.

2 1 respuesta
AikonCWD

Solucionado como propone #11

Además mato 2 pájaros de un tiro. Resulta que no estaba eliminando los nodos/objetos que salían por arriba de la pantalla (monedas no cogidas, esqueletos, etc...). Eso provoca que cada vez hayan más nodos en memoria y llegaría el punto de provocar lag o comerse toda la RAM del equipo.

Con el notificador de visibilidad puedo liberar los nodos que salgan por arriba, aquí un detalle del monitor, ahora todo queda estable... a medida que se crean nodos nuevos (monedas, enemigos), se van eliminando si salen por arriba.

Antes de poner esta mejora, esas gráficas no paraban de subir de forma exponencial. Lo que provocaría un memory-leak de la hostia xd

1
carra

Está bastante bien! Para ser un proyecto pequeño y sencillito es muy entretenido. Y la explicación del algoritmo que has puesto está currada.

Por curiosidad, ¿Cómo tiene que estar hecho un juego para que cualquiera lo pueda jugar en una web tipo itch.io? Pensaba que serían juegos HTML5, pero tú lo has hecho con Godot...

1 respuesta
AikonCWD

#13 Godot es multiplataforma, y puedes exportar ("compilar") hacia multiples plataformas también:

Con el mismo proyecto de Godot he podido exportar a todo ese listado, con un par de clicks.
Para subirlo a itch.io y que sea jugable en web, tienes que exportar a HTML5. Prácticamente todos los engines lo hacen, hasta Pico8 xd

1 1 respuesta
Encofrado

Los motores tienen opción de exportar a varios formatos, en el caso de Unity, cuando lo exportas a WebGL, te crea un fichero index.html y algunas carpetas más con todo el resto. Eso cuando lo vas a subir a itchio por ejemplo te indica especificamente que si va a ser un proyecto web, tienes que subir un archivo comprimido con dicho index.html dentro.

1 1 respuesta
raid

Me ha encantado... jaja, hostia cuando empieza a acelerarse jaja, Muy buena jugabilidad. No conocía el de Atari

carra

#14 #15 Ya veo, lo imaginaba pero por alguna razón creía que estos motores no podrían exportar a HTML de una forma tan directa. Bueno, una razón más para programar usando un motor y no como lo hago yo jaja

2 respuestas
AikonCWD

#17 Lo que tú haces es una locura y a la vez algo admirable.
Ya te lo dije en su día: me quito el sombrero, señor :ok_hand:

2
carra

Por eso acabar mi juego ya es cuestión de honor :rofl:

A ver si algún día enseño en el foro alguno de mis otros proyectillos hechos a pelo. Y viendo las cosas chulas que hacéis vosotros, como esto, estaremos en buena compañía!

1 respuesta
Gif

#19 si estas usando sdl o raylib puedes compilar para web con emscripten, si es SFML no puedes.

1 1 respuesta
B

#17 Unity tiene un modo llamado Project Tiny que permite sacar builds html de unos 200kbs de peso (arte aparte).

Tiny es completamente modular para optimizar la eliminación de lo que no se usa del motor.

Por cierto...

spoiler
2
AikonCWD

Actualizadas las versiones online de itch.io y web

  • Añadido: puertas
  • Añadido: llaves
  • Añadido collider inferior para evitar que el player adelante al laberinto
  • Mejorado el algoritmo de generación de objetos
  • Reset de la partida al morir (automático)
  • Memory-leak solucionado

Es posible que haya traído de vuelta el bug de los esqueletos bloqueados, ahora con las puertas, ya que se spawnean después. Mañana le daré una vuelta y lo soluciono.

1 1 respuesta
B

Me esperaba otro hilo cíclico al verlo en el spy hasta que he visto que era de aikon.

Mis dieses a lo que veo, mañana le doy un try a ver cómo funciona. Sinceramente, no tenía conocimiento de este juego.

carra

#20 Pues no lo conocía, algún día tendré que probarlo!

Pero bueno dejo el tema que le estoy secuestrando el hilo a Aikon :laughing:

B

#22 podrías incluirlo como "easter egg" dentro del cursed.

1 respuesta
AikonCWD

#25 sabes? lo mismo me dijo ayer mi mujer xd. Pero no sé, no termina de encajar, no?

En Celeste, hay una zona semi oculta, llegas a una habitación con un PC, al encenderlo arranca el juego de Celeste original en Pico8. Algo así lo vería, pero no es mi caso tampoco

1 1 respuesta
B

#26 podrías cambiar el arte del Entombed por el del Cursed, pero adaptado, vista frontal.

edit: como mola, no sabía lo de Celeste xD

1
Alfrik

Te lo como tó

1

Usuarios habituales

Tags