This shows you the differences between the selected revision and the current
version of the page.
es:wmebook:ch2 2013/04/07 18:45 | 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 657: | 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 693: | Line 696: | ||
definición de una función que contiene el bucle, pero esto lo veremos mas adelante. Solo | definición de una función que contiene el bucle, pero esto lo veremos mas adelante. Solo | ||
comentarlo, no se pueden usar bucles en los switch. | comentarlo, no se pueden usar bucles en los switch. | ||
+ | |||
Line 795: | Line 799: | ||
Como vemos, en el script anterior declaramos una variable a inicializada a 0, después tenemos | 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 | nuestro bucle while( condición). While significa mientras, luego mientras la condición que se | ||
- | encierra entre paréntesis, sea falsa, estaremos ejecutando el bucle. | + | 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 | ¿Cuando terminará el bucle? Pues terminará cuando la función Random(0,5) que esta dentro | ||
Line 830: | Line 834: | ||
misma, u otra canción. Para cosas como esta se usan los bucles infinitos. | misma, u otra canción. Para cosas como esta se usan los bucles infinitos. | ||
- | ====== 2.4 Funciones ===== | ||
+ | ===== 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. | ||