Differences

This shows you the differences between the selected revision and the current
version of the page.


es:wmebook:ch3 2013/04/09 17:55 es:wmebook:ch3 2013/04/10 20:13 current
Line 50: Line 50:
<code script> <code script>
-#include “scriptsbase.inc”+#include “scripts\base.inc”
//Ahora definimos las opciones iniciales de la escena //Ahora definimos las opciones iniciales de la escena
Line 429: Line 429:
} }
</code> </code>
 +
 +Bien, veamos que esta ocurriendo aquí. En nuestro guion de juego, tenemos apuntado que el personaje necesita entrar en el almacén, pero la puerta esta cerrada. De alguna manera nuestro personaje tiene que saber que la puerta esta cerrada para poder continuar con la aventura, por eso, en nuestro script estamos imponiendo que tenga que hacer click en la puerta, para que podamos cambiar de escena. Mientras no hagamos click en la puerta, nuestro personaje no podrá cambiar de escena.
 +
 +Esto es debido, a que hemos impuesto en la condición que el objeto puerta tendría que estar inactivo para poder cambiar de escena, pero el objeto puerta, si nos fijamos en su script, no se pondrá inactivo hasta que no hagamos clic sobre el.
 +
 +Guarda todos los scripts, y ejecuta el juego. Prueba el juego y asegúrate que entiendes el código, y la lógica de como funciona. Este es uno de los puntos críticos en el diseño de las aventuras, ya que si no se aprende correctamente, no podremos conseguir potencia en nuestros juegos.
 +
 +Importante: un punto importante dentro de wme, son las rutas de los ficheros. Hemos visto que en:
 +
 +<code script>
 +Game.ChangeScene(“scenes\room\room.scene”);
 +</code>
 +
 +No empezamos la ruta desde la carpeta data, nunca incluiremos la raíz(data) en la ruta que usamos en las llamadas a ficheros. ¿Por que? Porque si lo incluimos, solo funcionaria mientras lo usemos en el modo depuración, una vez que lo compilemos, si ponemos la raíz en la ruta, no funcionará. Esto se aplica a todas las llamadas a ficheros. Si te ocurre esto, sufrirás pesadillas, imagina que la carpeta data es la c: y todo lo referenciamos a partir de ahí, y la carpeta data no la nombramos.
 +
 +Veamos la ultima parte de este capitulo, donde hablaremos de los daemons(demonios)
 +
 +**¿que es un demonio?**
 +
 +Un demonio no es mas que un programa interno que se encarga de ofrecer funcionalidades a un programa externo, por ejemplo cuando estamos jugando a una aventura, y de repente se lanza un vídeo, pues para que ese vídeo se pueda lanzar, es necesario un reproductor de vídeo, pues esto por ejemplo es un demonio, después también los hay para sonidos,... Aquí los veremos de pasada, y ya mas adelante los explicaremos mas a fondo.
 +
 +Antes de hablar de los daemons, veamos cuatro métodos mas:
 +
 +**Game.AttachScript(filename); →** Añade un archivo de script al juego, haciéndolo global para todo el juego. Este script estará activo hasta que se desvincule, o termine.
 +
 +**Game.DetachScript(filename); →** Desvincula un script del juego.
 +
 +**Scene.AttachScript(filename);→**  Añade un archivo de script a la escena. Este script estará activo hasta que el jugador cambie de escena, se desvincule, o termine.
 +
 +**Scene.DetachScript(filename);→**  desvincula un script de la escena.
 +
 +Claro que podemos añadir un script a la escena en el editor de escenas, o un script a Game en la carpeta script del proyect manager pero ¿y si queremos añadir un script en medio de la partida?. Pues por esto son importantes y útiles estas funciones, ahora mas adelante veremos algunos ejemplos.
 +
 +El siguiente comando que vamos a ver, es totalmente necesario para el demonio(daemon) de escritura. Se trata del comando Sleep:
 +
 +<code script>
 +Sleep(tiempo);
 +</code>
 +
 +Este script paraliza un script por un periodo de tiempo que es pasado como parámetro en milisegundos, es decir sleep(1000); pararía el script durante 1 segundo.
 +
 +Sleep tiene dos propósitos, el primero liberar al proceso, y dar paso a otros procesos en el ordenador, sino se hace esto, se pueden producir errores, incluso llegar a bloquear el pc.
 +
 +<code script>
 +var a = 0;
 +while (1) // esto es un bucle infinito
 +{
 +  a = a + 1;
 +  if (a > 100) a = 0;
 +}
 +</code>
 +
 +Nunca hagas esto, puede bloquear tu equipo. El script ocupa todo el procesador y el resto del juego podra dejar de funcionar. ¿Como solucionarlo?
 +
 +<code script>
 +var a = 0;
 +while (1)
 +{
 +  a = a + 1;
 +  if (a > 100) a = 0;
 +  Sleep(1);    // detiene el control del script durante 1 milisegundo.       
 +}
 +</code>
 +
 +Esta es la forma recomendable de programar bucles infinitos o con posibilidad de ser muy largos en wme, es decir en cada interacción del bucle, hacemos una pequeña pausa, para detener script, dejando paso a otros script en el procesador y evitando que este se sature.
 +
 +Necesitamos un comando mas:
 +
 +**Game.Msg(texto) –** esta función como ya hemos visto, nos muestra en pantalla un mensaje de depuración. Este comando es muy útil, porque nos servirá para controlar el estado de las variables y los objetos durante el modo de programación.
 +
 +Lo que vamos a hacer es añadir a nuestra escena, una serie de lineas. Cuando el personaje examina la puerta, se dará cuenta que hay una bomba, de esta manera si el personaje no se aleja de la puerta a tiempo, volveremos a cargar la escena desde el principio, esto es muy común en los juegos de aventuras cuando queremos representar que nuestro personaje a muerto.
 +
 +Primero, crearemos un nuevo script en la carpeta scr de nuestra escena llamado bomba.script.
 +
 +**Consejo:** Es posible ir a esta carpeta y crear el fichero manualmente, creamos un fichero bomba.script, y después podremos acceder a el desde el administrador de proyectos de wme, es una forma diferente de crear nuevos ficheros.
 +
 +Debemos modificar nuestro script de la puerta que veníamos creando durante este capitulo.
 +
 +<code script>
 +#include “scripts\base.inc”
 +
 +on “LeftClick”
 +{
 + Game.interactive=false; // Desactivamos el control del personajes
 + actor.GoToObject(this); // El personaje camina hacia el objeto(puerta)
 + this.Active= false; //Desactivamos la puerta
 + actor.Talk(“Oh no, hay una bomba de tiempo sobre la puerta, debo escapar antes de
 +                    que explote.”); // El actor hace un comentario
 +
 + Scene.AttachScript(“scenes\warehouse\scr\bomba.script");/*añadimos nuestro script
 +                                                                de la  bomba al juego */
 + Game.Interactive=true; // devolvemos el control del personajes
 +}
 +</code>
 +
 +Simplemente hemos modificado lo que decía nuestro actor, y hemos añadido una linea(Scene.AttachScript(“scenes\warehouse\scr\bomba.script");) que lo que hace es cargar un script en nuestro juego, de esta manera el script comenzará a ejecutarse, cuando hagamos click con el botón izquierdo sobre la puerta.
 +
 +Bien, ahora vamos a definir nuestro fichero bomba.script donde incluiremos un contador que lo que hará sera que si pasa ese tiempo y no hemos escapado, la escena se cargará desde el principio.
 +
 +Luego el script bomba.script tendrá el siguiente aspecto:
 +
 +<code script>
 +include “scripts\base.inc”
 +
 +for(var tiempo=6; tiempo>-1; tiempo = tiempo -1) /* Iniciamos un bucle que llevara la
 +                                                  cuenta desde que pulsamos la puerta */
 +{
 + Game.Msg(“cuenta atrás: “ +tiempo);//Mostramos el tiempo que nos queda
 + Sleep(1000); // Detenemos la ejecución del script durante 1 segundo
 +}
 +
 + Game.Interactive=false; //Desactivamos el control del jugador
 + actor.Talk(“estoy muerto, intentalo de nuevo); //Hacemos que el actor hable
 + Game.ChangeScene(“scenes\warehouse\warehouse.scene”);/*Volvemos a cargar la
 +                                                              escena, en esta función,
 +                                                              el parámetro se refiere al
 +                                                              archivo de escena con el
 +                                                              que estábamos trabajando,
 +                                                              debe tener el nombre que
 +                                                              nosotros le hubiéramos
 +                                                              indicado */
 +
 + var puerta = Scene.GetNode(“puerta”); //Obtenemos el objeto puerta en una variable
 + puerta.active= true; // Volvemos a hacer activa la puerta
 + Game.Interactive=true; // Devolvemos el control del jugador
 +//Fin de nuestro script bomba.script
 +</code>
 +
 +Como ves la forma de trabajar siempre es muy parecida, desactivamos el control del jugador cuando este va a realizar alguna acción y siempre lo devolvemos al final. Así que nada, tenemos escrito nuestro script de la puerta, y nuestro script de la bomba que hará que si el jugador no abandona la escena en el tiempo establecido, en este caso son 7 segundos, ya que el bucle( “for(var tiempo=6; tiempo>-1; tiempo = tiempo -1)” ) realiza 7 interacciones, desde 6 hasta 0 contando ambos.
 +
 +Espero que se vayan entendiendo los script, y es muy importante que los analicéis y lo destripéis hasta que vayáis entendiendo cada linea, de esta manera, cogeremos soltura rápidamente, ya que si pasamos de algo que no entendemos, cada vez se irán añadiendo nuevas cosas y llegara un punto en que no entendáis nada, por eso es recomendable que entendáis bien cada script.
 +
 +Bien, veamos ahora el script de la región que llamamos salida, salida.script :
 +
 +<code script>
 +#include "scripts\base.inc"
 +
 +on "ActorEntry"
 +{
 +        var puerta = Scene.GetNode("puerta"); /* Almacenamos el objeto puerta en una variable
 +                                              en este caso el parámetro “puerta” debe ser el
 +                                              nombre que le diéramos a nuestra puerta en el
 +                                              editor de escenas */ 
 +       
 + Game.Interactive = false; //Desactivamos el control del personaje
 +        if (puerta.Active) // Preguntamos, esta la puerta activa?
 +        {
 +                actor.Talk("no volveré a mi piso hasta que no sepa que no puedo entrar en el
 +                            almacén"); /* El actor realiza un comentario si no hemos echo click
 +                                          sobre la puerta */
 +        }       
 +        else //Si la puerta esta desactivada
 +        {
 +                Scene.DetachScript("scenes\warehouse\scr\bomba.script"); /* Descargamos el script
 +                                                                            de la bomba */
 +                actor.Talk("uff! Estuvo cerca"); // Nuestro personaje suelta un comentario
 +                Game.ChangeScene("scenes\room\room.scene"); //Cambiamos la escena
 +        }
 +        Game.Interactive = true;  // Devolvemos el control del jugador
 +}
 +</code>
 +
 +Guarda todos los script, y ejecuta el juego para comprobar si todo funciona correctamente.
 +
 +Para finalizar este capitulo, realizaremos un pequeño cambio juego, no es necesario pero es para que veáis como resolver lo mismo de otra forma, si os fijas, en cada script debemos hacer uso del método Game.GetNode(“puerta”); para evitar tener que hacer esto en cada script, es posible usar una variable global que guarde si la puerta fue clickeada o no, de esta manera no será necesario desactivar la puerta, y mas adelante el jugador podrá seguir interactuando con la puerta, pero si ya habíamos realizado un clic anteriormente, el script bomba no se volverá a ejecutar, dando así potencia al juego.
 +
 +Bien, veamos los cambios que debemos realizar en nuestros script para realizar lo mismo mediante una variable global.
 +
 +**bomba.script**
 +
 +<code script>
 +#include “scripts\base.inc”
 +
 +for(var tiempo=6; tiempo>-1; tiempo = tiempo -1) /* Iniciamos un bucle que llevara la
 +                                                  cuenta desde que pulsamos la puerta */
 +{
 + Game.Msg(“cuenta atrás: “ +tiempo);//Mostramos el tiempo que nos queda
 + Sleep(1000); // Detenemos la ejecución del script durante 1 segundo
 +}
 +
 + Game.Interactive=false; //Desactivamos el control del jugador
 + actor.Talk(“estoy muerto, intentalo de nuevo); //Hacemos que el actor hable
 + Game.ChangeScene(“scenes\warehouse\warehouse.scene”);/* Volvemos a cargar la
 +                                                              escena, en esta función,
 +                                                              el  parámetro se refiere
 +                                                              al archivo de escena con
 +                                                              el que estábamos trabajando,
 +                                                              debe tener el nombre que
 +                                                              nosotros le hubiéramos
 +                                                              indicado */
 +
 + var puerta = Scene.GetNode(“puerta”); //Obtenemos el objeto puerta en una variable
 + puerta.active= true; // Volvemos a hacer activa la puerta
 +
 + global puertaClicked = false; /* Esta es la nueva linea añadida, con la que
 +                                        controlaremos si la puerta fue clickeada o no.*/
 +
 + Game.Interactive=true; // Devolvemos el control del jugador
 +</code>
 +
 +**Fichero salida.script:**
 +
 +<code script>
 +#include "scripts\base.inc"
 +
 +on "ActorEntry"
 +{
 +        var puerta = Scene.GetNode("puerta"); /* Almacenamos el objeto puerta en una variable
 +                                              en este caso el parámetro “puerta” debe ser el
 +                                              nombre que le diéramos a nuestra puerta en el
 +                                              editor de escenas */ 
 +       
 + Game.Interactive = false; //Desactivamos el control del personaje
 + global puertaclicked; /* Llamamos a la variable global que almacena si la puerta fue
 +                                clikeada*/
 + if (!puertaclicked) // Con la variable global preguntamos si puertaclicked=false
 + {
 +            actor.Talk("No volveré a mi piso hasta que no sepa que no puedo entrar en el
 +                            almacén"); /* El actor realiza un comentario si no hemos echo
 +                                        click sobre la puerta */
 +        }       
 +        else //Si puertaclicked=true
 +        {
 +            Scene.DetachScript("scenes\warehouse\scr\bomba.script"); /* descargamos el script
 +                                                                            de la bomba */
 +                actor.Talk("uff! Estuvo cerca"); // Nuestro personaje suelta un comentario 
 +                Game.ChangeScene("scenes\room\room.scene"); //Cambiamos la escena
 +        }
 +        Game.Interactive = true;  // Devolvemos el control del jugador
 +}
 +</code>
 +
 +Como podemos ver, en este caso ya no es necesario hacer uso del atributo Active del objeto puerta para saber si esta fue clickeada o no, esto da la ventaja que ya comentaba antes, que la puerta puede seguir activa después de hacer el primer clic, con lo que damos la posibilidad de que se pudiera seguir interactuando con ella.
 +
 +Hemos venido trabajando con un proyecto de ejemplo muy simple,en el próximo capítulo empezaremos un proyecto desde 0, espero que hayas entendido estos capítulos anteriores porque son cruciales para seguir con lo que vamos a ver ahora.
 +
 +
 +
 +
 +
 +
 
es/wmebook/ch3.1365522909.txt.gz · Last modified: 2013/04/09 17:55 by dongo
Recent changes RSS feed Creative Commons License Driven by DokuWiki