Translations of this page:

This is an old revision of the document!
—-

3. Primera visita al mundo real de WME

Ya hemos conocido las herramientas de wme y hemos estudiado lo básico sobre la programación(scripting). Ahora es momento de ver como se aplica todo esto al diseño del juego. Antes de empezar vamos a explicar un poco los tipos de ficheros que utiliza wme(es estrictamente necesario usar este tipo de nomenclatura para los ficheros).

*.script → Son ficheros que contienen el código del programa.

*.inc → Son ficheros que se podrán incluir en los ficheros .script con la clausula #include.

Normalmente estos ficheros tienen cientos de lineas de código, que de otra forma tendríamos que escribir cada vez que las necesitáramos. El primer ejemplo de esto, es el fichero “data\scripts\base.inc”. Este fichero se incluye prácticamente en todos los scripts. El contenido de estos ficheros es el mismo que los .script, con la particularidad que podremos incluirlos en otros ficheros.

*.scene → Son ficheros que incluyen la información de las escenas definidas en el editor de escenas. Es posible crear este fichero a mano, pero es mas recomendable usar el editor de escenas, te facilitarás el trabajo.

*.sprite → son ficheros donde se almacena la información de los sprites, como vimos en el primer capitulo, los sprites eran por decirlo de algún modo, una especie de animaciones, que se creaban con el editor de sprites. También es posible crear estos ficheros a mano pero es más engorroso.

*.actor → Son ficheros donde se definen los actores, y las animaciones de estos.

*.entity → En estos ficheros se definen las entidades.

*.font → Son ficheros donde se definen las fuentes que vamos a usar en el juego, admite de dos tipos, tipo mapas de bits y tipos true type.

*.windows → Son ficheros donde se definen las interfaces del juego, por ejemplo: menús, paneles, etc.

*.image → Son ficheros que almacenan imágenes, con la capacidad de crear repetición(mosaicos), estos ficheros son muy útiles para inventarios.

*.button → Son ficheros que definen como son los botones, por ejemplo los botones de los menús.

Recomendación: Lo mejor es coger cada uno de estos archivos de la demo incluida en wme, e investigarlos, y exprimirlos, para aprender a conocerlos. Quizá cuando acabe con la traducción, haga unos tutoriales explicando mas a fondo estos ficheros.

Aparte de estos tipos de ficheros, wme presenta unos archivos especiales, a los que es posible cambiar sus nombres, pero estos son los nombres que se crean por defecto:

default.game y startup.setting → Son creados por el administrador de proyectos y almacenados en la carpeta principal del proyecto, en ellos se almacenan las características del juego, y las opciones iniciales.

String.tab → Se almacena también en la carpeta principal del proyecto, y contiene las tablas de cadenas de caracteres para los distintos idiomas. Por si queremos tener un juego en varios idiomas.

items.items → Contiene la declaración de los objetos del inventario que se usarán a lo largo del juego. Se almacena en la carpeta “data\items”.

responses.def → En este fichero se almacena como se ve la ventana de dialogo en las conversaciones de los personajes. Se almacena en “data\interface”.

inventory.def → En este fichero se define el aspecto de la caja del inventario de nuestros personajes. Se guarda en “data\interface”.

Como comente antes, os recomiendo que vayáis explorando estos ficheros, y os familiaricéis con ellos.

Pero dejemos esto de lado, y empecemos con la cosa mas simple – el ajuste de la escena. Si exploramos el contenido de alguna escena ya creada en el explorador del administrador de proyectos, veremos que todas las escenas contienen un fichero .scene, y una carpeta llamada scr que contiene un fichero llamado scene_init.script

Nota: en los ejemplos que vienen con wintermute hay mas ficheros, pero en esencia, una escena con lo mas básico tiene esos dos ficheros.

Bien pues internamente, wme lee el fichero de escena (.scene), y prepara todo tal y como esta definido en el fichero de escena, posteriormente carga todos los ficheros .scripts que participan en la escena, y automáticamente ejecuta el fichero llamado scene_init.script. Este fichero lo que hacer es ejecutar todas las acciones necesarias cuando se carga la escena, por ejemplo:

Si quieres que tu personaje al entrar a una escena que es muy oscura diga “oju! Que oscuro esta esto!”, pues esto deberemos definirlo en este fichero, así pues vamos a analizar y a comentar este fichero( scene_init.script ).

#include “scriptsbase.inc” 
 
