Principio de una historia; buscando el camino correcto
Fregocles, o más bien la aventura de como hacer una aventura, comenzó tras otro proyecto fallido que terminaba en la carpeta de “demasiado ambicioso”. Se empezó sin nombre, sin historia y sin pretensión de terminar un juego. En sus inicios solo era un intento de crear un motor de aventuras gráficas, todo con la pequeña ilusión de que si llegaba a buen puerto, se plantearía la idea de hacer un juego.
Lo primero que vio la luz de ese motor fue la búsqueda de caminos. No es una parte muy específica, pero algún iluminado creyó que sería lo más difícil y que si se superaba, el resto sería coser y cantar. Sin profundizar técnicamente, aquí se muestra el proceso de desarrollo del algoritmo. Podéis bajar los binarios de una compilación de marzo de 2004 haciendo clic aquí.
La búsqueda se desarrollaría en un entorno 3D, pero en una aventura gráfica no es especialmente necesario disponer de varios niveles (en altura), teletransportes, etc. y ya que desde un punto de vista cenital, el personaje se mueve solo en 2D (aunque luego al andar se adapte a las alturas del terreno), la búsqueda trabajaría únicamente en dos dimensiones.
Otra decisión que había que tomar era si trabajar con una matriz de posiciones o mediante un grafo de nodos (como las aventuras clásicas en 2D). Usar nodos permite llevar a tu personaje justo a la posición que quieres y permite tener nodos no conectados muy cerca (por ejemplo a cada lado de un muro). Pero nos decantamos por el otro método, teniendo una cuadrícula que marca las posiciones en las que puedes estar. Esto limita bastante los movimientos del personaje, pero es más fácil de implementar, principalmente porque no necesita ningún editor específico para esto. De forma que solo era necesario una matriz que indicara las casillas por las que se puede pasar y las que no, un origen y un destino. El algoritmo genera una lista de casillas por las que hay que pasar para llegar al destino sin chocar.
Cada habitación tiene su propia matriz de colisiones, la cual es generada a partir de una imagen BMP donde el color negro significa “muro” y cualquier otro color indica “camino”. Más tarde el color de la parte caminable se utilizó para definir que cámara es usada en cada momento, pero eso es otro tema.
Lo básico estaba hecho, ahora había que refinarlo. El primer problema era ¿qué ocurre si origen y destino no están comunicados? Se optó por buscar la casilla más cercana al destino que si comunicara con el origen, así el personaje quedaría lo más cerca posible de donde se le había indicado que fuera.
El segundo problema era que el personaje se movía solo en ángulos de 90 grados, y eso no quedaba muy natural cuando una diagonal habría sido el camino más lógico. Se solucionó repasando el camino desde el final, intentando saltarse nodos innecesarios, usando diagonales y sin chocarse (contando además con que el personaje no es un punto y ocupa una superficie). En la imagen puede verse la casilla de origen (O) y la de destino (D), en color verde el camino inicial (solo giros de 90º) y en rojo (marcando los nodos con círculos) el nuevo camino con diagonales. Podrían existir caminos más cortos aun, pero con este simple sistema quedaba bien.
Se añadieron algunas optimizaciones para realizar varias búsquedas simultáneas, y la posibilidad de varios personajes esquivándose unos a otros. Con todo esto, una mopa y abrillanta suelos, se obtiene un camino limpio hacia cualquier parte.
Muy buena esta entrada, si todas van a ser del estilo creo que estará muy muy interesante todo esto. Mucha suerte!
yEnS
29 d+02:00 marzo, 2007 a las 0:19Aún recuerdo el primer render que enseñaste de uno de los personajes (Hércules creo). Ya desde entonces sabíamos que tenía chispa. Excelente y didáctico post. Un saludo
Elthan
29 d+02:00 marzo, 2007 a las 10:08Muy interesante el post. Yo tambien tengo que implementar algo similar, en principio había pensado en el otro método que comentas, el del grafo de nodos.
Saludos
brausoft
29 d+02:00 marzo, 2007 a las 18:52Muchas gracias por los comentarios. Todas las entradas de la categoría técnico serán por el estilo, y en algunas esperamos profundizar un poquito más. Espero que los temas que vayamos sacando sean interesantes.
Brausoft, el método del grafo de nodos realmente es más versátil. Nosotros utilizamos el otro por ser fácil de implementar y por no requerir un editor específico, pero como te digo, los nodos tienen muchas más posibilidades.
Si necesitas ayuda en algo, no dudes en contactar e intentaremos echarte una mano.
Por lo demás, si alguien quiere que se profundice en algún aspecto en concreto, nosotros encantados
Saludos!
Vil
29 d+02:00 marzo, 2007 a las 22:02No sé si podría entrar dentro del apartado técnico, pero me gustaría saber cómo os habéis organizado para plantear todo a nivel general, y luego a nivel de «fases».
Y ya puestos, estaría bien un vistazo a los eventos xD
yEnS
30 d+02:00 marzo, 2007 a las 19:30Está pensado un post o dos enteros dedicados a los eventos. Respecto a la organización también va a haber uno, sobre cómo nos organizamos todos los que trabajamos en el juego. Respecto a las «fases» no se si te refieres a las fases del juego o a las fases de desarrollo (supongo que lo último). Lo tendremos también en cuenta ;)
Vil
30 d+02:00 marzo, 2007 a las 22:45Con las fases me refería a las pantallas en sí, los escenarios. Si primero tenéis pensada una idea, luego se va bocetando.. supongo que será mas o menos asi, pero me gustaría saber bien como detallar y tener buenos escenarios y que sigan todos una lógica ^^
yEnS
31 d+02:00 marzo, 2007 a las 1:17[…] gira un poco para ir orientándose hacia su futuro destino (la siguiente casilla calculada en la búsqueda de caminos). A cada “paso” se orienta más hacia su destino, llegando un momento en el que ya va […]
Fregocles y la desinfección del Olimpo » Entrada » Uso del suavizante, movimientos y cámaras
8 d+02:00 abril, 2007 a las 23:44