Differences

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


es:wmebook:ch2 2013/04/07 18:33 es:wmebook:ch2 2013/04/08 00:19 current
Line 1: Line 1:
-=====2. Guía para el sobreviviente de WME scripting=====+=====2. Guía para sobrevivir a la creación de scripts con WME=====
Line 250: Line 250:
Hemos visto lo básico de las variables, hay mucho mas sobre ellas, pero lo iremos viendo Hemos visto lo básico de las variables, hay mucho mas sobre ellas, pero lo iremos viendo
conforme vayamos avanzando. conforme vayamos avanzando.
- 
Line 377: Line 376:
Bueno ya hemos visto lo básico de los arrays, mas adelante haremos referencias a ellos para ir Bueno ya hemos visto lo básico de los arrays, mas adelante haremos referencias a ellos para ir
viendo las funcionalidades de los scripts en WME. viendo las funcionalidades de los scripts en WME.
 +
 +
Line 656: Line 657:
puede tomar un valor entre 0 y 3( debido a la función Random ). Si a es igual a 0, se ejecutan puede tomar un valor entre 0 y 3( debido a la función Random ). Si a es igual a 0, se ejecutan
las tres sentencias que se encuentran tras el “case 0:” las tres sentencias que se encuentran tras el “case 0:”
 +
 +La palabra default, indica que ese bloque se ejecutará en caso de que el valor de la variable
 +sea diferente a las de los case anteriores.