//Ahora definimos las opciones iniciales de la escena 
 
actor.SkipTo(733,562); // Posicionamos al actor en un punto de la escena 
actor.Direction=DI_DOWN;// Hacemos que el actor mire hacia una direccion 
actor.Active=true;// Hacemos el actor visible dentro de la escena 
 
//Ahora definimos el estado de la escena 
 
global StateWarehouse;//Creamos esta variable para almacenar el estado actual de la escena 
 
//Comprobamos el estado de la variable que hemos creado, si no tiene valor, se lo agregamos 
if(StateWarehouse==null) 
{ 
	StateWarehouse.Visited=false; /* Creamos un atributo para la variable de estado  
                                        llamada Visited y le damos el valor falso, ya que  
                                        aun no hemos visitado la escena */ 
} 
 
if(!stateWarehouse.Visited) // Si no hemos visitado la escena 
{ 
	StateWarehouse.Visited=true; /* Le damos el valor true a escena, si entramos en ella 
                                         y nunca antes la habíamos visitado*/ 
//Esta es la primera entrada en la escena 
} 
//Aquí acaba el fichero scene_init.script

Quizás pienses que este script es una locura solo para comprobar si hemos visitado una escena o no, pero créeme, hay mas de lo que parece a simple vista. Este script que puede ofrecer muchas posibilidades, desde que el juego empieza, es necesario registrar las escenas que vamos visitando. Por ejemplo esas aventuras que cuando entras a una escena y explota un puente. El puente solo explota una vez, no cada vez que entremos, por eso es necesario y útil este script, y es recomendable entenderlo para poder diseñar aventuras bien construidas.

Bien cuando entendemos este script, en realidad lo que hace es algo muy simple.

Bueno como hay miles de métodos diferentes, he decidido coger el camino fácil y explicarlos conforme vayan saliendo.( palabras del creador original de la guía, con el tiempo quiero construir un pequeño manual de todos los métodos, atributos y eventos de los que nos provee wme).

Analicemos el script del ejemplo anterior linea por linea:

Ya sabemos que los objetos tienen sus métodos, que son llamados mediante:

nombre_objeto.nombre_metodo();

Nuestra linea a analizar es la siguiente:

actor.SkipTo(733, 562);

Pues bien, en esta linea llamamos al método skipTo() de nuestro objeto actor.

“actor” es una variable global de tipo Object que contiene a nuestro actor, y que es declarada en un script diferente. Ahora alguien se levantará y me dirá: he tu mentiroso, tu dijiste que había que definir cada variable global antes de usarla. Y yo le respondo, es verdad, esta ahí, pero no se ve, ya que va incluida en el fichero base.inc que incluimos en la primera linea. Veis la potencia del include? No tienes que declarar el actor en cada script, simplemente incluye este fichero al principio del script, y el programa se encargará del resto.

Bueno, volvamos a nuestro objeto actor y analicemos los métodos y atributos que hemos usado, y añadiremos dos mas realmente útiles:

Actor.SkipTo(x,y); → Establece al actor en una posición determinada de la pantalla. Asegúrese que esta posición esta dentro de la pantalla y ademas este dentro de una region activa.

actor.Direction= vista; → Es un atributo que establece la dirección hacia la que mira el actor, vista puede tener ocho valores posibles( DI_UP, DI_DOWN, DI_LEFT, DI_RIGHT, DI_UPRIGHT, DI_UPLEFT, DI_DOWNRIGHT, DI_DOWNLEFT )

actor.Active= true / false; → Este atributo es común a todos los nodos, hacen que estos estén activos o inactivos(visibles o invisibles).

actor.GoTo(x,y); → Este método hace que el actor camine a las coordenadas especificadas como parámetros.

actor.Talk(“texto”);→ el actor dice lo que se le pase por parámetro.

Nota: Recordad siempre que wme hace distinción entre mayúsculas y minúsculas.

Bien, lo mejor es probar estos métodos en la practica,trabajemos sobre nuestro scene_init.script, luego si abrimos el proyecto con el que estábamos trabajando, en el capítulo 1.3. Editor de Escenas, si lo recordábamos, hablábamos de este fichero, y además incluso lo modificamos, pues ahora lo veremos mas a fondo.

Bien, para abrir este archivo, debíamos ir a data–> scenes → warehouse(que es el nombre con el que la guardábamos)–>scr, aquí podemos localizar nuestro fichero scene_init.script. A partir de ahora, cuando hable de este fichero, deberías saber localizarlo fácilmente. Cada escena dispone de su fichero scene_init.script.

