« AsÌ, yo tampoco quiero ser EspaÒol | Inicio | [XP] Propiedad colectiva del cÛdigo, tests, y coding standards »

Motor para aventuras gr·ficas en AS 2 y XML

Desde finales de Diciembre y hasta finales de febrero, he estado desarrollando un motor para la creaciÛn de aventuras gr·ficas, realizado Ìntegramente con ActionScript 2.0 .
Por requerimientos del cliente, las aventuras gr·ficas debÌan ser completamente ( tanto los objetos que aparecen en pantalla como la lÛgica del juego ) configurables desde archivos XML. Adem·s, otros requerimientos eran la utilizaciÛn de diferentes perspectivas visuales en las escenas ( la aventura gr·fica no podÌa estar completamente realizada en una sola perspectiva, tÌpicamente isomÈtrica ) y adem·s debÌa simular un "efecto de 3d" en las escenas en que fuese necesario.

Es decir, un motor en el que se carga la lÛgica de cada escena de un archivo xml, en el que debe funcionar la escena independientemente de que sea una perspectiva frontal, lateral, una habitaciÛn de dos pisos etc..., y en la que habÌa que desarrollar un sistema que permitiese al personaje pasar por delante y/o detr·s de los objetos que aparecen en pantalla ( por ejemplo una mesa en el medio de una habitaciÛn ) en funciÛn de su posiciÛn ( que claro, depende de la perspectiva ). Evidentemente, el motor se desarrollÛ antes que muchos diseÒos de escenas, por lo que debÌa ser lo suficientemente flexible como para permitir que en pantalla hubiese de 0 a n objetos, que cada uno de estos objetos pudiese estar en cualquier coordenada de pantalla ( objetos en primer plano, objetos a media distancia, objetos en lÌnea del horizonte ) y que el personaje pudiese interactuar con ellos correctamente.

Por supuesto, el motivo para realizar un motor de estas caracterÌsticas, es el hecho de poder crear numerosas aventuras gr·ficas con el mismo motor, por lo que supuestamente el esfuerzo de programaciÛn debe descender exponencialmente a medida que se van realizando aventuras gr·ficas.

Una vez programado el motor, para cada aventura gr·fica, en el departamento de la empresa al que pertenezco, desarrollamos los archivos XML en el que indicamos quÈ objetos aparecen en cada escena, y lo que ocurre al interactuar con cada uno de ellos ( cambios que se producen en ese y en otros objetos, paso de objetos a inventario, formulaciÛn de preguntas, visualizaciÛn de avisos, requerimiento de objetos de inventario etc... )

Cada cdrom, lleva unos 650 - 700 ficheros flash ( lo que supone unas 2000 animaciones/grafismos diferentes ), y tantos xml de configuraciÛn de escenas, como escenas hay en el juego ( aparte de un par de archivos xml de configuraciÛn general del juego ).
De lo que estoy m·s satisfecho es de los siguientes puntos.

1.Ninguno de estos 700 archivos fla/swf lleva una sola lÌnea de programaciÛn ( a excepciÛn del stop() final de las animaciones )

2.Debido a esto, cada archivo xml de configuraciÛn de una escena est· siendo desarrollado por personas que no tienen conocimientos de flash. ( A la hora de empezar a montar las escenas de configuraciÛn del primer cdrom, estas personas nunca habÌan abierto flash, lo que no impide que creen una escena de dificultad media en unos 20 minutos ). Evidentemente estas personas sÌ tenÌan una amplia experiencia en desarrollo de aplicaciones que incluÌan el uso de archivos XML, por lo que trabajar con este tipo de archivos no era ninguna novedad para ellos.

3. El "mÛdulo 3d" que permite que aunque la escena tenga una visualizaciÛn frontal, o lateral, o dividida en dos pisos... el personaje protagonista de las aventuras pueda pasar por delante y por detr·s de los objetos, bien sea objetos situados en primer plano, en el centro de la escena etc... De esto estoy muy satisfecho, pues dada las diferentes posibles formas de visualizaciÛn habÌa que encontrar un sistema lo suficientemente genÈrico como para funcionar en todas, y no en una sola ( Habitualmente los juegos de este tipo, se construyen con una perspectiva isomÈtrica, pues la soluciÛn al z-sorting es conocida, permite una gran reutilizaciÛn de objetos gr·ficos, algoritmos de pathfinder etc.., pero el cliente no querÌa esto, por lo que tenÌamos que encontrar la forma de hacerlo funcionar con las especificaciones dadas ).


