Fregocles y la desinfección del Olimpo

Descargar demo
¡Fregocles premio al Mejor Juego en el certamen ArtFutura 2006!

Escenarios paso a paso (II)

19 d+02:00 julio, 2007 - Técnico - ¡Anímate a comentar!

En la anterior entrada «Escenarios paso a paso«, se abordó el diseño conceptual y artístico de esos mundos griegos por los que nuestro personaje decide pasear cada vez que pulsamos «Nuevo» o «Cargar». Ahora nos centraremos en los problemas técnicos que fueron apareciendo en la implementación del modelo 3D en el motor de la aventura.

Cada escenario del juego posee, a parte de lo que es el modelo 3D y sus texturas, una serie de propiedades y entidades que deben definirse mediante un editor de niveles. Como no se tenía tiempo ni ganas de crear un editor propio, hubo que ceñirse a la limitada información que proporcionaba el exportador del programa 3D usado y completarla mediante archivos de texto.

Usando el nombre de los objetos

Tras la exportación al formato .B3D desde el programa de modelado (del que ya se comentó alguna limitación en este post), se pierde toda la información sobre las cámaras o luces, así como la metainformación de los objetos (que podría asignarles propiedades específicas como ser colisionables o animables). Lo único práctico con lo que se contaba tras la exportación era el nombre asignado a los objetos.

De forma que para poder exportar algo de información interesante en el caso de las cámaras y luces, se usaron objetos pivote (dummies, que sí se exportaban) y diferentes palabras o caracteres clave, que insertadas en el nombre de los objetos permitían al engine reconocer su naturaleza (luces, cámaras, etc.)

Las palabras clave son:

  • «Luz» + número: Para indicar la posición de las luces puntuales (luces en tiempo real, que afectan únicamente al personaje).
  • «LuzAmbiente» y «LuzAmbienteP«: En este caso, se usan dos objetos para indicar el vector dirección de la luz ambiente (la del sol, luna…).
  • «Cámara» + número y «CámaraP» + número: Posición y vector dirección de las diferentes cámaras de la escena.
  • «Salida» + número: Para las diferentes ubicaciones en las que puede aparecer Fregocles al entrar en la escena.
  • «Objeto» + número: Define los objetos que tienen un script asociado, ya sea para cogerlos, usarlos, animarlos, etc.

Los caracteres:

  • Ejes de coordenadas«/«: Colocado en el nombre de cualquier objeto, lo hace colisionable para Fregocles. En la entrada sobre la búsqueda de caminos ya se habló de las colisiones en los ejes X y Z. En este caso se refiere a la colisión de Fregocles con el suelo, para saber a que altura tiene que estar, se podría decir que es la colisión con el eje Y. Es la que le hace subir rampas o escaleras, o simplemente evita que se caiga al infierno más profundo.
  • «*«: El asterisco hace a un objeto sensible al ratón. De forma que al hacer click encima, Fregocles se acercará lo más posible. No tienen que ser necesariamente objetos que se reconozcan en la frase de acción (Ir a maceta), por ejemplo, todo el suelo tiene esta característica para poder andar por él y en ningún momento se identifica Ir a suelo.

Nombres de objetos
En la imagen de ejemplo (extracto de un escenario de la primera parte del juego) podemos ver los siguientes nombres de objetos:

  • «Cámara03» y «CámaraP03«: Dummies que definen el vector de la camara 3.
  • «Colisión*/«: Objeto no visible que define el suelo de la escena. Se utilizó un objeto diferente a los visibles (la tierra y las baldosas) para suavizar el terreno y usar menos polígonos en la detección de colisiones. Además, tiene el carácter «*», de forma que detecta cuando se hace click encima para mover al personaje a ese punto.
  • «Salida01«: Fregocles puede aparecer en esa posición y con esa orientación al entrar en la escena. En este caso no necesitamos un vector para definir la orientación, con el ángulo del objeto nos basta.
  • «Objeto023*«: Otro objeto no visible que identifica al objeto «matojo». Se usa un cubo transparente para simplificar la detección del objeto y que no sea complicado seleccionarlo. No detecta la colisión ya que un simple matojo no impide que Fregocles pase por encima. Al tener la palabra «Objeto», tiene la posibilidad de ejecutar scripts; de forma que puede mirarse, usarse, cogerse, etc.

Completando la información

Para terminar de completar la información que se escapaba a la exportación y los nombres de objetos, se usaron ficheros de texto plano (ASCII). Ahora que XML se usa hasta en la sopa, algún espabilado podrá decir «¿y por qué no usaron XML que es mejor y más chachi?» y nosotros diremos «¡mirad! ¡¡un ñu con tres cabezas!!» … ejem… En fin, hay muchas mejoras en mente para el engine, algunas realizables ahora, otras para más adelante.

A continuación la lista de archivos más importantes que acompañan a cada escena (no tienen extensión):

  • ambient: Contiene una lista de las luces en tiempo real y el color de cada una.
  • ===Ambiente===(r,g,b)
    99
    120
    187
    ===luz01===(Rango,r,g,b)
    20
    125
    25
    45

  • cameras: Matriz que determina que cámara enfoca a Fregocles en las distintas zonas del escenario.
  • characters: Personajes que hay que cargar en escena y sobre cuál se tiene el control.
  • collisions: Mapa de durezas para la búsqueda de caminos.
  • fovs: Contiene el FOV con el que debe enfocarse cada cámara (ya se habló algo en este post).
  • sounds: Lista de sonidos que deben cargarse para usar en la escena.
  • transitions: Marca la velocidad de transición con la que una cámara se moverá. En caso de ser 0, la transición será instantánea. Un ejemplo:
  • ["Ncam1 to Ncam2=Velocidad"]
    1 to 2=350
    3 to 4=250
    1 to 3=0
    2 to 4=0

  • objects: Lista de archivos con los scripts asociados a los objetos e información sobre el estado visual y de animación de éstos. Estos son los archivos que más información del juego contienen, todos los puzzles, conversaciones, etc. están aquí.
  • #usar
    if ( $MaderaAtrancaPuerta = 1 )
    .iracoor ( blo=1, int=0, per=-1, x=13, y=7, a=-90 )
    .muestra ( obj=31 )
    .animaper ( blo=0, int=1, per=-1, mod=3, vel=0.25, seq=5, trn=10 )
    .animaobj ( blo=1, int=1, obj=10, mod=3, vel=0.25, seq=1, trn=10, fra=0 )
    .colision ( x=12, z=6, est=0, cam=4 )
    .oculta ( obj=13 )
    endif
    if ( $SaltaMuro = 1 ) and ( $MaderaAtrancaPuerta <> 1 )
    $SaltaMuro = 1
    .iracoor ( blo=1, int=0, per=-1, x=13, y=7, a=-90 )
    .dice ( blo=0, int=0 )
    (-1)La puerta sigue cerrada
    endif

Al final el proceso de creación de una escena es algo tedioso al no tener toda la información bien centralizada en un editor, que además empaquetara todo en un sólo archivo, etc. Pero en un principio no se esperaba que el proyecto creciera tanto y seguramente el tiempo empleado en hacer dicho editor de niveles habría retardado el desarrollo hasta el infinito, como ya ocurrió en otra ocasión que quizás comentaremos en un futuro.

 

Los comentarios estan cerrados.