La palabra reservada break sirve para decirle a wintermute que termine de evaluar el valor La palabra reservada break sirve para decirle a wintermute que termine de evaluar el valor
Line 696: Line 700:
 +
 +===== 2.3 Bucles =====
 +
 +Hay veces en las que es necesario repetir una acción o serie de acciones mas de una vez. WME
 +proporciona varias formas de implementar esto.
 +
 +**Bucle for**
 +
 +Empezaremos con la primera forma mediante el comando for, este comando es útil si sabemos
 +exactamente el número de repeticiones que queremos realizar, veamos como imprimir por
 +pantalla 10 veces el mensaje infierno:
 +
 +<code script>
 +for( var a=0; a < 10; a= a+1)
 +{
 +  Game.Msg(“infierno");
 +}
 +</code>
 +
 +Analicemos estas lineas, el comando for se divide en 3 partes separadas por punto y coma.
 +La primera parte “var a=0” en esta linea definimos e iniciamos la variable que se usará para
 +recorrer el bucle, en este caso hemos definido una variable a y le hemos dado el valor 0.
 +
 +En la segunda parte “ a < 10 “ es la condición de fin, lo que indica es cuando terminará el
 +bucle, en este caso le hemos puesto menor que 10, luego el bucle se ejecutara mientras a sea
 +menor que 10.
 +
 +y la ultima parte “ a= a + 1” lo que indica es que la variable “a” del bucle se incrementara en
 +1 cada vez que ejecutan las instrucciones encerradas entre llaves, en este caso,
 +Game.Msg(“infierno”).
 +
 +En esta ultima parte, la de como se modifica la variable del bucle, se puede usar cualquier
 +operación, suma, resta, multiplicación, etc, y cualquier valor, es decir no es necesario que vaya
 +de 1 en 1, puede ir de 2 en 2, también es posible usar atajos, con a++ “a” se incrementará en
 +1, y con a-- “a” se decrementará en 1. Por ejemplo:
 +
 +<code script>
 +for( var a=0; a<10; a=a+2)
 +{
 +acciones;
 +}
 +</code>
 +
 +De esta forma, el bucle solo se ejecutaría 5 veces, ya que la variable del bucle se va
 +incrementando en 2 unidades cada vez que se ejecutan las acciones.
 +
 +<code script>
 +for( var a=10; a == 0; a= a--)
 +{
 +  acciones;
 +}
 +</code>
 +
 +Como vemos en este en lugar de ir del 0 hacia arriba, vamos desde un valor hacia abajo, y
 +cuando la variable cumpla la condición de fin es decir cuando “a” sea igual que 0, el bucle
 +termina.
 +
 +Una cosa importante, es el número de veces que se ejecutará el bucle, porque dependiendo de
 +la condición de fin y de la variación de la variable del bucle, el bucle se nos ejecutará ese
 +número de veces. Lo mejor es trabajar con ellos para coger soltura en el numero de
 +repeticiones que requerimos.
 +
 +Pero veamos algunos ejemplos útiles, ¿recordáis los arrays? Pues los bucles son geniales para
 +recorrerlos, y no tener que ir uno a uno obteniendo los valores del array.
 +Veamos un script de ejemplo:
 +
 +<code script>
 +var miArray;
 +miArray[0]=”hola”;
 +miArray[1]=”¿que tal?”;
 +miArray[2]=”Adios”;
 +
 +for( var a=0; a < 3;a= a + 1)
 +{
 +  Game.Msg( miArray[a] );
 +}
 +</code>
 +
 +Como puedes ver es fácil imprimir por pantalla todos los elementos de un array. Espero que
 +estéis entendiendo su uso. Trabajando con ellos veréis que es una herramienta imprescindible
 +en programación.
 +
 +**Bucle while**
 +
 +Otro tipo de bucle es el llamado while. Este bucle es usado cuando no sabemos exactamente
 +cuantas veces se tendrán que ejecutarse las ordenes incluidas en el bucle. Veamos un ejemplo:
 +
 +<code script>
 +var a =0;
 +
 +while( a != 5)
 +{
 +  a= Random(0,5);
 +  Sleep(1);
 +}
 +</code>
 +
 +Como vemos, en el script anterior declaramos una variable a inicializada a 0, después tenemos
 +nuestro bucle while( condición). While significa mientras, luego mientras la condición que se
 +encierra entre paréntesis, sea verdadera, estaremos ejecutando el bucle.
 +
 +¿Cuando terminará el bucle? Pues terminará cuando la función Random(0,5) que esta dentro
 +del cuerpo del bucle asigne a nuestra variable “a” el valor 5, ya que en la condición
 +impusimos que el bucle se ejecutara mientras “a” fuera distinto de 5.
 +
 +En este caso, la declaración y la definición de la variable del bucle, se realiza antes del bucle,
 +la condición se encuentra entre paréntesis tras la palabra reservada while, y la modificación
 +de la variable, se realiza dentro del cuerpo del bucle, así, dependiendo de lo que pase dentro
 +del bucle, este se ejecutara un número de veces, que a priori no conocíamos.
 +
 +Importante: quizás te estés preguntando que es eso de sleep(1), simplemente es una función
 +que lo que hace es desactivar el juego durante el tiempo que se le ponga entre paréntesis, en
 +este caso 1 mili-segundo, esto es para evitar, que el bucle se coma todo el procesador y no deje
 +paso a los demás procesos del equipo, lo que hace que todo se relentice y pueda dar
 +problemas, es muy habitual usarlo en programación, pero hablaremos de el mas adelante.
 +
 +**Bucles infinitos**
 +
 +ejemplo:
 +
 +<code script>
 +while(true)
 +{
 +  acciones;
 +  Sleep(1);
 +}
 +</code>
 +
 +Este es un bucle en el que la condición siempre es verdadera, por lo que siempre estará
 +ejecutándose, es muy común usar estos bucles en procesos de fondos, por ejemplo para la
 +musica, usas en el while una condición que compruebe si la música se esta reproduciendo o si
 +esta parada, si esta en play no hace nada, pero si no lo esta, podremos volver a reproducir la
 +misma, u otra canción. Para cosas como esta se usan los bucles infinitos.
 +
 +
 +
 +
 +===== 2.4 Funciones =====
 +
 +Como ya hemos visto en el caso de Sleep() y Random(), hay una serie de herramientas
 +llamadas funciones. Con las funciones tenemos una buena forma de ahorrar tiempo, ya que si
 +tenemos que hacer algo varias veces a lo largo del juego, es tedioso tener que escribir el mismo
 +código varias veces.
 +
 +Imagina el siguiente ejemplo: Se quiere imprimir 10 veces la palabra hola, pero quieres que
 +esto pase varias veces seguidas, sería tedioso hacer:
 +
 +<code script>
 +for(var a=0; a < 10; a=a+1) Game.Msg(“hola”);
 +for(var a=0; a < 10; a=a+1) Game.Msg(“hola”);
 +for(var a=0; a < 10; a=a+1) Game.Msg(“hola”);
 +….
 +</code>
 +
 +Para esto podríamos crear una función:
 +
 +<code script>
 +function hola()
 +{
 +for(var a =0; a<10;a++)
 +{
 +Game.Msg(“hola”);
 +}
 +return ;
 +}
 +hola();//imprime 10 veces en pantalla el mensaje hola
 +hola();//imprime 10 veces en pantalla el mensaje hola
 +hola();//imprime 10 veces en pantalla el mensaje hola
 +</code>
 +
 +¿Veis? esto simplifica el código. Una función es una pieza de código reutilizable, se define
 +como sigue:
 +
 +<code script>
 +function nombre_de_la_funcion(parametros)
 +{
 +  codigo de la funcion
 +}
 +</code>
 +
 +El fin de la función es cuando se encuentra la palabra reservada return que en ciertos casos
 +podrá devolver algún dato que utilizaremos para controlar el programa.
 +
 +Pero una función como la del ejemplo anterior no tiene mucha funcionalidad, la funcionalidad
 +se amplia cuando empezamos a hacer uso de los parámetros. Por ejemplo una modificación
 +del ejemplo anterior con mayor funcionalidad es el siguiente:
 +
 +<code script>
 +function escribeTexto(texto, contador)
 +{
 +  for( var a=0; a< contador; a++)
 +  {
 +    Game.Msg(texto);
 +  }
 +}
 +
 +escribeTexto(“hola”,10); // se muestra 10 veces hola en pantalla
 +var b=5;
 +escribeTexto(“ring! Ring!” , b); // se muestra 5 veces por pantalla ring! Ring!
 +</code>
 +
 +Como veis, mediante los dos parámetros texto y contador, le damos mucha funcionalidad a
 +nuestra función, ya que cuando queramos imprimir en alguna parte del juego un texto
 +repetidas veces en la pantalla podremos hacer uso de esta función, y no tener que hacer un
 +bucle cada vez que queramos realizar dicho propósito.
 +
 +En la función escribeTexto(texto, contador), las variables texto y contador solo serán validas
 +dentro del cuerpo de la función, por lo que solo podremos usarlos dentro de la función, y no
 +fuera.
 +
 +Bueno hemos visto como pasar datos a la función para que trabaje, pero ¿como hacemos para
 +que la función nos devuelva un valor con el que poder trabajar?
 +
 +Por ejemplo en la función Random(a,b) la función nos devuelve un valor comprendido entre
 +“a” y “b”, Esto se realiza con la palabra return que indica que es lo que nos devolverá la
 +función, veamos un ejemplo:
 +
 +<code script>
 +function esMayor(number1,number2)
 +{
 +  var mayor=false;
 +  if(number1>number2)
 +  {
 +    mayor=true;
 +  }
 +  return mayor;
 +}
 +
 +esMayor(5,1);//esta funcion devuelve un true
 +esMayor(2565,5678); //esta funcion devuelve un false
 +</code>
 +
 +Como podemos intuir,, esta función comprueba el si el number1 pasado como parámetro, es
 +mayor que el number2, si esto es cierto, entonces cambia el valor de la variable a true,
 +mientras que si no es cierta, el valor de la variable mayor sera false como le dimos al
 +declararla, una vez que ha ejecutado todas las sentencias y llega a la palabra return, la
 +función, coge el valor que tiene la variable mayor y nos lo devuelve, este valor podríamos
 +almacenarlo en una variable, y trabajar posteriormente con el.
 +
 +En este caso al tratarse de un valor booleano lo que devuelve la función, podríamos por
 +ejemplo emplearlo en condiciones directamente, veamos un ejemplo:
 +
 +<code script>
 +if( esMayor(5,1) )
 +{
 +  Game.Msg(“el numero es mayor”);
 +}
 +else
 +{
 +  Game.Msg(“el numero es menor”);
 +}
 +</code>
 +
 +Como veis hemos metido una función que devuelve un valor booleano dentro de una condición,
 +conforme practiquéis, aprenderéis rápidamente como usar funciones con bucles, condiciones,
 +parámetros, arrays, etc. Llegará un momento en que aprenderéis a enlazar unas cosas con otras
 +y crear buenos trozos de código.
 +
 +**Sexta regla de sintaxis**
 +
 +Los nombres de funciones, solo pueden contener caracteres alfanuméricos, y sin espacios entre
 +caracteres. Ejemplos de nombres:
 +
 +<code script>
 +escribirNumero() // correcta
 +reproducirSonido5() // correcta
 +escribir_Numero() // correcta
 +reproducir_Sonido() // correcta
 +escribir Numero() // incorrecta
 +reproducir*Sonido() // incorrecta
 +</code>
 +
 +Debemos tener todo claro hasta este punto, si no es así, por favor revisa los capítulos
 +anteriores y podrás continuar sin problemas. Si algo no queda muy claro preguntad en foro
 +oficial y se contestará o se intentará modificar para aclararlo.
 +
 +
 +===== 2.5 Clausula include =====
 +
 +Como hemos visto, las funciones ofrecen mucha potencia al programa, pero como no existe
 +ninguna manera de declarar una función global, como hacíamos con las variables, hay de
 +hacer que las funciones que están en un script, se puedan usar en otros scripts, para ello hay
 +dos maneras de hacerlo, mediante la palabra reservada includes, o mediante objetos. Pero
 +primero veamos como se usa include.
 +
 +Si has echado un ojo a la demo de WME abras visto que cada script comienza con la linea:
 +
 +<code script>
 +#include “scripts\base.inc”
 +</code>
 +
 +Con esta linea, lo que estamos haciendo, es decir que queremos incluir este archivo de scripts
 +en el script donde estamos trabajando, en este caso estamos incluyendo el archivo base.inc que
 +tendrá una serie de funciones, variables, o trozos de código que podremos usar también en el
 +script donde lo incluyamos. Por ejemplo, si no quieres declarar tus variables globales cada vez
 +que las necesitas, puedes crear un fichero inc donde estén todas las variables globales
 +definidas, y ya con solo incluir este fichero con la palabra include, no tenemos que andar
 +escribiendo la declaración de las variables globales cada vez que vayamos a usarlas. También
 +es posible hacer esto con funciones, creas un fichero inc con las funciones, y después lo
 +incluiremos con la palabra reservada #include “ruta_y_nombre_del_archivo.inc”.
 +
 +Así no tendremos que copiar el código de la función en cada script donde queramos usarlo.
 +
 +**Nota:** fíjate que la linea #include “scripts/base.inc” no lleva punto y coma al final, y el nombre
 +y la ruta del archivo van entre comillas.
 +
 +Importante: no inicialices nunca las variables en el fichero a incluir, ya que si haces eso, estas
 +se inicializarán cada vez que hagas una llamada a un script que incluya ese fichero.
 +
 +
 +
 +===== 2.6 Objetos =====
 +
 +Veamos ahora lo que aporta la mayor funcionalidad a WME, los objetos, bien, empecemos
 +despacio, imagina que tienes un objeto de la vida real, por ejemplo, una mesa. Pero claro el
 +termino mesa no nos dice nada, es abstracto, ya que la mesa puede estar echa de plástico, de
 +madera, de metal, puede tener distintos colores, puede ser cara o barata, etc tiene muchas
 +propiedades, quizá nos convendría tener todas estas propiedades juntas para una mesa.
 +
 +<code script>
 +var mesa;
 +mesa.material=”madera”;
 +mesa.color=”negro”;
 +mesa.precio=100;
 +Game.Msg(mesa.precio); //se imprimirá el precio de la mesa por pantalla.
 +</code>
 +
 +Bien, lo que hemos echo aquí, es definir una variable pero en lugar de acceder a esta variable
 +directamente, hemos agregado una serie de atributos a la variable, ya no usamos la variable
 +como un contenedor de un valor, sino que lo usamos para almacenar varias cosas, es muy
 +parecido a los arrays pero en lugar de acceder por la posición, accedemos por un nombre de
 +atributo. En el ejemplo anterior accedimos al atributo precio del objeto mesa.
 +
 +<code script>
 +Game.Msg(mesa.precio);
 +</code>
 +
 +Seguro que estarás pensando esto es fantástico y maravilloso, pero si quiero crear 10 mesas,
 +¿necesito declarar 10 variables como esta? No, Seria muy tedioso.
 +Bien, la magia de los objetos no solo reside en sus atributos, sino que también se pueden
 +definir funciones para los objetos, todo el tiempo hemos estado trabajando con un objeto,
 +Game.Msg() y ahora acabas de descubrir que este método, es un método del objeto Game.
 +
 +WME trabaja mucho con objetos, y conforme te adentres en su funcionamiento, más te darás
 +cuenta de lo importantes y útiles que son.
 +
 +Bien, veamos como definir un objeto para algo mas de utilidad que para almacenar atributos.
 +
 +Bien primero crearemos un fichero donde definiremos un objeto, le llamaremos por ejemplo
 +mesa.script
 +
 +<code script>
 +#include “scripts\base.inc”
 +method initialize(material, color, precio)
 +{
 +  this.material=material;
 +  this.color=color;
 +  this.precio=precio;
 +}
 +</code>
 +
 +**Septima regla de sintaxis**
 +
 +Si quieres acceder al atributo o funcion de un objeto, usamos un punto como hemos visto en
 +los ejemplos anteriores.
 +
 +Usamos la palabra this, ya que como no sabemos a priori como le llamaremos al objeto, pues
 +this, es una palabra reservada para referirse al objeto el cual estamos creando.
 +
 +Esta es la manera correcta de definir la inicialización de un objeto.
 +
 +Veamos ahora una vez que hemos definido el objeto mesa.script como crear un objeto de este
 +tipo.
 +
 +<code script>
 +Var mesa1 = new Object(“mesa.script”);
 +</code>
 +
 +De esta manera creamos un objeto de tipo mesa, ahora podemos definir sus propiedades
 +llamando al método iniciar que creamos en el archivo mesa.script de la siguiente manera:
 +
 +<code script>
 +mesa1.iniciar(“madera”,”negra”,100);
 +</code>
 +
 +De esta manera en nuestra mesa ya quedarán definidos sus tres atributos, pudiendo acceder a
 +ellos con el nombre_del_objeto.nombre_del_atributo:
 +
 +<code script>
 +mesa1.material:
 +mesa1.color;
 +mesa1.precio;
 +</code>
 +
 +Podemos ir mas allá, veamos por ejemplo como crear 10 objetos de tipo mesa usando un bucle:
 +
 +<code script>
 +for( var a=0;a <10;a++)
 +{
 +mesas[a]= new Object(“mesa.script”);
 +}
 +</code>
 +
 +Aquí tenemos que tener cuidado, ya que no podemos hacer mesas[a].iniciar(material,color,precio);
 +ya que WME no soporta esto, para solucionarlo debemos hacer uso de una variable temporal, que
 +almacene cada objeto, lo inicialice y después lo vuelva a almacenar en el array.
 +
 +<code script>
 +var temp = mesas[a];
 +temp.iniciar(“madera”,”negra”,100);
 +mesas[a]=temp;
 +</code>
 +
 +Con estas tres lineas, obtenemos una de las mesas del array, la iniciamos, y después la
 +volvemos a guardar en el array, esto es necesario ya que como hemos dicho wme no soporta el
 +acceso a los atributos o métodos de los objetos guardados en un array.
 +Y ya solo se trata de practicar por unos mismo, y seguir con el tutorial que a partir de aquí
 +creo que con esto no tendrás problemas para entender lo siguiente.
 +
 +También es posible crear mas métodos para el objeto mesa, simplemente, en el fichero mesa.script
 +que habíamos creado, podemos añadir un método por ejemplo para cambiar el color de la mesa. Pues
 +añadiremos en el fichero del objeto mesa el siguiente método:
 +
 +<code script>
 +method cambiarColor(color)
 +{
 +  this.color=color;
 +}
 +</code>
 +
 +Y cuando creemos un objeto de tipo mesa, podremos cambiar el color de la mesa usando este método.
 +
 +<code script>
 +var mesa = new Object("mesa.script");//creamos el objeto
 +mesa.iniciar("metal","roja",300);// iniciamos sus valores
 +Game.Msg(mesa.color);//se imprimirá en pantalla roja
 +mesa.cambiarColor("azul");//cambiamos el color
 +Game.Msg(mesa.color);//se imprimirá en pantalla azul 
 +</code>
 +
 +De esta manera podemos crear métodos para los objetos.
 +
 +**Nota:** Método y función vienen a ser prácticamente lo mismo, con la diferencia principalmente de
 +que las funciones tienen funcionalidad por si solas, y los métodos siempre actúan sobre algún objeto.
 
es/wmebook/ch2.1365352400.txt.gz · Last modified: 2013/04/07 18:33 by dongo
Recent changes RSS feed Creative Commons License Driven by DokuWiki