Abre este fichero haciendo doble clic sobre el, y localiza la linea que dice:

actor.Active = true;

y añade estas lineas tras ella:

actor.GoTo(365,561);  
actor.Direction = DI_DOWN;  
actor.Talk("¡Que bonito almacén");

Ahora deberíamos tener este resultado en el fichero scene_init.script:

#include “scriptsbase.inc” 
 
//ahora definimos las opciones iniciales de la escena 
 
actor.SkipTo(733,562); // posicionamos al actor en un punto de la escena 
actor.Direction=DI_DOWN;// hacemos que el actor mire hacia una dirección 
actor.Active=true;// hacemos el actor visible dentro de la escena 
actor.GoTo(365,561);  
actor.Direction = DI_DOWN;  
actor.Talk("¡Que bonito almacén!"); 
 
//ahora definimos el estado de la escena 
 
global StateWarehouse;//creamos esta variable para almacenar el estado actual de la escena 
 
//comprobamos el estado de la variable que hemos creado, si no tiene valor, se lo agregamos 
if(StateWarehouse==null) 
{ 
	StateWarehouse.Visited=false; /* creamos un atributo para la variable de estado 
                                       llamada  Visited y le damos el valor falso, ya que aun  
                                       no hemos visitado la escena */ 
} 
 
if(!stateWarehouse.Visited) // si no hemos visitado la escena 
{ 
	StateWarehouse.Visited=true; /* le damos el valor true a escena, si entramos en ella,  
                                        ya que nunca antes la habíamos visitado*/ 
//esta es la primera entrada en la escena 
}

Guarda el fichero y ejecuta el juego desde el administrador de proyectos. Antes de continuar, hablemos un poco de uno de los aspectos mas importantes a la hora de programar juegos en wme. Wme genera un fichero llamado wme.log y que guarda en la carpeta principal del proyecto. Este es un fichero donde se registran todos los errores que puedan tener los scripts, ademas de otras cosas.

Por ejemplo, si tienes un error en un script, el compilador mostrará un mensaje de error en la pantalla, pero en el fichero wme.log se genera una linea de error diciendo que script lo generó, y en que linea del script. Recomiendo que aprendas a controlar esto, porque te ahorrara muchísimo tiempo, date cuenta que si te dicen el archivo que genera el error y la linea en la que lo genera, solo tendrás que buscar esa linea, e investigar que paso.

Ok, sigamos adelante, si ejecutasteis el juego, al hacerlo pudisteis ver que nuestro personaje se situaba delante de las cajas, y decía la frase “¡Que bonito almacén!”, pues eso lo conseguimos con estas dos lineas:

actor.GoTo(365,561); // hace que el actor ande hacia las cajas 
 
actor.Talk("¡Que bonito almacen!"); //hace que el actor diga "¡Que bonito almacén!"

Bien hagamos algo para interactuar con la escena. Abre la escena warehouse en el editor de escenas, selecciona la entidad de región de la puerta, que habíamos creado en el capitulo 1.3, y presiona sobre el botón de scripts(1), y en la nueva ventana, pulsa sobre new script(2).

1

2

En la siguiente ventana, selecciona como plantilla(template) empty.script en la lista de la izquierda, y después presiona ok.

Este proceso crea un fichero vacío llamado door.script y lo almacena en el directorio scr de la escena a la que pertenezca, en este caso sera warehouse. Este archivo que hemos creado esta directamente relacionado con las puertas de nuestra escena, es decir, a partir de ahora podremos interactuar con este objeto gracias al script que hemos creado. Salva la escena.

Ahora vete a la carpeta scr de nuestra escena, y abre el fichero que acabamos de crear, dependerá del nombre que le disteis a la entidad en el capitulo 1.3 pero supongo que le pondríais de nombre puerta, o door, luego el fichero que hemos creado tendrá uno de esos nombres.

Bien, en ese archivo podremos ver lo siguiente:

#include "scripts\base.inc"  
  
////////////////////////////////////////////////////////////////////////////////  
//on "event"  
//{  
//  ...  
//}

Como puedes ver, no tiene mucha funcionalidad. Simplemente aparece la clausula #include con nuestro viejo amigo el fichero base.inc, pero aparte de esto no dispone de ningún tipo de funcionalidad. Necesitamos añadir algo. Bien, lo que vamos a añadir es un evento.