La aplicaciÛn tiene unas 8000 lÌneas de cÛdigo ( incluyendo las necesarias para las pantallas intermedias de selecciÛn de personje, introducciÛn de datos, almacenamiento de los mismos, gestiÛn de las puntuaciones etc...)

Est· construida utilizando un diseÒo orientado a objetos( unos 65 ficheros entre clases e interfaces ) ( toda la aplicaciÛn est· construida usando POO y se arranca llamando al mÈtodo main de la clase base de la aplicaciÛn )

Esta clase base, gestiona las comunicaciones entre las dem·s clases, mediante la emisiÛn y recepciÛn de eventos, aislando asÌ unas de otras, permitiendo la m·xima independencia de cada una de ellas, de modo que una clase no se ve afectada por cambios en las dem·s.

Un ejemplo es la clase "proxy" desarrollada para el almacenamiento de los datos y puntuaciones del usuario. Actualmente, esta salvaguarda de datos se lleva a cabo mediante el uso de sharedObjects en la m·quina del usuario. AsÌ cada vez que el jugador llega a una situaciÛn en la que hay que mostrarle sus puntuaciones y almacenarlas en disco el proceso es el siguiente.

La clase base, recibe un evento desde otra clase, que le indica que el usuario ha llegado a la situaciÛn de mostrar/almacenar puntuaciones. Nuestra clase base indica mediante un evento a la clase encargada de mostrar las puntuaciones, que pinte los valores en pantalla. Cuando esta clase termina de hacerlo, no los almacena, sino que le devuelve un evento a la clase base indic·ndole que ya ha terminado de pintar los datos y que se puede proceder a grabarlos. Entonces la clase base, le envÌa un evento a nuestra clase "proxy", que se encargar· de guardar los datos. Cuando los datos estÈn salvados, le enviar· un evento a la clase base, indic·ndole que el proceso de salvaguarda est· finalizado. Y una vez recibido este evento, nuestra clase base decidir· lo que hay que hacer, si llevar al usuario a otra pantalla ( emitiendo un evento que ser· recogido por el controlador de la vista de destino ) o bien cualquier otra acciÛn. -El uso de estas clases "proxy" es muy habitual por mi parte, pues me permiten no tener que modificar nada de la aplicaciÛn en sÌ, si se produce un cambio de tecnologÌa de servidor ( ASP, PHP, JSP que es la utilizada habitualmente en la empresa, ColdFusion, ...)y se pasa de utilizar una a utilizar otra-.

Uno de los requerimientos del cliente era que la aplicaciÛn fuese f·cilmente portable a web. Cuando llegue el momento, no habr· que hacer m·s que cambiar los mÈtodos "insertData" y "receiveData" de esta clase para que en lugar de almacenar los datos en un sharedObject, llamen a cualquier tecnologÌa de servidor. ( Extender la clase y sobrescribir la parte necesaria de los mÈtodos implicados, o bien utilizar otra clase que implemente la misma interfaz ).

Cada objeto de la aplicaciÛn tiene su propia m·quina de estados, y cada objeto puede tener tantos estados y transiciones entre estados, como se le indique desde el archivo xml de configuraciÛn de la escena( un estado, dos, ......, n estados ). TambiÈn desde este archivo, indicamos quÈ efectos en otros objetos ( cambios de estado en otros objetos ) se producen al interactuar con cada objeto ( en funciÛn de cu·l sea su estado actual ).

Evidentemente, el primer cdrom fue como un parto para todos los departamentos implicados, pero una vez determinado a partir de esa experiencia el sistema de trabajo m·s adecuado, los cdroms se van haciendo a gran velocidad a pesar de las numerosas animaciones necesarias para cada uno de ellos. Adem·s, la experiencia que se va adquiriendo con cada cdrom, hace que los departamentos de guiÛn y de animaciÛn y grafismo, vayan cada vez exprimiendo m·s las posibilidades del juego, y sac·ndolas mayor provecho, haciendo que cada aventura sea m·s bonita gr·ficamente y en cuanto a nivel de animaciÛn que la anterior, y con unas "tramas" m·s complejas. Estamos todos muy satisfechos.

