↓
iaen.es Diario de desarrollo Read in English

Gotic · 3 min de lectura

Caminos con A* sobre un terreno procedural en Godot: Vega de Poniente, el pueblo del viñedo

Un pueblo de viñas y lagar en el suroeste de la isla, unido a Brumacosta por 490 m de camino. El camino se calculó con A* fuera del juego y se guardó como constantes.

#pueblos#procedural#mundo#herramientas

Caminos con A* sobre un terreno procedural en Godot: Vega de Poniente, el pueblo del viñedo

Si sales de Brumacosta hacia el oeste y sigues el prado durante 490 m, llegas a Vega de Poniente: arco con el nombre en naranja, casas de tejado rojizo, Gael en la estafeta del correo y, detrás del pueblo, un viñedo. Son cuatro hileras de cepas con racimos morados, atadas con alambre entre postes, y al lado un lagar con su prensa y tres barriles. Dalia, la viticultora, cuenta que sus uvas son «salobres» porque crecen con el viento del mar. Olmo, el lagarero, te tranquiliza: el camino de vuelta sigue el prado, sin cruzar bosque ni agua.

Esa última frase no es decorado: es exactamente lo que le pedí al algoritmo que trazó el camino.

Cómo está hecho

Dónde poner el pueblo. Antes de construir nada sondeé la isla cada 32 m buscando sitios llanos, secos y a más de 170 m de los mods que ya había. Vega de Poniente quedó en (−352, 448). Su configuración en el constructor común es esta (es el único pueblo con un claro de 50 m de radio):

village = Village.new({
	"name": "VEGA DE PONIENTE", "center": CENTER, "yaw": YAW,
	"houses": [Vector3(-18, 0, -14), Vector3(16, 0, -16), Vector3(-19, 0, 3), Vector3(20, 0, 2), Vector3(-16, 0, 20), Vector3(17, 0, 19)],
	"plaster": [Color("d8c49a"), Color("c7b7a2")], "roofs": [Color("a0613f"), Color("7a5a4a")],
	"markets": [[Vector2(8, -3), Color("b5692f")], [Vector2(-8, -3), Color("6f8f3a")]],
	"landmark": "vineyard", "landmark_at": Vector2(0, -38), "name_color": COLOR, "radius": 50.0,
})

Por dónde va el camino. Ahí entra A*. En Gotic la isla no se guarda: la altura de cualquier punto se calcula con ruido de semilla fija (Island.height_at). Sobre esa función puse una rejilla de celdas de 4 m y un A* con tres reglas:

  • el agua está prohibida;
  • cada paso cuesta más cuanto más empinado es;
  • el bosque también encarece el paso, así que el camino lo rodea si puede.

Buscar así un camino de cientos de metros tarda segundos, y eso no se puede hacer al arrancar el juego, menos aún en un móvil. Por eso lo ejecuté fuera del juego y guardé el resultado como constante en el mod: 25 puntos del mundo, desde el arco de Brumacosta hasta el de Vega de Poniente. Como el relieve sale de una semilla fija, esos puntos siguen valiendo mientras la isla no cambie. Si algún día cambia, la prueba del camino lo detecta: recorre cada tramo metro a metro y falla si pisa agua o si una cuesta supera lo que el personaje puede subir.

Al juego solo le queda dibujar. WorldArt.road convierte los puntos en una cinta de tierra que se pega al suelo, partida en mallas de 110 m para que no se dibujen los tramos lejanos. En el PC, construir un pueblo cuesta unos 50 ms y su camino, entre 46 y 104 ms.

El resultado es tranquilo: la cuesta más empinada del camino de Poniente tiene una pendiente de 0,09, cuando el personaje sube hasta 0,305. Y el camino sirvió para algo más. Cuando llegó la granja, su ramal de 239 m se enganchó a él (pendiente máxima de 0,11, sin bosque).

La receta para añadir otro pueblo quedó apuntada: copiar la carpeta de un pueblo, cambiar el centro, el giro, el diccionario y el camino, y dejar que la prueba diga si cruza agua o una ladera imposible.

Lo que falta por comprobar

El A* se ejecutó fuera del juego y su script no está en el repositorio: lo que queda son sus puntos y la prueba que los vigila. Si cambio la isla, tendré que volver a escribirlo. Los FPS con los cuatro pueblos en el móvil están sin medir, porque el teléfono estaba bloqueado cuando se instaló el APK. Esta captura costó 329 llamadas de dibujo y unos 166 000 triángulos en el PC.

Más de Gotic →