Eventos

Antes de continuar, hagamos un pequeño inciso para explicar que son los eventos. Los eventos tal y como su palabra indica, son cosas que ocurren durante el juego, por ejemplo un click de ratón es un evento. Los eventos son muy útiles, ya que principalmente son la vía por la que el jugador se comunicara con el juego para que se realicen acciones.

Un ejemplo muy básico, cuando hacemos un click con el botón izquierdo del ratón sobre un punto de la pantalla, el personaje debería ir hasta ese punto, pues en Wme tenemos una serie de eventos predefinidos, de momento vamos a ver cinco eventos:

on “LeftClick” - Cuando pulsamos el botón izquierdo del ratón sobre algún nodo.

on "RightClick" - Cuando pulsamos el botón derecho del ratón sobre algún nodo.

on "MiddleClick"- Cuando pulsamos el botón central del ratón sobre algún nodo.

on "LeftDoubleClick" - doble clic del botón izquierdo del ratón sobre algún nodo.

on "RightDoubleClick" - doble clic del botón derecho del ratón sobre algún nodo.

Nota: un nodo es cada uno de los elementos en wme( entidades, regiones, objetos, actores,…)

Bien, ya hemos hablado un poco de los eventos, sigamos con el ejemplo donde lo habíamos dejado.

Abramos nuestro script de la puerta situado en la carpeta scr de nuestra escena.

Elimina del script las lineas:

////////////////////////////////////////////////////////////////////////////////  
//on "event"  
//{  
//  ...  
//}

y agreguemos lo siguiente:

on "LeftClick"  
{  
        actor.Talk("'¡He pulsado sobre la puerta!");   
}

Si analizamos estas lineas, como ves lo que hacemos es crear un evento para cuando pulsemos el botón izquierdo del ratón sobre este objeto.

on “LeftClick” 
{  
        actor.Talk("'¡he pulsado sobre la puerta!");   
}

Y todo lo que se encuentra entre llaves, serán las lineas de código que se ejecutarán cuando hagamos un click con el botón izquierdo del ratón sobre este objeto, en este caso a puerta. Como ves, en este caso lo único que hacemos, es que el actor(nosotros) diga “¡he pulsado la puerta!”. Podemos poner cientos de lineas, pero eso ya dependerá de lo que nosotros necesitemos.

Es posible agregar mas de un evento en un mismo script.

Bueno si después de añadir esas lineas al script ejecutaste el juego, y hiciste un click con el botón izquierdo del ratón sobre las puertas, comprobarás que realmente funciona, y que cuando lo haces nuestro personaje nos dice: “He pulsado sobre la puerta”. Fantástico, verdad sigamos.

Otra particularidad que tiene el aplicar un script a un nodo, es que puedes modificar o consultar las propiedades de ese nodo mediante la palabra reservada this. Veamos un ejemplo:

Modifica la linea que creamos antes( actor.Talk("'¡he pulsado sobre la puerta!"); ) de la siguiente manera:

actor.Talk(this.Name);

Si guardas el script, y ejecutas el juego, si vuelves a realizar click sobre las puertas, ahora nuestro personaje dice Door. ¿ te suena? Claro, es el nombre que le habíamos puesto al objeto en el editor de escenas. Como puedes ver, lo que configuramos a través del editor de escenas, es fácilmente accesible desde los scripts. Por otro lado, la palabra this en esta linea, hace referencia al objeto actor.

Veamos otro método.

actor.GoToObject(Nodo) → Este método, hace que nuestro personaje ande hacia el nodo especificado como parámetro, y una vez allí, dirija la mirada en dirección al objeto. En este caso el nodo puede ser un objeto, una región, una entidad, ….

Pero como ya sabemos, podemos usar la palabra reservada this para referirnos a este nodo. Añadamos las siguientes lineas a nuestro script de la puerta delante de la linea “actor.Talk(this.Name);” :

<code script>
actor.GoToObject(this);
<code>

Si establecimos bien las coordenadas de la puerta en el editor de escenas, y ejecutamos nuestro proyecto, veremos que al hacer clic izquierdo sobre la puerta, nuestro personaje se acercara a ella, y dirá el nombre que nosotros le indicamos en el editor de escenas cuando las creamos.


 
es/wmebook/ch3.1365521094.txt.gz · Last modified: 2013/04/09 17:24 by dongo
Recent changes RSS feed Creative Commons License Driven by DokuWiki