ø QuiÈn dijo que con flash no se podÌan hacer este tipo de cosas?

TrackBack

URL del Trackback para esta entrada:
http://ctarda.dreamhosters.com/cgi-bin/mt-tb.cgi/673

Comentarios

Enhorabuena Javier, se lo que se debe sentir al ser el responsable de crear un proyecto de este tipo dado que este fuÈ tambiÈn uno de mis sueÒos de siempre.

Los juegos que siempre me gustaron fueron las aventuras de LucasArts clasicas, como Monkey Island, Maniac Mansion, The Dig, etc... y por eso una de mis aspiraciones de siempre fuÈ realizar un motor de aventuras de este tipo con Flash.

TodavÌa no descarto el tener alg˙n dÌa el tiempo suficiente para (como mÌnimo) ponerme manos a la obra...la ilusiÛn nunca se pierde :)

Gracias Carlos,
la verdad es que ha sido duro, ha llevado mucho esfuerzo, mucho, pero ahora se ven los resultados, la creaciÛn r·pida de los cd's, etc.. y es cuando por fin tengo tiempo para pararme a pensar que he hecho algo "chulo". Y sÌ, claramente Monkey Island y Maniac Mansion han sido referencias. De hecho durante el desarrollo estuve viendo varias veces informaciÛn sobre el motor SCUMM ( en la wikipedia y por ahÌ ).

Un saludo.

Impresionante....

øSe podrÌa ver algunas pinceladas de cÛdigo???

Si que pinta impresionante, si... felicidades por el esfuerzo.

Si alg˙n dÌa lo port·is a web ya sabes, direcciÛn!! ;)

saludos,
gracias, lo siento nitro pero no puedo publicar cÛdigos pues pertenecen a la empresa. Tampoco puedo poner un pantallazo de las aventuras pues el cliente ni siquiera las ha distribuido todavÌa ( no se si esperar· a que estÈn todas terminadas ).
Y sÌ, danisan, si se porta a web, se lo enseÒarÈ a todo el mundo.

Gracias, y un saludo.

Interesante sin duda la iniciativa, me ha entrado el gusanillo a mi ... jajaja

una pregunta... como aplicaste el path_finder? Flash no es muy potente que digamos y si te pones a buscar caminos.. en fin...

Quien sabe, quizas si que me decida a hacer un motor "libre" ,... asi que lo mismo vuelvo a por consejos!! ;D;D

Saludos,
pues no utilicÈ ning˙n algoritmo de pathfinder porque en las especificaciones que me dieron, no se querÌa que si el personaje est· en un extremo de la escena, y quiere interactuar con un objeto que est· en el otro extremo, no se querÌa que con pinchar sobre el objeto el personaje se desplazase hasta el a pesar de los obst·culos que hubiese en mitad del camino. Entonces no hay pathfinder, pero lo que sÌ que hay es que cada escena est· divida en zonas, y desde el xml le indicas en cada estado a cada objeto en quÈ zona ha de estar el personaje para que el objeto estÈ activo. Es otra forma que cumple los requisitos, y ciertamente nos ahorra mucho consumo de cpu, que podemos revertir en enriquecer las animaciones y dem·s.
De todos modos, hay muchos ejemplos de pathfinder por ahÌ, un dÌa vi que sephirot habÌa hecho ( me llamÛ la atenciÛn ) un webservice con php, que te calculaba el camino y claro lo recogÌas desde flash, y mueves tu objeto. Muchas veces, aunque visualmente sea similar, dependiendo de lo que nos pidan usamos unas opciones u otras, y en este caso no hubo pathfinder ( si el juego hubiese sido completamente en isomÈtrico, lo habrÌa habido )

Un saludo.

Me parece muy interesante el proyecto en el que has trabajado y me gustaria poder verlo.

Un grupo de compaÒeros y yo estamos trabajando en un proyecto similar, pero es para fines educativos y nos gustaria obtener un poco de informacion de como manejar este tipo de aplicaciones, podrias recomendarnos algun sitio o algunos recursos para poder realizar las animaciones tercera dimension, por favor !