Está en la página 1de 147

Diseando juegos con el Game Maker

versin 5.0 (Abril 14, 2003)

Written by Mark Overmars Traduccin (versin sin revisar) al espaol por: Jos Jorge Enrquez rodrguez (Geo) Carlos A. Garca Ros (Lestad) Gabriel Rojas (Faxtrax) Israel Rodrguez Nava (zurdopower) Rodrigo Espinoza Huerta (rodeh85)

Contenido
Captulo 1 As que quieres crear tus propios juegos de computadora ................... 6 Captulo 2 Instalacin.................................................................................................. 8 Captulo 3 Registro ...................................................................................................... 9 Captulo 4 La idea global .......................................................................................... 10 Captulo 5 Veamos un ejemplo ................................................................................. 12 Captulo 6 La interfaz del usuario ........................................................................... 14 6.1 Men File ...........................................................................................................14 6.2 Men Edit ..........................................................................................................15 6.3 Men Add ..........................................................................................................15 6.4 Men Window ...................................................................................................16 6.5 Men Help .........................................................................................................16 6.6 El explorador de recursos ..................................................................................16 Captulo 7 Definiendo los sprites.............................................................................. 17 Captulo 8 Sonidos y msica ..................................................................................... 19 Captulo 9 Fondos ...................................................................................................... 20 Captulo 10 Definiendo objetos................................................................................... 21 Captulo 11 Eventos ..................................................................................................... 23 Captulo 12 Acciones ................................................................................................... 29 12.1 Acciones de movimiento (pgina / ficha move) ................................................29 12.2 Acciones principales, grupo 1 (pgina / ficha main1) .......................................32 12.3 Acciones principales, grupo 2 (pgina/ficha main2) .........................................34 12.4 Control ...............................................................................................................35 12.5 Acciones de dibujo.............................................................................................38 12.6 Acciones de score ..............................................................................................39 12.7 Acciones relacionadas con cdigo .....................................................................41 12.8 Usando expresiones y variables .........................................................................42 Captulo 13 Creando cuartos ...................................................................................... 44 13.1 Agregando instancias .........................................................................................45 13.2 Configuracin del cuarto ...................................................................................45 13.3 Configurando el fondo .......................................................................................46 Captulo 14 Distribuyendo tu juego ........................................................................... 47 Captulo 15 Modo avanzado ....................................................................................... 48 15.1 Men File ...........................................................................................................48 15.2 Men Edit ..........................................................................................................50 15.3 Men Add ..........................................................................................................50 Captulo 16 Ms acerca de los sprites ........................................................................ 51 16.1 Editando tus sprites ............................................................................................51 16.2 Editando sub-imgenes individuales .................................................................56 16.3 Configuracin avanzada de sprites ....................................................................58

Captulo 17 Ms sobre los sonidos y msica ............................................................. 60 Captulo 18 Ms acerca de los fondos ........................................................................ 61 Captulo 19 Ms acerca de los objetos ....................................................................... 62 19.1 Depth (Profundidad) ..........................................................................................62 19.2 Persistent objects (Objetos persistentes)............................................................62 19.3 Parents (Padres) .................................................................................................62 19.4 Masks (Mscaras) ..............................................................................................63 19.5 Informacin........................................................................................................63 Captulo 20 Ms acerca de las habitaciones .............................................................. 64 20.1 Configuraciones avanzadas................................................................................64 20.2 Agregando mosaicos..........................................................................................65 20.3 Vistas .................................................................................................................67 Captulo 21 Paths ......................................................................................................... 68 21.1 Definiendo paths ................................................................................................68 21.2 Asignando paths a los objetos............................................................................69 21.3 El evento path ....................................................................................................70 Captulo 22 Time Lines ............................................................................................... 71 Captulo 23 Scripts ...................................................................................................... 73 Captulo 24 Data files .................................................................................................. 76 Captulo 25 Informacin del juego............................................................................. 78 Captulo 26 Opciones del juego .................................................................................. 79 26.1 Opciones para los grficos .................................................................................79 26.2 Resolucin .........................................................................................................80 26.3 Opciones de teclas .............................................................................................81 26.4 Opciones de carga ..............................................................................................81 26.5 Opciones de errores ...........................................................................................82 26.6 Opciones de informacin ...................................................................................82 Captulo 27 Consideraciones sobre la velocidad....................................................... 83 Captulo 28 El Lenguaje Game Maker (GML)......................................................... 84 28.1 Un programa ......................................................................................................84 28.2 Variables ............................................................................................................84 28.3 Asignacin .........................................................................................................85 28.4 Expresiones ........................................................................................................85 28.5 Ms sobre variables ...........................................................................................86 28.6 Direccionando variables en otras instancias ......................................................86 28.7 Arrays.................................................................................................................88 28.8 Sentencia if ........................................................................................................88 28.9 Sentencia repeat .................................................................................................89 28.10 Sentencia while ..................................................................................................89 28.11 Sentencia do .......................................................................................................89 28.12 Sentencia for ......................................................................................................90 28.13 Sentencia switch ................................................................................................90 28.14 Sentencia break ..................................................................................................91

28.15 28.16 28.17 28.18 28.19 28.20 28.21

Sentencia continue .............................................................................................91 Sentencia exit .....................................................................................................92 Funciones ...........................................................................................................92 Scripts ................................................................................................................92 Construcciones with...........................................................................................93 Comentarios .......................................................................................................94 Funciones y variables en GML..........................................................................94

Captulo 29 Haciendo clculos.................................................................................... 95 29.1 Constantes ..........................................................................................................95 29.2 Funciones de valores reales ...............................................................................95 29.3 Funciones para el manejo de strings ..................................................................96 Captulo 30 GML: Game play .................................................................................... 98 30.1 Movindose........................................................................................................98 30.2 Instancias .........................................................................................................100 30.3 Timing..............................................................................................................102 30.4 Cuartos y score.................................................................................................103 30.5 Generando eventos...........................................................................................105 30.6 Variables miscelneas y funciones ..................................................................107 Captulo 31 GML: Interaccin con el usuario ........................................................ 108 31.1 Soporte para joystick .......................................................................................110 Captulo 32 GML: Game graphics........................................................................... 112 32.1 Window and cursor ..........................................................................................112 32.2 Sprites and images ...........................................................................................113 32.3 Backgrounds ....................................................................................................114 32.4 Tiles .................................................................................................................115 32.5 Drawing functions............................................................................................117 32.6 Views ...............................................................................................................120 32.7 Transitions .......................................................................................................121 32.8 Repainting the screen.......................................................................................121 Captulo 33 GML: Sonido y msica......................................................................... 123 Captulo 34 GML: Splash screens, highscores, and other pop-ups ...................... 126 Captulo 35 GML: Resources ................................................................................... 129 35.1 Sprites ..............................................................................................................129 35.2 Sounds..............................................................................................................131 35.3 Backgrounds ....................................................................................................132 35.4 Paths.................................................................................................................133 35.5 Scripts ..............................................................................................................134 35.6 Data Files .........................................................................................................134 35.7 Objects .............................................................................................................134 35.8 Rooms ..............................................................................................................135 Captulo 36 GML: Archivos, registro y ejecucin de programas ......................... 136 Captulo 37 GML: Juegos multiplayer .................................................................... 140 37.1 Estableciendo una conexin.............................................................................140 37.2 Creando y unindose a sesiones.......................................................................141

37.3 37.4 37.5

Jugadores .........................................................................................................142 Shared data (datos compartidos)......................................................................143 Mensajes ..........................................................................................................143 GML: Usando DLLs ............................................................................. 145

Captulo 38

Captulo 1 As que quieres crear tus propios juegos de computadora


Jugar juegos de computadora es divertido. Pero es ms divertido disear tus propios juegos y que otros los jueguen. Desafortunadamente, no es fcil crear videojuegos para computadora. Los juegos comerciales de hoy en da normalmente se llevan de uno a tres aos de desarrollo con equipos de entre 10 a 50 personas. Sus presupuestos alcanzan fcilmente millones de dlares. Y todas estas personas tienen bastante experiencia: programadores, diseadores de arte, tcnicos de sonido, etc. Quiere decir que es imposible crear tus propios juegos para computadora? Afortunadamente no. Por supuesto que no debes esperar que puedas crear tu propio Quake o Age of Empires en unas cuantas semanas. Pero tampoco es necesario. Juegos ms simples, como Tetris, Pacman, Space Invaders, etc., tambin son divertidos y son mucho ms fciles de crear. Desafortunadamente an requieren de buenas habilidades de programacin para manejar los grficos, sonidos, la interaccin con el usuario, etc. Es aqu donde aparece el Game Maker. El Game Maker ha sido creado para hacer mucho ms sencilla la creacin de ese tipo de juegos. Sin ninguna necesidad de programar. Una sencilla e intuitiva interfaz de arrastrar y soltar te permite crear tus propios juegos rpidamente. Puedes importar y crear imgenes, sprites (imgenes animadas), sonidos y usarlos. T defines fcilmente los objetos en tu juego e indicas su comportamiento. Puedes definir niveles atractivos con fondos deslizables en donde tome lugar el juego. Y si quieres control total sobre el juego existe un sencillo lenguaje de programacin dentro del Game Maker que te pone al mando de todo lo que sucede en el juego. El Game Maker se enfoca a juegos bidimensionales. As que nada de mundos 3D como en Quake. Pero no te desanimes. Muchos juegos importantes, como Age of Empires, las series Command and Conquer y Diablo usan tecnologa de sprites bidimensionales, aunque parecen tridimensionales. Y disear juegos bidimensionales es mucho ms fcil y rpido. Probablemente la mejor parte es que el Game Maker puede usarse libre de cargo. Y no hay ninguna restriccin en los juegos que creas con l. Ninguna pantalla de publicidad, e incluso puedes venderlos si as lo deseas. Checa el acuerdo de licencia adjunto para ms detalles. Este documento te dir todo lo que necesitas saber acerca del Game Maker y cmo puedes crear tus propios juegos con l. Por favor entiende que, incluso con un programa como Game Maker, el diseo de juegos para computadora no es completamente trivial. Hay muchsimos aspectos que son importantes: el game play, los grficos, los sonidos, la interaccin con el usuario, etc. Comienza con ejemplos fciles y te dars cuenta de que crear juegos es bastante divertido. Tambin checa el sitio web http://www.cs.uu.nl/~markov/gmaker/index.html (en ingls)

y el foro all para obtener muchos ejemplos, ideas y ayuda. Y pronto te convertirs en un maestro de la creacin de videojuegos. Disfrtalo.

Captulo 2 Instalacin
Probablemente ya lo hiciste pero por si acaso, aqu tienes cmo instalar el Game Maker. Simplemente ejecuta el programa gmaker.exe. Sigue las instrucciones en pantalla. Puedes instalar el programa donde lo desees pero mejor deja las opciones por defecto. Una vez que finalice la instalacin, en el men Inicio encontrars un nuevo grupo de programas desde el que puedes ejecutar el Game Maker y leer la documentacin. Adems del programa Game Maker tambin se instala la documentacin, junto con el archivo de ayuda. La primera vez que ejecutes el Game Maker se te preguntar si quieres ejecutarlo en modo Simple o Advanced (avanzado). Si no has empleado un programa de creacin de videojuegos antes y no tienes experiencia como programador, usa el modo simple (selecciona No) En el modo simple se muestran menos opciones. Puedes cambiar fcilmente al modo avanzado usando la opcin en el men File. Dentro de la carpeta de instalacin (por defecto C:\Archivos de Programa\Game_Maker5) tenemos varias carpetas adicionales: examples: contiene varios juegos de ejemplo, para que los revises y/o modifiques. lib: contiene varias libreras de acciones. Si deseas instalar libreras adicionales debes colocarlas dentro de esta carpeta. sprites: esta carpeta est dedicada a contener los sprites que uses. La instalacin incluye algunos sprites, pero en el sitio del Game Maker (http://www.gamemaker.nl), puedes descargar varios paquetes de recursos que contienen sprites, sonidos, y fondos adicionales. backgrounds, sounds: carpetas similares que contienen las imgenes para los fondos y los sonidos. El Game Maker requiere una PC moderna con procesador Pentium y sistema operativo Windows 98, NT, 2000, Me, o superior. Requiere una resolucin de pantalla de por lo menos 800x600 y 65000 (16-bit) colores. Requiere DirectX. Cuando se disean y prueban los juegos, los requerimientos de memoria son de por lo menos 32 MB (preferiblemente ms). Cuando solo se estn ejecutando los juegos, los requerimientos de memoria son un poco menores pero depende mucho del tipo de juego.

Captulo 3 Registro
Como se mencion antes, el Game Maker puede ser usado sin cargo alguno. No hay restriccin alguna para los juegos que crees. En los juegos no aparece ninguna pantalla publicitaria e inclusive puedes vender tus juegos si as gustas. Lee el acuerdo de licencia adjunto para ms detalles. Pero se te recomienda ampliamente que registres tu copia del Game Maker. Mediante el registro ayudas al futuro desarrollo del programa. Tambin se eliminar la pantalla publicitaria en el editor. Se planean futuros beneficios para los usuarios registrados, por ejemplo una competicin de juegos. La cuota de registro del Game Maker es de US $15 o de 15 Euros. Hay varias formas en las que puedes llevar a cabo el registro de tu copia del programa. La ms fcil es usar el registro online usando un sistema de pago seguro con tarjeta de crdito o una cuenta PayPal. Alternativamente puedes realizar una transferencia a nuestra cuenta bancaria, enviarnos una money order o enviar efectivo. Puedes encontrar los detalles en el sitio de registro del Game Maker: www.gamemaker.nl/registration.html Para registrar tu copia del Game Maker usa el sitio de arriba o selecciona Registration desde el men Help. En la parte inferior de la ventana que aparece haz clic en el botn Registration. Sers llevado a nuestra pgina web donde se indican las diferentes opciones de registro, incluyendo el registro online. Una vez que tu registro ha sido recibido se te enviar un email con el nombre, clave y la informacin sobre cmo introducir la clave en el programa. Para introducir la clave, selecciona nuevamente Registration desde el men Help. En la parte inferior de la ventana presiona el botn Enter Key. Introduce el nombre y la clave, y presiona OK. Si seguiste estos pasos correctamente el programa ya estar registrado.

Captulo 4 La idea global


Antes de ahondar en las posibilidades del Game Maker, sera bueno tener una idea general acerca del programa. Los juegos creados con el Game Maker se llevan a cabo en una o ms habitaciones (rooms). (Las habitaciones son planas, no 3D, pero pueden contener imgenes con apariencia 3D). En estas habitaciones es donde colocas los objetos, los cuales puedes definir en el programa. Los objetos tpicos son las paredes, objetos mviles, el personaje principal, enemigos, etc. Algunos objetos, como las paredes, slo se encuentran ah y no realizan ninguna accin. Otros, como el personaje principal, se movern y reaccionarn a los comandos del jugador (teclado, ratn, joystick). Por ejemplo, cuando el personaje principal toca un enemigo podra ser eliminado. Los objetos son los ingredientes ms importantes de los juegos creados con el Game Maker, por lo que hablaremos un poco ms sobre ellos. Primero que nada, la mayora de los objetos necesitan alguna imagen para hacerse visibles en la pantalla. Tales imgenes son llamadas sprites. Un sprite no siempre es una sola imagen sino una serie de ellas que se muestran una tras otra para crear una animacin. De esta forma parece que el personaje camina, que una pelota rueda, que una nave explota, etc. Durante el juego el sprite de un objeto en particular puede cambiar. (As el personaje puede lucir diferente cuando camina a la izquierda o a la derecha). Puedes crear tus propios sprites en el Game Maker o cargarlos de algn archivo (GIFs animados por ejemplo). A los objetos les pueden ocurrir ciertas cosas. A estas cosas se les llama eventos. Los objetos pueden realizar ciertas acciones dependiendo del evento que ocurra. Hay una gran cantidad de eventos que pueden suceder y una gran cantidad de acciones diferentes que los objetos pueden realizar. Por ejemplo, hay un evento creacin cuando el objeto es creado. (Para ser ms precisos, cuando una instancia de un objeto es creada; puede haber mltiples instancias del mismo objeto). Por ejemplo, cuando un objeto pelota se crea, puedes darle alguna accin de movimiento para que empiece a moverse. Cuando dos objetos se encuentran se tiene el evento colisin. En tal caso puedes hacer que la pelota se detenga o que invierta su direccin. Puedes tambin reproducir un efecto de sonido. Para este propsito el Game Maker te permite definir sonidos. Cuando el jugador presiona una tecla en el teclado hay un evento teclado, y el objeto puede realizar la accin apropiada, como moverse en la direccin indicada. Espero que entiendas la idea. Para cada objeto que disees puedes indicarle acciones para varios eventos, de esta forma se define el comportamiento del objeto. Una vez que has definido tus objetos es tiempo de definir las habitaciones en donde habitarn. Las habitaciones pueden ser empleadas como niveles en el juego o para mostrar diferentes lugares. Hay acciones para moverse de una habitacin a otra. Las habitaciones deben tener primero un fondo. Este puede ser un simple color de relleno o una imagen. Tales imgenes pueden ser creadas en el Game Maker o puedes cargarlas de algn archivo. (El fondo puede hacer muchas cosas pero por el momento, solo considralo como algo que hace que los niveles se vean bien). Ahora puedes colocar tus objetos en la habitacin. Puedes colocar mltiples instancias del mismo objeto en una

habitacin. As, por ejemplo, necesitas definir slo un objeto de pared y usarlo en muchos lugares. Tambin puedes tener mltiples instancias de los mismos enemigos, mientras requieran del mismo comportamiento. Ahora ests listo para ejecutar el juego. Se mostrar la primer habitacin y los objetos en ella tomarn vida por las acciones en sus eventos de creacin. Empezarn a interactuar unos con otros debido a las acciones en sus eventos de colisin y pueden reaccionar a lo que haga el jugador usando las acciones en los eventos del teclado o del ratn. En resumen, los siguientes elementos (comnmente llamados recursos) tienen un papel crucial en el juego: Objetos (objects): que son las entidades verdaderas en el juego. Habitaciones (rooms): los lugares (niveles) en donde habitan los objetos. Sprites: imgenes (animadas) que se emplean para representar a los objetos. Sonidos (sounds): para emplearse en el juego, ya sea como msica de fondo o como efectos. Fondos (backgrounds): las imgenes usadas como fondo para los cuartos. De hecho, hay otro tipo de recursos: paths, scripts, data files y time lines. Estos recursos son importantes para juegos ms complicados. Solo los vers cuando ejecutas el Game Maker en modo avanzado. Se hablar de ellos ms tarde en los captulos avanzados de este documento.

Captulo 5 Veamos un ejemplo


Sera bueno echar un vistazo de cmo crear un ejemplo muy simple. El primer paso es describir el juego que queremos hacer. (Siempre debieras empezar por esto; te ahorrar mucho trabajo despus). El juego ser muy simple: hay una pelota rebotando entre varias paredes. El jugador debe intentar hacer clic en la pelota con el ratn. Cada vez que lo logre obtiene un punto. Como se puede ver, se requieren dos objetos diferentes: la pelota y la pared. Tambin necesitaremos dos sprites diferentes: uno para el objeto pared y otro para el objeto pelota. Finalmente, queremos escuchar algn sonido cuando se logre hacer clic en la pelota con el ratn. Usaremos un slo nivel en el que se lleve a cabo el juego. (Si no quieres hacer el juego t mismo, puedes cargarlo de la carpeta Examples con el nombre touch the ball.gmd.) Hagamos primero los sprites. Del men Add selecciona Add Sprite (puedes tambin usar el botn apropiado en la barra de herramientas). Aparecer una ventana. En el campo Name escribe wall. Selecciona el botn Load Sprite y elige una imagen apropiada (puedes encontrar una en la carpeta maze). Eso es todo, puedes cerrar la ventana. De esta misma forma, crea un sprite para la pelota. Ahora definiremos el sonido. Del men Add selecciona Add Sound. Aparece una ventana diferente. Dale un nombre al sonido y selecciona Load Sound. Selecciona algo apropiado y checa si es un buen sonido presionando el botn reproducir. Si te gusta, cierra la ventana. El siguiente paso es crear los dos objetos. Hagamos primero la pared. Nuevamente del men Add selecciona Add Object. Se abrir una ventana que se ve bastante ms compleja que las que hemos visto hasta ahora. A la izquierda tenemos informacin global acerca del objeto. Dale al objeto un nombre apropiado y del men desplegable selecciona el sprite wall. Como una pared es slida deberas marcar la casilla llamada Solid. Eso es todo por el momento. Nuevamente crea un objeto, llmalo ball, y seleccinale un sprite. No haremos slida a la pelota. Necesitamos definir algn comportamiento para la pelota. Debajo hay un botn marcado Add Event. Presinalo y vers todos los eventos posibles. Selecciona el evento de creacin (create). Ahora se ha agregado a la lista de eventos. En el extremo derecho puedes ver todas las acciones posibles, en varios grupos. Del grupo move selecciona la accin con las 8 flechas rojas y arrstrala a la lista de acciones en el medio. Esta accin har al objeto moverse en una direccin particular. Una vez que la sueltes en la lista de acciones se mostrar un dilogo en el cual puedes indicar la direccin de movimiento. Selecciona las 8 flechas para seleccionar una direccin al azar. Cierra el dilogo. Ahora la pelota empezar a moverse en el momento en que sea creada. En segundo lugar debemos definir lo que suceder en caso de que se colisione con la pared. De nuevo presiona Add Event. Haz clic en el botn de los eventos de colisin (collision) y del men que aparece selecciona el objeto wall. Para este evento necesitamos la accin rebotar. (Puedes ver lo que cada accin hace colocando el ratn sobre el icono que la representa). Finalmente necesitamos definir lo que se har cuando el

usuario presione el botn izquierdo del ratn sobre la pelota. Agrega el evento correspondiente y selecciona el botn izquierdo del ratn (Left button) del men que se despliega. Para este evento necesitamos unas cuantas acciones: una para reproducir un sonido (la puedes encontrar en el grupo de acciones main1), una para cambiar el marcador (se encuentra en el grupo score) y dos ms para mover la pelota a una posicin aleatoria y moverla en una nueva direccin (de la misma forma que en el evento de creacin). Para la accin de sonido, selecciona el sonido adecuado. Para la accin del marcador (score), introduce un valor de 1 y marca la opcin Relative. Esto significa que se agregar 1 al marcador actual. (Si cometes algn error puedes hacer doble clic sobre la accin para modificar su configuracin). Nuestros objetos ahora estn listos. Lo que queda es definir la habitacin. Agrega un nuevo nivel al juego, de nuevo desde el men Add. A la derecha vers la habitacin vaca. A la izquierda vers algunas propiedades que puedes modificar, como el ancho y alto de la habitacin. En la parte inferior izquierda puedes seleccionar un objeto del men desplegable. Puedes colocar instancias de ese objeto haciendo clic en el cuarto. Puedes eliminar las instancias usando el botn derecho del ratn. Crea un espacio cerrado alrededor del nivel usando el objeto wall. Finalmente coloca 1 o 2 objetos ball en el nivel. Nuestro juego est listo. Es hora de probar nuestro juego. Presiona el botn Run y ve lo que pasa. Si no cometiste algn error la pelota empieza a moverse alrededor. Intenta hacer clic en ella con el ratn y ve qu sucede. Puedes detener el juego presionando la tecla <Esc>. Ahora puedes hacer ms cambios. Felicitaciones. Haz creado tu primer juego. Pero creo que es hora de aprender un poco ms sobre el Game Maker.

Captulo 6 La interfaz del usuario


Al iniciar el Game Maker se muestra la siguiente ventana:

(De hecho, esto es lo que ves cuando ejecutas el Game Maker en modo simple. En el modo avanzado se muestran algunas opciones ms. Ve el Captulo 14 para ms detalles). A la izquierda puedes ver los diferentes recursos, mencionados antes: Sprites, Sounds (Sonidos), Backgrounds (Fondos), Scripts, Objects (Objetos), Rooms (Habitaciones) y dos ms: Game Information (Informacin del juego) y Game Options (Opciones del juego) En la parte superior est el ya conocido men y la barra de herramientas. En este captulo describir brevemente las diferentes opciones del men, los botones, etc. En captulos posteriores trataremos varios de ellos con ms detalle. Recuerda que muchas cosas se pueden lograr de diferentes maneras: seleccionando un comando del men, haciendo clic en un botn, o haciendo clic derecho sobre un recurso.

6.1

Men File

En el men file puedes encontrar los comandos usuales para cargar y guardar archivos, adems de algunos especiales: New. Selecciona este comando para empezar a crear un juego nuevo. Si el juego actual sufri modificaciones se te pregunta si quieres guardarlo. Tambin hay un botn en la barra de herramientas para hacer esto. Open. Abre un archivo de juego. Los archivos del Game Maker tienen la extensin .gmd. Hay un botn en la barra de herramientas para este comando. Puedes tambin abrir un juego arrastrando el archivo a la ventana del Game Maker. Recent Files. Usa este submen para reabrir los archivos abiertos recientemente.

Save. Guarda el archivo de diseo del juego con el nombre actual. Si no se haba especificado un nombre, se te pide dar uno. Puedes usar este comando solo cuando el archivo ha cambiado. Como con los anteriores, hay un botn en la barra de herramientas para realizar esta accin. Save As. Guarda el diseo del juego con otro nombre. Se te pide un nuevo nombre. Create Executable. Una vez que tu juego est listo probablemente querrs distribuirlo. Mediante este comando puedes crear una versin ejecutable de tu juego. Es simplemente un ejecutable que puedes darle a otros para que jueguen tu juego. Encontrars ms informacin sobre la distribucin de juegos en el Captulo 14. Advanced Mode. Al hacer clic en este comando el Game Maker cambiar entre los modos simple y avanzado. En el modo avanzado se tienen disponibles comandos y recursos adicionales. Exit. Probablemente obvio. Presinalo para cerrar el Game Maker. Si hiciste cambios al juego actual se te preguntar si quieres guardarlo.

6.2

Men Edit

El men edit contiene varios comandos que se relacionan con el recurso seleccionado (objeto, sonido, etc.) o grupo de recursos. Dependiendo del tipo de recurso algunos de los comandos pueden no estar disponibles. Insert resource. Inserta una nueva instancia del tipo de recurso actualmente seleccionado, se inserta antes del mismo. (Si seleccionaste un grupo de recursos el recurso es agregado al grupo). Se abrir un cuadro de dilogo en el que puedes cambiar las propiedades del recurso. Esto se tratar con ms detalle en los captulos siguientes. Duplicate. Crea y agrega una copia del recurso actual. Se abre una ventana en la que puedes modificar el recurso. Delete. Borra el recurso seleccionado (o grupo de recursos). Ten cuidado. No puede deshacerse. Por lo que se te har una advertencia. Rename. Dale un nuevo nombre al recurso. Esto se puede hacer tambin en la ventana de propiedades del recurso. Tambin puedes seleccionar el recurso y entonces hacer clic en el nombre. Properties. Usa este comando para mostrar la ventana de edicin de propiedades. Nota que todas las ventanas de propiedades se muestran en la ventana principal. Puedes editar muchas de ellas al mismo tiempo. Puedes tambin editar las propiedades haciendo doble clic en el recurso. Nota que estos comandos puedes tambin aplicarse de otra forma. Haz clic derecho en un recurso o en un grupo de recursos, y aparecer el men apropiado.

6.3

Men Add

En este men puedes agregar un nuevo recurso de cada uno de los diferentes tipos que hay. Nota que para cada uno de ellos hay tambin un botn en la barra de herramientas y un acceso directo con el teclado.

6.4

Men Window

En este men puedes encontrar los comandos comunes para manejar las diferentes propiedades de las ventanas de la ventana principal: Cascade. Coloca todas las ventanas en cascada de forma que cada una sea parcialmente visible. Arrange Icons. Ordena todas las ventanas. (til en particular cuando cambias de tamao la ventana principal). Close All. Cierra todas las ventanas de propiedades, preguntando si se desea guardar o no los cambios realizados.

6.5

Men Help

Aqu encontrars algunos comandos de ayuda: Contents. Te permite acceder a la versin en formato de ayuda de este documento. How to use help. En caso de que no sepas, algo de ayuda sobre cmo usar la ayuda. Registration. An cuando el Game Maker puede ser usado libre de cargo, se te alienta a registrar el programa. De esta forma se eliminar la ventana publicitaria que en ocasiones aparece en la ventana de edicin y ayudars al futuro desarrollo del programa. Aqu puedes encontrar informacin sobre cmo registrar el programa. Si ya lo registraste puedes usar esta opcin para introducir la clave de registro que recibieste. Web site. Te conecta al sitio del Game Maker en donde puedes encontrar informacin sobre la versin ms reciente del Game Maker y colecciones de juegos y recursos para el Game Maker. Te recomiendo que visites el sitio al menos una vez al mes para ver nueva informacin. Forum. Te conecta al foro del Game Maker donde mucha gente te ayudar con tus dudas. About Game Maker. Breve informacin sobre esta versin del Game Maker.

6.6

El explorador de recursos

En la parte izquierda de la forma principal encontrars el explorador de recursos. Aqu tienes una lista ramificada de todos los recursos de tu juego. Trabaja de la misma forma que el explorador de Windows con el cual muy probablemente ya ests familiarizado. Si un elemento tiene un signo + a su lado puedes hacer clic en el signo para ver los recursos dentro de l. Haciendo clic en el signo los oculta nuevamente. Puedes cambiar el nombre de un recurso (excepto los de ms alto nivel) seleccionndolo (con un solo clic) y luego haciendo clic en el nombre. Haz doble clic en un recurso para editar sus propiedades. Usa el botn derecho del ratn para acceder a los comandos del men Edit. Puedes cambiar el orden de los recursos haciendo clic en ellos y manteniendo presionado el botn del ratn. Ahora arrastra el recurso (o grupo) al lugar apropiado. (Por supuesto que el lugar debe ser el apropiado. Por ejemplo no puedes arrastrar un sonido a la lista de sprites).

Captulo 7 Definiendo los sprites


Los sprites son las representaciones visuales de todos los objetos en el juego. Un sprite es o una imagen simple, dibujada con cualquier programa que te guste, o un juego de varias imgenes que, pueden ser reproducidas una tras otra, creando un efecto de movimiento (animacin). Por ejemplo, las siguientes cuatro imgenes forman un sprite para un Pacman movindose hacia la derecha.

Cuando haces un juego empiezas por reunir los distintos sprites para los objetos en tu juego. Con el Game Maker viene incluida una coleccin de sprites estticos y animados. Puedes encontrar otros sprites en Internet, normalmente como archivos gif animados. Para agregar un sprite, selecciona el comando Add Sprite del men Add, o usa el botn correspondiente de la barra de herramientas. Aparecer la siguiente ventana.

En la parte superior puedes indicar el nombre del sprite. Todos los sprites (y todos los dems recursos) tienen un nombre. Ser mejor que le des a cada sprite un nombre descriptivo y fcil de recordar. Asegrate de que todos los recursos tengan diferentes nombres. Aunque no es estrictamente requerido, se recomienda firmemente usar slo letras, dgitos y el guin bajo (_) en el nombre de un sprite (y de cualquier otro recurso) y empezar el nombre con una letra. En particular no hagas uso de espacios en los nombres. Esto pasar a ser parte importante una vez que empieces a usar cdigo. Para cargar un sprite, haz clic en el botn Load Sprite. Se muestra un dilogo de archivo en el que debes indicar el sprite. El Game Maker puede abrir varios tipos de archivos de

imagen. Cuando cargas un gif animado, las diferentes subimgenes forman las imgenes del sprite. Una vez que el sprite es cargado, se muestra la primera subimagen a la derecha. Cuando hay mltiples subimgenes, puedes verlas usando los botones con las flechas. La opcin Transparent indica si el fondo deber ser considerado como transparente. La mayora de los sprites son transparentes. El fondo es determinado por el color del pixel que se encuentra en la esquina inferior izquierda de la imagen. As que asegrate de que ningn pixel de la imagen que se mostrar tenga este color. (Los archivos gif a menudo definen su color de transparencia, este color no es usado en el Game Maker). Con el botn Edit Sprite puedes editar el sprite, o incluso crear un sprite completamente nuevo. Para ms informacin sobre la creacin y modificacin de sprites, ve el Captulo 14.

Captulo 8 Sonidos y msica


La mayora de los juegos tienen ciertos efectos de sonido y msica de fondo. El Game Maker incluye algunos efectos de sonido de utilidad. Puedes encontrar muchos ms en la web. Para agregar un recurso de sonido a tu juego, usa el comando Add Sound en el men Add o usa el botn correspondiente en la barra de herramientas. Aparecer la siguiente ventana.

Para cargar un sonido, presiona el botn Load Sound. Aparece un dilogo de seleccin de archivo en el que debes especificar el archivo de sonido. Hay dos tipos de archivos de sonido, archivos wave (*.wav) y archivos midi (*.mid). (Para informacin sobre archivos mp3 ve el Captulo 17). Los archivos wave son usados para efectos breves de sonido. Usan mucha memoria pero se reproducen instantneamente. salos para todos los efectos de sonido en el juego. Los archivos midi tratan la msica en una forma diferente. Como resultado usan mucha menos memoria, pero estn limitados a msica instrumental de fondo. Adems, slo se puede reproducir un archivo midi en algn momento. Una vez que cargues un archivo se muestra su tipo y duracin. Puedes escuchar el sonido usando el botn reproducir. Tambin hay un botn Save Sound para guardar en un archivo el sonido actual. Este botn no es realmente requerido pero pudieras necesitarlo si perdieras el sonido original.

Captulo 9 Fondos
El tercer tipo de recursos bsicos son los fondos. Los fondos son normalmente imgenes grandes usadas como fondo para los niveles en los que se realiza el juego. A menudo las imgenes de fondo son hechas con tiles (mosaicos) de manera que pueden formar una imagen en un rea sin errores visuales. De esta manera puedes llenar el fondo con un patrn. Varios tiles de fondo de este tipo vienen incluidos con el Game Maker. Puedes encontrar muchos ms en la web. Para agregar un fondo a tu juego, usa el comando Add Background en el men Add o usa el botn correspondiente de la barra de herramientas. Aparecer la siguiente ventana.

Presiona el botn Load Background para cargar una imagen de fondo. El Game Maker soporta varios formatos de imagen. Las imgenes de fondo no pueden ser animadas! La opcin Transparent indica si el fondo ser parcialmente transparente. La mayora de los fondos no son transparentes, por lo que la opcin por defecto es no. Como color transparente se usa el color del pixel en la esquina inferior izquierda. Puedes cambiar el fondo o crear uno nuevo usando el botn Edit Background. Para ms informacin, ve el Captulo 18.

Captulo 10 Definiendo objetos


Hemos agregado imgenes y sonidos al juego, pero ninguno de ellos realiza ninguna accin. Ahora llegamos al recurso ms importante dentro del Game Maker: los objetos. Los objetos son las entidades que hacen las cosas en el juego. La mayora de las veces tienen un sprite como representacin grfica para que puedas verlos. Tienen un comportamiento porque pueden reaccionar a ciertos eventos. Todas las cosas que ves en el juego (excepto el fondo) son objetos. (O para ser ms precisos, son instancias de objetos). Los personajes, los enemigos, las pelotas, las paredes, etc. Puede haber tambin ciertos objetos que no ves pero que controlan ciertos aspectos del juego. Por favor nota la diferencia entre los sprites y los objetos. Los sprites son solo imgenes (animadas) que no tienen ningn comportamiento. Los objetos normalmente tienen un sprite que los representa pero tambin tienen un comportamiento. Sin objetos no hay juego! Tambin nota la diferencia entre los objetos y las instancias. Un objeto describe cierta entidad, por ejemplo un enemigo. Puede haber mltiples instancias de este objeto en el juego. Cuando hablamos de instancia nos referimos a una instancia en particular del objeto. Cuando hablamos de un objeto nos referimos a todas las instancias de este objeto. Para agregar un objeto al juego, selecciona el comando Add Object del men Add. Aparecer la siguiente ventana:

Esta es bastante compleja. A la izquierda hay cierta informacin general acerca del objeto. En el medio hay varios eventos posibles que pueden ocurrirle a un objeto. Ve el siguiente captulo para ms detalles. A la derecha hay varias acciones que puede realizar el objeto. Estas sern tratadas en el Captulo 12.

Como siempre, puedes (y debes) agregar un nombre al objeto. Despus puedes indicar el sprite para el objeto. Para hacerlo, haz clic con el botn izquierdo del ratn en la caja de sprite o en el botn de men junto a esta. Aparecer un men con todos los sprites disponibles. Selecciona el que quieras usar para el objeto. Debajo hay dos opciones. Solid indica si este objeto es slido (como una pared). Las colisiones con objetos slidos son tratadas de forma diferente que las colisiones con objetos que no lo son. Ve el siguiente captulo para ms informacin. La opcin Visible indica si las instancias de este objeto sern visibles. Obviamente, la mayora de los objetos son visibles, pero algunas veces es til tener objetos invisibles. Por ejemplo, puedes usarlos como guas de movimiento para un enemigo. Los objetos invisibles reaccionan a eventos y otras instancias pueden colisionar con ellos.

Captulo 11 Eventos
El Game Maker emplea lo que se conoce como programacin orientada a eventos. Esto es, en todo tipo de situaciones las instancias de los objetos reciben eventos (como mensajes que indican que algo ha sucedido). Entonces los objetos pueden reaccionar a estos mensajes ejecutando ciertas acciones. Para cada objeto debes indicar a qu eventos responder y qu acciones debe realizar. Puede parecer complicado pero en realidad es bastante sencillo. Primero que nada, para la mayora de los eventos los objetos no tienen que hacer nada. Para los eventos donde algo suceda puedes usar muy simples comandos de arrastrar y soltar para indicar las acciones. En medio de la ventana de propiedades de objeto hay una lista de los eventos a los cuales el objeto puede reaccionar. Al principio est vaca. Puedes agregar eventos presionando el botn Add Event. Aparecer un pequeo men con todos los diferentes tipos de eventos. Aqu debes seleccionar el evento que deseas agregar. En ocasiones se mostrar un nuevo men con opciones extra. Por ejemplo, para el evento del teclado debes seleccionar la tecla. Ms abajo encontrars una completa lista con descripciones de los eventos. Seleccionaremos un evento de la lista. Este ser el evento que modificaremos. Puedes cambiar el evento seleccionado haciendo clic sobre l. A la derecha estn todas las acciones representadas por pequeos iconos. Se encuentran agrupadas en varias pginas / fichas de opciones. En el siguiente captulo describir todas las acciones y lo que realizan. Entre los eventos y las acciones se encuentra la lista. Esta lista contiene las acciones para el evento actual. Para agregar acciones a la lista, arrstralas desde la derecha a la lista. Sern colocadas una bajo la otra, con una breve descripcin. Para cada accin se te pedirn algunos parmetros. Estos se describirn tambin en el siguiente captulo. Despus de agregar algunas acciones, tendras algo como esto:

Ahora puedes agregar acciones a otro evento. Haz clic con el botn izquierdo del ratn sobre el evento adecuado para seleccionarlo y arrastra la accin a la lista.

Puedes cambiar el orden de las acciones en la lista arrastrando los iconos. Si mantienes presionada la tecla <Ctrl.> mientras arrastras una accin, crears una copia de dicha accin. Puedes inclusive arrastrar acciones entre diferentes listas de diferentes objetos. Cuando haces clic con el botn derecho sobre una accin, se muestra un men desde el cual puedes eliminar la accin (tambin puedes hacer esto usando la tecla <Supr>), o copiar y pegar acciones. Cuando mantienes el cursor del ratn sobre una accin, se muestra una descripcin ms detallada sobre la misma. En el siguiente captulo hay ms informacin sobre las acciones. Para eliminar el evento seleccionado y todas sus acciones, presiona el botn Delete. (Los eventos sin acciones son eliminados automticamente cuando cierras la ventana por lo que no hay necesidad de que lo hagas tu mismo). Si deseas asignar las acciones a un evento diferente (porque por ejemplo, has decidido emplear una tecla diferente para las acciones) presiona el botn Change y selecciona el nuevo evento. (El nuevo evento no debe haber sido empleado antes!). Como se mencion arriba, para agregar un evento, presiona el botn Add Event. Se muestra la siguiente ventana:

Aqu seleccionas el evento que deseas agregar. Algunas veces aparece un men con opciones extra. A continuacin una descripcin de los eventos. (Recuerda que normalmente slo haces uso de algunos de ellos). Evento Create Este evento ocurre cuando se crea una instancia del objeto. Normalmente se usa para establecer el movimiento de la instancia y/o establecer ciertas variables de la misma. Evento Destroy Este evento ocurre cuando la instancia es destruida. Para ser precisos, ocurre justo antes de que sea destruida, por lo que la instancia an existe cuando el evento es ejecutado! La mayora de las veces este evento no se usa pero puedes por ejemplo emplearlo para cambiar el marcador o para crear algn otro objeto. Eventos Alarm Cada instancia tiene 8 relojes de alarma. Puedes configurar estos relojes usando ciertas acciones (ver el siguiente captulo). El reloj de alarma hace una cuenta regresiva hasta

que llega a 0, que es cuando se genera el evento de alarma. Para indicar las acciones para un reloj de alarma, necesitas primero seleccionarlo en el men. Los relojes de alarma son muy tiles. Puedes usarlos para hacer que ciertas cosas sucedan de tiempo en tiempo. Por ejemplo un enemigo puede cambiar su direccin de movimiento cada 20 pasos. (En cuyo caso una de las acciones en el evento debe configurar nuevamente la alarma). Eventos Step El evento step sucede a cada paso/frame del juego. Aqu puedes colocar acciones que requieren ejecutarse continuamente. Por ejemplo, si el objeto debe seguir a otro, puedes adaptar aqu la direccin de movimiento hacia el objeto que se est siguiendo. Sin embargo ten cuidado con este evento. No coloques muchas acciones muy complicadas en el evento step. Esto podra alentar el juego. Para ser ms preciso, hay tres diferentes eventos step. Normalmente solo necesitas el evento por defecto. Pero usando el men puedes tambin seleccionar el inicio y el final del evento step. El inicio del evento step es ejecutado al inicio de cada paso, antes de que ocurra cualquier otro evento. El evento step normal es ejecutado justo antes de que se coloquen las instancias en sus nuevas posiciones. El final del evento step se ejecuta al final de cada paso, justo antes de que se dibuje la escena. Este evento se usa normalmente para, por ejemplo, cambiar el sprite dependiendo de la direccin actual. Eventos Collision En el momento en que dos instancias colisionan (esto es, que sus sprites se sobreponen) aparece un evento collision (colisin). Bien, para ser precisos, ocurren dos eventos de colisin, uno por cada instancia. La instancia puede reaccionar a este evento de colisin. Para este fin, selecciona en el men el objeto con el cual quieres definir el evento de colisin. Despus coloca las acciones. Hay una diferencia entre lo que sucede cuando la instancia colisiona con un objeto slido y cuando lo hace con uno no slido. Primero que nada, cuando no hay acciones en el evento de colisin, no sucede nada. La instancia actual simplemente contina movindose; an cuando el otro objeto sea slido. Cuando el evento de colisin contiene acciones sucede lo siguiente: Cuando el otro objeto es slido, la instancia se coloca de vuelta al lugar previo (antes de que ocurriera la colisin). Entonces se ejecuta el evento. Finalmente, la instancia es llevada a su nueva posicin. As que si por ejemplo, el evento invierte la direccin de movimiento, la instancia rebota contra la pared sin detenerse. Si hay una nueva colisin, la instancia se mantiene en su lugar previo. De manera que efectivamente deje de moverse. Cuando el otro objeto no es slido, la instancia no se regresa. El evento simplemente se ejecuta con la instancia en su posicin actual. Tampoco se checa una nueva colisin. Si lo piensas, esto es lo que debera ocurrir lgicamente. Porque cuando el objeto no es slido, podemos simplemente movernos sobre l. El evento nos notifica lo que est sucediendo.

Existen muchos usos para el evento collision. Las instancias pueden usarlo para rebotar contra las paredes. Puedes usarlo para destruir algn objeto cuando es tocado por una bala, etc. Eventos Keyboard Cuando el usuario presiona una tecla, ocurre un evento keyboard para todas las instancias de todos los objetos. Hay un evento diferente para cada tecla. En el men puedes seleccionar la tecla para la que quieres definir el evento de teclado y despus arrastrar las acciones. Es claro que solo unos cuantos objetos necesitan eventos para unas cuantas teclas. Se tiene un evento en cada paso cuando el jugador presiona la tecla. Hay dos eventos de teclado especiales. Uno es el <No key>. Este evento ocurre en cada paso cuando no hay ninguna tecla presionada. El segundo se llama <Any key> y ocurre cuando se presiona cualquier tecla. A propsito, cuando el usuario presiona varias teclas, ocurren los eventos para todas ellas. Las teclas en el teclado numrico solo producen sus eventos correspondientes cuando <BloqNum> est activada. Eventos Mouse Un evento mouse ocurre para una instancia cuando el cursor del ratn se encuentra sobre el sprite que representa a la instancia. Dependiendo de qu botn se presione, se obtienen los eventos no button (ningn botn), left button (botn izquierdo), right button (botn derecho), o middle button (botn central). Estos eventos son generados en cada paso mientras el jugador mantenga el botn del ratn presionado. Los eventos press se generan una sola vez cuando el botn es presionado. Recuerda que estos eventos slo ocurren cuando el ratn est sobre la instancia. Si el jugador presiona un botn del ratn en algn lugar donde no haya ninguna instancia, no se genera el evento. Pero en ocasiones es importante reaccionar a cualquier clic del ratn. Esto puede conseguirse creando un sprite del tamao del cuarto. Ahora crea un objeto con el sprite que cubre todo el cuarto. Puedes hacer a este objeto invisible. Colcalo en el cuarto, y generar eventos en cualquier momento que el jugador presione algn botn del ratn. Otros eventos Hay otros eventos que pueden ser tiles en ciertos juegos. Los encuentras en este men. Los eventos que puedes encontrar son: Outside: Este evento ocurre cuando la instancia se encuentra completamente fuera del cuarto. Este es normalmente un buen momento para destruirla. Boundary: Este evento ocurre cuando la instancia llega al borde del cuarto. Game start: Este evento se genera para todas las instancias en el primer cuarto donde inicia el juego. Ocurre antes que el evento room start (ver abajo) y an antes de los eventos create de las instancias en el cuarto. Este evento se define normalmente en un solo objeto controlador y se usa para reproducir alguna msica de fondo y para dar valores iniciales a algunas variables, o para cargar informacin Game end: El evento ocurre para todas las instancias cuando termina el juego. De nuevo, es comn que solo un objeto lo defina. Se emplea por ejemplo para guardar cierta informacin en un archivo.

Room start: Este evento se genera para todas las instancias (en el cuarto) cuando se inicia un cuarto. Ocurre antes que los eventos de creacin. Room end: Este evento se genera para todas las instancias existentes cuando finaliza el cuarto. No more lives: El Game Maker tiene un sistema de vidas interno. Hay una accin para especificar y cambiar el nmero de vidas. En el momento que el nmero de vidas sea menor o igual a 0, se genera este evento. Normalmente empleado para terminar o reiniciar el juego. No more health: El Game Maker tiene un sistema interno de energa. Hay una accin para especificar y cambiar el nivel de energa. En el momento que la energa sea menor o igual a 0, ocurre este evento. Normalmente se emplea para disminuir el nmero de vidas o para reiniciar el juego. End of animation: Como se indic antes, una animacin consiste en varias imgenes que se muestran una despus de otra. Despus de que se muestra la ltima se inicia nuevamente con la primera. El evento ocurre en ese preciso momento. Esto se puede usar para por ejemplo cambiar la animacin, o destruir la instancia. End of path: Este evento ocurre cuando la instancia que sigue una trayectoria predeterminada (path) llega al final de la misma. Ve al Captulo 18 para encontrar ms informacin sobre las trayectorias. User defined: Hay ocho de estos eventos. Normalmente nunca ocurren a menos que t mismo los llames desde alguna pieza de cdigo.

Evento Drawing Las instancias, cuando son visibles, dibujan su sprite en la pantalla en cada paso. Cuando especificas acciones en el evento de dibujo, no se dibuja el sprite, sino que se ejecutan estas acciones en su lugar. Esto se puede usar para dibujar algo ms que un sprite, o para primero hacer algunos cambios a los parmetros del sprite. Hay varias acciones de dibujo especialmente diseadas para usarse en el evento drawing. Recuerda que el evento drawing se ejecuta solamente cuando el objeto es visible. Tambin recuerda que, independientemente de lo que dibujes aqu, los eventos de colisin se basan en el sprite que est asociado a la instancia Eventos Key press Este evento es similar al evento keyboard con la diferencia de que ste ocurre solo una vez cuando se presiona la tecla, y no continuamente. Este es til cuando deseas que una accin ocurra solo una vez. Eventos Key release Este evento es similar al evento keyboard, pero ocurre solo una vez cuando la tecla es liberada, en lugar de ocurrir continuamente. En algunas situaciones es importante conocer el orden en el cual el Game Maker procesa los eventos. Como sigue. Eventos Begin Step

Eventos Alarm Eventos Keyboard, Key press, y Key release Eventos Mouse Eventos Step normales (ahora todas las instancias son colocadas en sus nuevas posiciones) Eventos Collision Eventos End Step Eventos Drawing

Los eventos de creacin (create), destruir (destroy) y otros son generados en el momento pertinente.

Captulo 12 Acciones
Las acciones indican lo que sucede en un juego creado con el Game Maker. Las acciones se colocan en los eventos de los objetos. Cuando el evento ocurre estas acciones se llevan a cabo, resultando en cierto comportamiento para las instancias del objeto. Hay una gran cantidad de acciones disponibles y es importante que entiendas lo que hacen. En este captulo describir las acciones por defecto. Acciones adicionales pueden encontrarse en libreras de acciones. Estas libreras extienden las posibilidades del Game Maker checa el sitio web por posibles libreras de acciones adicionales. Todas las acciones se encuentran en las pginas / fichas a la derecha de la ventana de propiedades de objeto. Hay siete grupos de acciones. Puedes ver el grupo haciendo clic en la ficha correcta. Cuando mantienes el ratn sobre una de las acciones, se muestra una breve descripcin para recordar su funcin. Permteme repetir brevemente: Para colocar una accin en un evento, solo arrstrala de las pginas / fichas a la lista de accin. Puedes cambiar el orden de la lista, arrastrando y soltando los iconos. Si presionas la tecla <Ctrl> mientras arrastras puedes hacer una copia de la accin. (Puedes arrastrar y copiar acciones entre las listas en diferentes ventanas de propiedades de objetos). Usa el botn derecho del ratn para borrar acciones (o usa la tecla <Supr>) o para copiar y pegar acciones. Cuando colocas una accin, la mayora de las veces aparece una ventana de dilogo, en la cual puedes especificar ciertos parmetros para la accin. Dos tipos de parmetros aparecen en muchas acciones. En la parte superior puedes indicar a qu instancia aplica la accin. El valor por defecto es self, que es la instancia para la cual se est realizando la accin. La mayora de las veces esto es lo adecuado. En el caso de un evento collision, puedes especificar tambin si se aplica la accin a la otra instancia involucrada en la colisin. De esta forma puedes por ejemplo destruir la otra instancia. Finalmente, puedes elegir si aplicas la accin a todas las instancias de un objeto. De esta manera puedes por ejemplo cambiar todas las pelotas rojas por azules. El segundo tipo de parmetro es la casilla marcada Relative. Al marcar esta casilla, los valores que introduzcas sern relativos a los valores actuales. Por ejemplo, de esta forma puedes agregar algo al marcador actual, en lugar de cambiar el marcador actual por su nuevo valor. Los otros parmetros se describen abajo. Puedes revisar despus los parmetros haciendo doble clic en la accin.

12.1

Acciones de movimiento (pgina / ficha move)

El primer grupo de acciones consiste de aquellas relacionadas al movimiento de objetos. Tenemos las siguientes: Start moving in a direction Usa esta accin para que la instancia empiece a moverse en una direccin en particular. Puedes indicar la direccin usando las flechas. Usa el botn del medio para detener el movimiento. Tambin debes especificar la velocidad de movimiento. Esta velocidad est

dada en pixeles por paso. El valor por defecto es de 8. De preferencia no uses valores de velocidad negativos. Puedes especificar mltiples direcciones. En este caso se elige una al azar. De esta forma puedes por ejemplo hacer que un enemigo se mueva hacia la izquierda o hacia la derecha. Set direction and speed of motion Esta es la segunda forma en la que puedes especificar un movimiento (con las flechas azules). Aqu puedes indicar una direccin con ms precisin. Con un ngulo de entre 0 y 360 grados. 0 significa hacia la derecha. La direccin es contra las manecillas del reloj. As por ejemplo 90 indica la direccin hacia arriba. Si quieres una direccin arbitraria, puedes poner random(360). Como vers ms abajo la funcin random da un nmero al azar menor que el valor indicado. Como podrs haber notado hay una casilla llamada Relative. Si la seleccionas, el nuevo movimiento es sumado al anterior. Por ejemplo, si la instancia se est moviendo hacia arriba y le agregas un pequeo movimiento hacia la izquierda, el nuevo movimiento ser hacia arriba y a la izquierda. Set the horizontal speed La velocidad de una instancia consiste de una parte horizontal y otra vertical. Con esta accin puedes cambiar la velocidad horizontal. Una velocidad horizontal positiva representa movimiento hacia la derecha. Una negativa movimiento hacia la izquierda. La velocidad vertical permanecer constante. Usa la opcin Relative para incrementar la velocidad horizontal (o disminuirla introduciendo un valor negativo). Set the vertical speed De manera similar, con esta accin puedes cambiar la velocidad vertical de la instancia. Move towards a point Esta accin da otra manera de especificar movimiento. Puedes indicar una posicin y velocidad, y la instancia comienza a moverse con esa velocidad hacia ese punto. (El objeto no se detendr en ese punto!). Por ejemplo, si quieres que una bala se mueva hacia la posicin de una nave (llamada spaceship) puedes usar como posicin spaceship.x, spaceship.y. (Aprenders ms sobre el uso de variables como estas ms adelante). Si seleccionas la casilla Relative, especificas la posicin relativa a la posicin actual de la instancia. (La velocidad no es tomada como relativa!) Set a path for the instance (Only available in advanced mode.) With this action you can indicate that the instance should follow a particular path. You indicate the path, the speed and the position in the path where to start (0=beginning, 1=end). See 0 for more information on paths. Set the gravity Con esta accin puedes especificar una gravedad para un objeto en particular. Especificas una direccin (un ngulo entre 0 y 360 grados) y una velocidad, y a cada paso esta

cantidad de velocidad en la direccin especificada se aumenta al movimiento actual de la instancia del objeto. Normalmente necesitas un muy pequeo incremento de velocidad (como 0.01). Normalmente se emplea una direccin hacia abajo (270 grados). Si seleccionas la casilla Relative incrementas la velocidad de gravedad y la direccin. Nota que, contrario a la vida real, diferentes objetos pueden tener diferentes direcciones de gravedad. Set the friction La friccin disminuye la velocidad de las instancias cuando se mueven. Puedes especificar la cantidad de friccin. En cada paso esta cantidad se resta de la velocidad hasta llegar a 0. Normalmente usas un nmero muy pequeo (como 0.01). Jump to a given position Usando esta accin puedes colocar una instancia en una posicin en particular. Simplemente especificas las coordenadas x y y, y la instancia es colocada con su punto de referencia en esa posicin. Si la casilla Relative est marcada, la posicin es relativa a la posicin actual de la instancia. Jump to the start position Esta accin coloca la instancia de vuelta a la posicin donde fue creada. Jump to a random position Esta accin mueve la instancia a una posicin aleatoria cuarto. Solo se usan posiciones en donde la instancia no intercepte ninguna instancia slida. Puedes especificar la rapidez (snap) usada. Si especificas valores positivos, las coordenadas sern elegidas con mltiplos enteros de los valores indicados. Esto puede ser usado por ejemplo para mantener una instancia alineada con las celdas de tu juego (si la hay). Puedes especificar la rapidez horizontal y la vertical por separado. Snap to grid Con esta accin puedes alinear la posicin de una instancia a una cuadrcula. Puedes indicar los valores horizontal y vertical (esto es, el tamao de las celdas de la cuadrcula). Esto puede ser muy til para asegurarte que las instancias se mantengan en una cuadrcula. Reverse horizontal direction Con esta accin inviertes el movimiento horizontal de la instancia. Esto lo puedes usar por ejemplo cuando el objeto colisiona con una pared vertical. Reverse vertical direction Con esta accin inviertes el movimiento vertical de la instancia. Esto lo puedes usar por ejemplo cuando el objeto colisiona con una pared horizontal.

Move to contact position With this action you can move the instance in a given direction until a contact position with an object is reached. If there already is a collision at the current position the instance is not moved. Otherwise, the instance is placed just before a collision occurs. You can specify the direction but also a maximal distance to move. For example, when the instance is falling you can move a maximal distance down until an object is encountered. You can also indicate whether to consider solid object only or all objects. You typically put this action in the collision event to make sure that the instance stops in contact with the other instance involved in the collision. Bounce against objects Cuando colocas esta accin en el evento collision de algn objeto, la instancia rebota en este objeto de manera natural. Si configuras el parmetro precise como falso, solo las paredes horizontales y verticales se tratan correctamente. Cuando configuras precise a verdadero tambin se tratan las paredes inclinadas (y an las curveadas) de manera correcta. Sin embargo esto es ms lento. Tambin puedes indicar si el objeto rebotar solo contra objetos slidos o contra todos los objetos. Por favor nota que el rebote no es completamente correcto porque depende de muchas propiedades. Pero en muchas situaciones el efecto es lo suficientemente bueno.

12.2

Acciones principales, grupo 1 (pgina / ficha main1)

El siguiente grupo de acciones est relacionado con la creacin, el cambio y la destruccin de las instancias de objetos. Create an instance of an object Con esta accin puedes crear una instancia de un objeto. Debes especificar el objeto a crear y la posicin para la nueva instancia. Si marcas la casilla Relative, la posicin es relativa a la posicin de la instancia actual. La creacin de instancias durante el juego es muy til. Una nave crea balas; una bomba puede crear una explosin, etc. En muchos juegos tendrs un objeto de control que cada cierto tiempo crear enemigos u otros objetos. El evento de creacin es ejecutado para la nueva instancia al crearse. Change the instance Con esta accin puedes cambiar la instancia actual por otro objeto. Por ejemplo, puedes cambiar una instancia de una bomba en una explosin. Todos los parmetros, como el movimiento o los valores de variables, se mantendrn iguales. Puedes indicar si llevar a cabo o no el evento de destruccin para el objeto actual y el evento de creacin para el nuevo. Destroy the instance Con esta accin destruyes la instancia actual. Ese ejecuta el evento de destruccin de la instancia.

Destroy instances at a position Con esta accin puedes destruir todas las instancias cuya caja lmite contiene una posicin dada. Esto es til por ejemplo cuando empleas la explosin de una bomba. Cuando marcas la casilla Relative, la posicin es relativa a la posicin de la instancia actual. Change the sprite Usa esta accin para cambiar el sprite de la instancia. Debes indicar un nuevo sprite. Tambin puedes indicar un factor de escalado. Un factor de 1 significa que el sprite no es escalado. El factor de escalado debe ser mayor que 0. Por favor recuerda que el escalado reducir la velocidad del dibujo. El cambio de sprites es una caracterstica importante. Por ejemplo, a menudo querrs cambiar el sprite de un personaje de acuerdo a la direccin a la que se dirige. Esto se puede lograr haciendo diferentes sprites para cada una de las (cuatro) direcciones. En los eventos del teclado para las teclas del cursor estableces la direccin de movimiento y el sprite. Play a sound Con esta accin reproduces uno de los recursos de sonido que agregaste al juego. Puedes indicar el sonido a reproducir y si debiera reproducirse solo una vez (el valor por defecto) o hacerlo continuamente Se pueden reproducir varios archivos wave al mismo tiempo, pero slo puede reproducirse un midi a la vez. As que si inicia el sonido de un midi, el midi actual se detiene. A menos que el sonido tenga mltiples buffers (ve el Captulo 17) solo se puede reproducir una instancia del sonido. Por lo que si el mismo sonido se est reproduciendo, se detiene y vuelve a empezar. Stop a sound Esta accin detiene el sonido indicado. Si hay varias instancias del sonido reproducindose, todas son detenidas. If a sound is playing If the indicated sound is playing the next action is performed. Otherwise it is skipped. You can select Not to indicate that the next action should be performed if the indicated sound is not playing. For example, you can check whether some background music is playing and, if not, start some new background music. For more information on actions that test certain questions, see Section Error! No se encuentra el origen de la referencia.. Go to previous room Ir al cuarto anterior. Puedes indicar el tipo de transicin entre los cuartos. Experimenta para que veas cul es el que te agrada. Si ests en el primer cuarto, se da un error. Go to next room Ir al siguiente cuarto. Puedes indicar la transicin

Restart the current room Se reinicia el cuarto actual. Puedes indicar el efecto de transicin. Go to a different room Con esta accin vas a un cuarto en particular. Puedes indicar el cuarto y el efecto de transicin. If previous room exists This action tests whether the previous room exists. If so, the next action is executed. You normally need this test before moving to the previous room. If next room exists This action tests whether the next room exists. If so, the next action is executed. You normally need this test before moving to the next room.

12.3

Acciones principales, grupo 2 (pgina/ficha main2)

Aqu tenemos algunas acciones ms, relacionadas con el tiempo, mostrar mensajes al usuario, y al juego en conjunto. Set an alarm clock Con esta accin puedes configurar uno de los ocho relojes de alarma para la instancia. Puedes indicar el nmero de pasos y la alarma. Despus del nmero indicado de pasos, la instancia recibir el correspondiente evento de alarma. Tambin puedes incrementar o decrementar el valor marcando la casilla Relative. Si configures la alarma a un valor menor o igual que 0 la desactivas, por lo que no se genera el evento. Sleep for a while Con esta accin puede congelar la escena por un cierto tiempo. Esto usualmente se usa al inicio de un nivel o cuando le das algn mensaje al jugador. Especificas el nmero de milisegundos a pausar. Tambin indicas si la pantalla debiera ser dibujada primero para mostrar la situacin ms reciente. Set a time line (Only available in advanced mode.) With this action you set the particular time line for an instance of an object. You indicate the time line and the starting position within the time line (0 is the beginning). You can also use this action to end a time line by choosing No Time Line as value. Set the time line position

(Only available in advanced mode.) With this action you can change the position in the current time line (either absolute or relative). This can be used to skip certain parts of the time line or to repeat certain parts. For example, if you want to make a looping time line, at the last moment, add this action to set the position back to 0. You can also use it to wait for something to happen. Just add the test action and, if not true, set the time line position relative to -1. Display a message Con esta accin puedes mostrar un mensaje en una ventana de dilogo. Simplemente tecleas el mensaje. Si usas el smbolo # en el texto del mensaje ser interpretado como un carcter de nueva lnea. Si el mensaje empieza con una comilla o dobles comillas, se interpreta como una expresin. Ve abajo para tener ms informacin sobre las expresiones. (Nota que esta accin no funciona cuando el juego es ejecutado en modo exclusivo, ve el Captulo 26) Show the game information Con esta accin puedes mostrar la ventana de informacin del juego. Ve el Captulo 25 para tener ms informacin acerca de cmo crear la informacin del juego. (Esta accin no funciona cuando el juego se ejecuta en modo exclusivo). Restart the game Con esta accin puedes reiniciar el juego desde el principio. End the game Con esta accin termina el juego. Save the game Con esta accin puedes guardar el estado actual del juego. Especificas el nombre del archivo a guardar (el archivo es creado en la carpeta de trabajo del juego). Despus el juego puede ser cargado con la siguiente accin. Load the game Carga el estado del juego desde un archivo. Aqu especificas el nombre del archivo. Asegrate de que el juego guardado corresponde al mismo juego y que fue creado con la misma versin del Game Maker. De otra manera pudiera haber errores (para ser precisos, el juego se carga en el evento step actual. Por lo que an se realizan algunas acciones despus de esta an son realizadas en el juego actual, no en el cargado!

12.4

Control

Hay varias acciones con las que puedes controlar qu otras acciones se llevan a cabo. La mayora de estas acciones hacen una pregunta, por ejemplo si es que una posicin est vaca. Cuando la respuesta es yes (true) se ejecuta la siguiente accin, de otra forma se

salta esa accin. Si quierers que se ejecuten o salten varias acciones basndote en el resultado puedes colocarlas dentro de un bloque. Tambin puede haber una parte else, la cual se ejecuta cuando la respuesta es no. As, una pregunta normalmente tiene la siguiente estructura:

Aqu se pregunta si una posicin para la instancia actual est libre de colisin. De ser as, la instancia comienza a moverse en una direccin dada. Si no, la instancia es movida a una posicin dada. Para todas las preguntas hay un campo marcado NOT. Si lo marcas, el resultado de la pregunta se invierte. Esto es, si el resultado era verdadero se vuelve falso, y si era falso, se vuelve verdadero. Esto te permite realizar ciertas acciones cuando una pregunta no es verdadera. Para muchas preguntas puedes indicar si deben aplicar a todas las instancias de un objeto en particular. En este caso el resultado es verdadero solo si es verdadero para todas las instancias del objeto. Por ejemplo, puedes checar si para todas las pelotas la posicin ligeramente a la derecha est libre de colisin. Las siguientes preguntas y acciones relacionadas estn disponibles. (Nota que todas ellas tienen un icono con forma y color de fondo diferentes de manera que puedan ser distinguidos ms fcilmente de otras acciones). If a position is collision free Esta pregunta devuelve verdadero si la instancia actual, colocada en la posicin indicada no provoca una collision con algn objeto. Puedes especificar si la posicin es absoluta o relativa. Puedes tambin indicar si solo los objetos slidos o todos los objetos debieran

ser tomados en cuenta. Esta accin es normalmente empleada para checar si la instancia se puede mover a una posicin en particular. If there is a collision at a position Esta es la inversa de la accin anterior. Devuelve verdadero si hay una colisin cuando la instancia actual es colocada en la posicin indicada (de nuevo, ya sea slo con objetos slidos o con toda clase de objetos). If there is an object at a position Esta pregunta devuelve verdadero si la instancia colocada en la posicin indicada encuentra una instancia del objeto indicado. If the number of instances is a value Especificas un objeto y un nmero. Si el nmero de instancias del objeto es igual al nmero la pregunta devuelve verdadero. De otra forma devuelve falso. Puedes tambin indicar que la revisin debiera ser si el nmero de instancias es menor o mayor que el valor. Esto se usa normalmente para checar si todas las instancias de un tipo en particular han desaparecido. Este es normalmente el momento de terminar el nivel o el juego. If a dice lands on one Especificas el nmero de lados del dado. Entonces si el dado cae en uno, el resultado es verdadero y se realiza la accin. Esto se puede emplear para agregar cierta aleatoriedad en tu juego. Por ejemplo, en cada paso puedes generar con cierta probabilidad una bomba o un cambio de direccin. Entre mayor sea el nmero de lados del dado, la probabilidad es menor. Puedes emplear nmeros reales. Por ejemplo, si configuras el nmero de lados a 1.5 la siguiente accin se realizar dos de tres veces. El emplear un nmero menor que 1 no tiene sentido. If the user answers yes to a question Especificas una pregunta. Se muestra una ventana de dilogo al usuario con dos botones: Yes y No. El resultado es verdadero si el jugador contesta yes. Esta accin no puede ser empleada en modo exclusivo; la respuesta entonces sera siempre yes. If an expression is true Puedes introducir una expresin. Si la expresin se evala como verdadera (esto es, un nmero mayor o igual a 0.5) se realizar la siguiente accin. Ve ms abajo para ms informacin sobre las expresiones. If a mouse button is pressed Devuelve verdadero si el botn indicado del ratn es presionado. Un uso estndar est en el evento paso. Puedes checar si un botn del ratn est presionado, y si es as, por ejemplo moverte a esa posicin (usa la accin jump to a point con los valores mouse_x and mouse_y).

If instance is aligned with grid Devuelve verdadero si la posicin de la instancia se encuentra sobre una cuadrcula. Especificas el espaciado horizontal y vertical de la cuadrcula. Esto es muy til cuando ciertas acciones, como el dar una vuelta, no son permitidas cuando se est alineado a una posicin en la cuadrcula. Else Detrs de esta accin sigue el else, que se ejecuta cuando el resultado de la pregunta es falso. Start of block Indica el inicio de un bloque de acciones. End of block Indica el final de un bloque de acciones. Repeat next action Esta accin se emplea para repetir la siguiente accin (o bloque de acciones) cierto nmero de veces. Puedes simplemente indicar el nmero. Exit the current event Cuando se encuentra esta accin, no se realiza ninguna otra en el evento. Normalmente se emplea despus de una pregunta. Por ejemplo, cuando una posicin est libre no se necesita hacer nada por lo que salimos del evento. En este ejemplo, las acciones siguientes son solo ejecutadas cuando hay una colisin.

12.5

Acciones de dibujo

Las acciones de dibujo slo tienen efecto en el evento Draw. En otros eventos son simplemente ignoradas. Por favor recuerda que el dibujar otras cosas adems de sprites y fondos es relativamente lento. As que usa esto slo cuando sea estrictamente necesario. Draw a sprite image Indicas el sprite, la posicin (ya sea absoluta o relativa a la posicin actual de la instancia) y la subimagen del sprite. (Las subimgenes estn numeradas de 0 hacia arriba). Si quieres dibujar la subimagen actual, usa el nmero 1. Draw a background image Indicas la imagen de fondo, la posicin (absoluta o relativa) y si la imagen debe o no repetirse en todo el cuarto.

Draw a rectangle Indicas las coordenadas de las dos esquinas opuestas del rectngulo; ya sean absolutas o relatives a la posicin actual de la instancia. Draw an ellipse Indicas las coordenadas de las dos esquinas opuestas del rectngulo alrededor de la elipse; ya sean absolutas o relatives a la posicin actual de la instancia. Draw a line Indicas las coordenadas de los dos extremos de la lnea; ya sean absolutas o relatives a la posicin actual de la instancial. Draw a text Indicas el texto y la posicin. Un smbolo # en el texto se interpreta como el inicio de una nueva lnea. (Usa \# para mostrar el smbolo #). Por lo que puedes crear texto multilnea. Si el texto inicia con comilla simple o doble, es interpretado como una expresin. Por ejemplo, puedes usar
'X: ' + string(x)

para mostrar el valor de la coordenada x de la instancia. (La variable x guarda la coordenada x actual. La funcin string() convierte este nmero en una cadena. + combina las dos cadenas). Set the colors Te permite seleccionar el color usado para rellenar los rectnguos y elipses, y el color empleado para las lneas alrededor de los rectngulos y elipses y para dibujar una lnea. Set a font for drawing text Puedes configurar la fuente que a partir de este momento se emplear para dibujar texto. Change full screen mode Con esta accin puedes cambiar el modo de la pantalla de ventana a pantalla completa y viceversa. Puedes indicar si se cambia entre modos o si cambiar a modo de ventana o a modo a pantalla completa. (No funciona en modo exclusivo).

12.6

Acciones de score

En la mayora de los juegos el jugador tendr cierto score. Tambin muchos juegos le dan al jugador cierto nmero de vidas. Finalmente, a menudo el jugador cuenta con cierto nivel de energa. Las siguientes acciones permiten manejar de manera sencilla el score, las vidas y la energa del jugador.

Set the score El Game Maker tiene un mecanismo interno de score. El score normalmente se muestra en el ttulo de la ventana. Puedes usar esta accin para cambiar el score. Simplemente introduces un nuevo valor para ste. A menudo querrs agregar puntos al score. En este caso no olvides seleccionar la opcin Relative. If score has a value Con esta pregunta puedes checar si el score ha alcanzado un valor en particular. Puedes indicar el valor y si el score debe ser igual, menor o mayor a ese valor. Draw the value of score Con esta accin puedes dibujar el valor del score en cierta posicin de la pantalla. Proporcionas la posicin y el ttulo que se mostrar antes del score. El score se dibuja con la fuente actual. Esta accin slo puede emplearse en el evento draw de algn objeto. Clear the highscore table Esta accin limpia la tabla de rcords. Display the highscore table Cada juego guarda los diez mejores scores. Esta accin muestra la lista de rcords. Si el score actual est entre los mejores diez, el nuevo score se inserta y el jugador puede introducir su nombre. Puedes indicar la imagen de fondo a usar, si la ventana tendr borde, el color para la nueva y las otras entradas, y la fuente a emplear. (Esta accin no funciona en modo exclusivo!) Set the number of lives El Game Maker tambin cuenta con un sistema interno de vidas. Con esta accin puedes cambiar el nmero de vidas que quedan. Normalmente lo pones a un valor como 3 al inicio del juego y lo aumentas o disminuyes dependiendo de lo que ocurra. No olvides seleccionar la opcin Relative si deseas agregar o restar al nmero de vidas. En el momento en que el nmero de vidas llegue a 0 (o menos que 0) se genera un evento no more lives. If lives is a value Con esta pregunta puedes checar si el nmero de vidas ha llegado a un cierto valor. Puedes indicar el valor y si el nmero de vidas debe ser igual, menor o mayor a ese valor. Draw the number of lives Con esta accin puedes dibujar en pantalla en nmero de vidas. Das la posicin y el ttulo que se colocar antes del nmero de vidas. El nmero de vidas se dibuja con la fuente actual. Esta accin slo puede ser usada en el evento draw de algn objeto.

Draw the lives as image En lugar de indicar el nmero de vidas con un nmero, es mejor usar pequeas imgenes para indicar las vidas. Esta accin hace eso precisamente. Especificas la posicin y la imagen, y en la posicin indicada se dibuja el nmero de vidas como imgenes. Esta accin slo puede emplearse en el evento draw de un objeto. Set the health El Game Maker tiene un mecanismo interno de energa. Puedes emplear esta accin para cambiar la energa. Un valor de 100 se considera como energa completa y 0 es sin energa. Simplemente das un nuevo valor para la energa. A menuco querrs restar algo a la energa. En este caso no olvides seleccionar la opcin Relative. Cuando la energa sea igual o menor que 0 se genera un evento out of health. If health is a value Con esta pregunta puedes checar si la energa ha alcanzado cierto valor. Indicas el valor y si la energa debe ser igual, menor o mayor que ese valor. Draw the health bar Con esta accin puedes dibujar la energa en forma de una barra. Cuando la energa es 100 la barra es dibujada completa. Cuando es 0 la barra est vaca. Puedes indicar la posicin y el tamao de la barra de energa y el color para la barra y el fondo de la misma. Set the window caption information Normalmente en el ttulo de la ventana se muestra el nombre del cuarto y el score. Con esta accin puedes cambiar esto. Puedes indicar si se muestra o no el score, las vidas, la energa y los ttulos para estas opciones.

12.7

Acciones relacionadas con cdigo

Finalmente hay varias acciones que tienen que ver principalmente con cdigo. Execute a script (Slo disponible en modo advanced.) Con esta accn puedes ejecutar un script que hayas agregado al juego. Indicas el script y como mximo 5 argumentos para el mismo. Ve el captulo 23 para ms informacin sobre los scripts. Execute a piece of code Cuando agregas esta accin, se muestra una ventana en la que puedes introducir unz pieza de cdigo. ste funciona en la misma forma que definir scripts (ve el Captulo 23). La nica diferencia es que puedes indicar para qu instancias se debe ejecutar el cdigo. Usa esta accin para pequeas piezas de cdigo. Para piezas ms largas se te recomienda usar scripts.

Set the value of a variable Hay muchas variables internas en el juego. Con esta accin puedes cambiar sus valores. Tambin puedes crear tus propias variables y asignarles valores. Indicas el nombre de la variable y un nuevo valor. Cuando seleccionas la opcin Relative, el valor se suma al valor actual de la variable. Por favor nota que esto slo puede usarse si la variable ya tiene un valor asignado!. Ve ms adelante para ms informacin sobre las variables. If a variable has a value Con esta accin puedes checar cul es el valor cierta variable. Si el valor de la variable es igual al nmero introducido, la pregunta devuelve true. En cualquier otro caso devuelve false. Puedes indicar si se checar si la el valor es menor o mayor que el dado. Ve abajo para ms informacin sobre las variables. De hecho, tambin puedes usar esta accin para comparar dos expresiones. Draw the value of a variable Con esta accin puedes dibujar el valor de una variable en cierta posicin de la pantalla. Call the inherited event (Slo disponible en modo advanced.) Esta accin slo es til cuando el objeto tiene un padre (ve el Captulo 19). Esta accin llama al evento correspondiente en el objeto padre. Comment Usa esta accin para agregar una lnea de comentarios a la lista de acciones. La lnea se muestra en fuente cursive. No hace nada cuando se ejecuta el evento. El agregar comentarios te ayuda a recordar lo que ests haciendo en tus eventos.

12.8

Usando expresiones y variables

En muchas acciones necesitas introducir valores para algunos parmetros. En lugar de introducir un nombre, tambin puedes introducir una frumla, p. ej. 32*12. Pero de hecho, puedes introducir expresiones much ms complicadas. Por ejemplo, si quieres duplicar la velocidad horizontal, podras establecerla a 2*hspeed. Aqu hspeed es una
variable que indica la velocidad horizontal actual de la instancia. Hay muchas otras variables que puedes emplear. Algunas de las ms importantes son: x la coordenada x de la instancia y la coordenada y de la instancia hspeed la velocidad horizontal (en pixeles por step) vspeed la velocidad vertical (en pixeles por step) direction la direccin de movimiento actual en grados (0-360) speed la velocidad actual en esta direccin visible si el objeto es visible (1) o invisible (0) image_scale la cantidad de escala de la imagen (1 = no escalada)

image_single esta variable indica la subimagen del sprite que se debe mostrar;

si la pones a 1 (valor por defecto) se hace un ciclo entres las imagines, con otro valor slo la subimagen (empezando con el nmero 0) es mostrada todo el tiempo. image_speed esta variable indica la velocidad con la que se muestran las subimgenes. El valor por defecto es 1. Si haces a este valor mayor que 1 algunas subimgenes sern evitadas para hacer ms rpida la animacin. Si lo haces menor que 1 la animacin ser ms lenta. score el valor actual del score lives el nmero actual de vidas health la energa actual (0-100) mouse_x posicin x del ratn mouse_y posicin y del ratn Puedes cambiar la mayora de estas variables usando la accin set variable. Tambin puedes definir tus propias variables asignndoles un valor. (No uses relative, porque an no existen). Luego puedes emplear estas variables en expresiones. Las variables que creas son locales para la instancia actual, esto es, cada objeto tiene su propia copia de ellas. Para crear una variable global, coloca la palabra global y un punto antes de ella. Tambin te puedes hacer referencias a los valores de las variables de otros objetos colocando el nombre del objeto y un punto antes de la variable. As por ejemplo, si quieres que una pelota se mueva al lubar donde est una moneda puedes establecer la posicin a (moneda.x , moneda.y). En el caso de un evento de collision puedes hacer referencia a la coordenada x del otro objeto mediante other.x. En expresiones condicionales puedes usar comparaciones como < (menor que), >, etc. En tus expresiones puedes tambin emplear funciones. Por ejemplo, la funcin random(10) da un valor aleatorio real menor a 10. As puedes por ejemplo establecer la velocidad o la direccin de movimiento a un valor aleatorio. Hay muchas ms funciones. Para informacin ms precisa sobre expresiones y funciones ve el Captulo 28 y subsecuentes.

Captulo 13 Creando cuartos


Ahora que has definido los objetos con su comportamiento en forma de eventos y acciones, es hora de crear los cuartos o niveles en los que se llevara a efecto el juego. Cualquier juego requerir al menos un cuarto. En estos cuartos colocamos instancias de los objetos. Una vez que el juego inicia se muestra el primer cuarto y las instancias en l toman vida por las acciones en sus eventos de creacin. Hay un gran nmero de posibilidades al crear cuartos. Adems de establecer ciertas propiedades y agregar las instancias de los objetos puedes agregar fondos, definir vistas, y agregar tiles. La mayora de estas opciones se discuten ms adelante en el Captulo 20. en este captulo solamente discutiremos las opciones bsicas, el agregar instancias de objetos y la configuracin de las imgenes de fondo. Para crear un cuarto, selecciona Add Room en el menu Add. Se muestra la siguiente ventana:

A la izquierda versa tres fichas (cinco en modo advanced). La ficha objects es donde puedes agregar instancias de los objetos al cuarto. En la ficha settings puedes indicar

varias opciones para el cuarto. En la ficha backgrounds puedes configurar las imagines de fondo para el cuarto.

13.1

Agregando instancias

A la derecha en la ventana de diseo puedes ver el cuarto. Al principio est vaco, con un fondo gris. Para agregar instancias al cuarto, primero selecciona la ficha objects si no est visible. A continuacin selecciona el objeto que deseas agregar haciendo clic en el botn con icono de un menu (o haciendo clic en el area de imagen a la izquierda). La imagen del objeto aparece a la izquierda. (Nota que hay una cruz en la imagen. Esta indica cmo se alinearan las instancias con la cuadrcula). Ahora haz clic con el boton izquierdo del ratn en el area a la derecha. Aparece una instancia del objeto. ste se alinear a la cuadrcula indicada. (Puedes cambiar la cuadrcula en las opciones; ve ms abajo. Si mantienes presionada la tecla <Alt> mientras colocas la instancia no se alinear a la cuadrcula). Con el botn derecho del ratn puedes remover las instancias. De esta manera es como defines el contenido del cuarto. Si mantienes presionado el botn mientras lo arrastras sobre el cuarto, colocars o eliminars varias instancias. Como te dars cuenta, si colocas una instancia sobre otra, la primera desaparece. Normalmente sera lo que desees, pero no siempre. Esto puede evitarse al deshabilitar la opcin Delete underlying a la izquierda. Hay tres acciones que puedes realizar usando el botn derecho del ratn: cuando mantienes presionada la tecla <Ctrl> mientras haces clic sobre una instancia con el botn derecho, la instancia al fondo en esa posicin ser trada al frente. Mantener presionada la tecla <Alt> enviar al fondo la instancia que se encuentre al frente. Esto puede emplerase para cambiar las instancias sobrepuestas. Finalmente, al mantener presionada la tecla <Shift> mientras haces clic con el botn derecho eliminar todas las instancias en esa posicin, no slo la del frente. Hay cuatro tiles botones en la ficha a la izquierda. Cuando presionas el botn Clear se borrarn todas las instancias del cuarto. Cuando presionas el botn Shift puedes mover a todas las instancias cierto nmero de pixeles. Usa valores negativos para moverlas hacia la izquierda o hacia arriba. Esto es til cuando decidiste p. ej. agrandar el cuarto. (Tambin puedes usar esto para colocar instancias fuera del cuarto, lo cual es til en ciertas ocasiones). Finalmente hay dos botones para ordenar las instancias por la coordenada X o la Y. Esto es til cuando se colocan instancias que se sobreponen parcialmente.

13.2

Configuracin del cuarto

Cada cuarto tiene ciertas opciones que puedes cambiar haciendo clic en la ficha settings. Slo trataremos las ms importantes aqu. Cada cuarto tiene un nombre, major dale uno con sentido. Tambin hay un ttulo. Este ttulo se muestra en la ventana cuando se ejecuta el juego. Puedes establecer el ancho y alto del cuarto (en pixeles). Tambin puedes configurar la velocidad del juego. Este ese l

nmero de pasos por segundo. Entre ms velocidad, ms suave ser el movimiento. Pero necesitars una computadora ms rpida para ejecutarlo. En la parte inferior de la ficha settings puedes indicar el tamao de las celdas de la cuadrcula usada para alinear los objetos. Al hacer clic en el botn Show puedes indicar si p. ej. Mostrar las lneas de la cuadrcula. (Tambin puedes indicar aqu si se muestran los fondos, etc. A veces es til ocultar ciertos aspectos del juego).

13.3

Configurando el fondo

Con la ficha backgrounds puedes establecer la imagen de fondo para el cuarto. De hecho, puedes indicar varios fondos. La ficha se ve como sigue: En la parte superior versa el color de fondo. Puedes hacer clic sobre este para cambiarlo. El color de fondo slo es til si no usas una imagen de fondo que cubra todo el cuarto. De otra forma, mejor inhabilita la opcin Draw background color ya que significara una prdida de tiempo. Arriba versa una lista de 8 fondos. Puedes definir cada uno de ellos pero la mayora de las veces slo necesitaras uno o dos. Para definir un fondo, primero selecciona uno en la lista. A continuacin marca la opcin Visible when room starts o de otra forma no lo vers. El nombre del fondo se pondr en negritas cuando est definido. Ahora indica una imagen de fondo en el menu. Hay ciertas opciones que puedes cambiar. Primero que nada puedes indicar si la imagen de fondo se repetir horizontal y/o verticalmente. Puedes tambin indicar la posicin del fondo en el cuarto (esto tambin influir el tiling). Finalmente puedes hacer que el fondo se desplace dndole una velocidad horizontal o vertical (pixeles por step). Hay una opcin ms llamada Foreground image. Cuando la activas, el fondo se colocar en primer plano, y se dibujar al frente de todo en lugar de detrs de todo. Obviamente una imagen de este tipo debiera ser parcialmente transparente para que tenga alguna utilidad.

Captulo 14 Distribuyendo tu juego


Con la informacin de los captulos anteriores puedes crear tus juegos. Una vez que hayas creado un buen juego probablemente quieras darlo a otras personas para que lo jueguen. Puedes distribuir libremente y en la forma que desees los juegos que crees con el Game Maker. Incluso puedes venderlos. Lee el acuerdo de licencia adjunto para ms informacin al respecto. Bsicamente hay tres diferentes formas en las que puedes distribuir tus juegos. La manera ms fcil es simplemente dar el archivo *.gmd que contiene el juego. Sin embargo la otra persona debe tener el Game Maker. (No se te permite distribuir el Game Maker con tu juego peros ellos pueden bajarlo gratuitamente desde el sitio web). Adems, la otra persona puede hacer cambios al juego. La segunda forma es crear un ejecutable del juego. Esto puede hacerse seleccionando la opcin Create Executable en el menu File. Se te pedir un nombre para el ejecutable que contendr el juego. Indica un nombre, presiona OK y tendrs un juego ejecutable que puedes dar a quien t quieras. Puedes configurar el icono para el juego ejecutable en la ventana Game Options. (Si tu juego usa algn otro archivo debieras copiarlos a la carpeta que contiene el ejecutable del juego). Ahora debieras distribuir este archivo a otras personas (tal vez quieras comprimirlo antes). La tercera opcin es crear un archivo de instalacin. Hay varios programas freeware para la creacin de instaladores disponibles en la red. Lo primero es crear una versin ejecutable del juego y luego emplear el instalador para crear una instalacin. Cmo se haga esto depende del instalador que emplees.

Captulo 15 Modo avanzado


Hasta ahora hemos considerado las opciones ms simples de Game Maker. Pero hay muchas mas posibilidades. Para habilitarlas debes ejecutar Game Maker en Modo Avanzado (Advanced Mode). Es fcil de cambiar. En el Men File, click en el tem Advanced Mode. (Para ver los cambios debes reiniciar Game Maker o al menos guardar tu juego y volver a cargarlo) Cuando comience Game Maker en Advanced Mode, el siguiente formulario se mostrara:

Contiene todo lo que estaba en Simple Mode, pero hay un nmero de recursos adicionales, botones e tems de men. Tambin, como veremos en los siguientes captulos los diferentes recursos tienen opciones adicionales. All analizaremos los diferentes tems del men.

15.1

Men File

En el Men File puedes encontrar los siguientes comandos: Import Scripts (Importar Scripts): Se usa para importar tiles scripts desde archivos. Esto ser analizado con ms detalles en el capitulo 21. Export Script (Exportar Scripts): Se usa para guardar scripts en archivos para que puedan ser usados por otros. Otra vez, chequea el capitulo 21. Merge Game (Unir Scripts): Con este comando puedes unir todos los recursos (sprites, sonidos, objetos, cuartos, etc.) de otro juego en tu actual proyecto. Esto es bastante til se deseas hacer algo que quieras volver a usar (Ej.: Men Systems). (Fjate que todos los recursos, instances y tiles tendrn nuevos nombres lo que puede causar problemas si los usas en scripts).Es tu responsabilidad hacer que sea

seguro que los recursos en los dos diferentes archivos tengan distintos nombres, de otro modo, podran aparecer problemas. Preferences (Preferencias): Aqu t puedes poner un nmero de preferencias sobre Game Maker. Estas sern recordadas entre diferentes llamadas de Game Maker. Las siguientes preferencias se podrn elegir: o Show recently edited games in the file men (Mostrar los juegos recientemente editados en el Men File): Si esta chequeada los ocho juegos mas recientemente editados sern mostrados debajo de recent files en el Men File. o Load last opened file on startup (Cargar el ltimo abierto en el comienzo): Si esta chequeada cuando comiences Game Maker el archivo abierto ms recientemente ser abierto automticamente. o Keep backup copies of files (Crear copias de respaldo): Si esta chequeada el programa creara copias de respaldo de tu juego con las extensiones ba0ba9. Puedes abrir esos juegos con Game Maker. o Maximal number of backups (Mximo numero de copias): Aqu indicas cuantas (1-9) diferentes copias de respaldo deben ser recordadas por el programa. o Hide the designer and wait while the game is running (Ocultar el diseador y esperar mientras el juego se este ejecutando): Si esta chequeada, cundo ejecutes un juego, la ventana designer desaparerecera y volver cuando el juego sea terminado. o Run games in secure mode (Ejecutar el juego en modo seguro): Si esta chequeada, cualquier juego creado con Game Maker que rule en tu maquina, no permitir ejecutar programas externos, o cambiar o eliminar archivos en un lugar diferente del que se encuentre el juego (Esto es una garanta contra Troyanos).Chequendola puede hacer que ciertos juegos no se ejecuten correctamente. o Show the origin and bounding box in the sprite image (Mostrar el origen y la bounding box en el sprite): Si esta chequeada, en el formulario de propiedades del sprite, el origen y la bounding box del sprite ser indicada. o In object properties, show hints for actions (En las propiedades del objeto, mostrar descripcin para las acciones): Si esta chequeada, en el formulario de propiedades del objeto, cuando pases el puntero del mouse sobre alguna de las acciones, una descripcin ser mostrada. o Remember room settings when closing the form (Recordar la configuracin del cuarto cuando se cierre el formulario): Si esta chequeada, un numero de opciones del cuarto; como whether to show the grid, whether to delete underlying objects, etc. sern recordadas cuando edites el cuarto mas adelante. o External sound editors (Editores externos de sonido): Puedes indicar cual editor externo quieres usar para los diferentes tipos de sonido. (Fjate que Game Maker no tiene un editor interno de sonido, por lo que si no indicas ninguno no podrs editar los sonidos)

o Scripts and code and colors (Scripts y cdigo en colores): Fjate mas abajo sobre esta preferencia. o Image editor (Editor de imgenes): Por defecto Game Maker tiene un editor interno de imgenes t tienes un mejor programa editor de imgenes puedes indicarlo aqu para usar un programa diferente para edita imgenes.

15.2

Men Edit

En el Men File puedes encontrar los siguientes comandos: Insert group (Insertar grupo): Los recursos pueden ser agrupados juntos. Esto es bastante til si t haces un juego grande. Por ejemplo, puedes poner todos los sonidos relativos a un objeto juntos en un grupo, o puedes agrupar todos los objetos que usas en un nivel en particular. Este comando crea un nuevo grupo en el tipo de recurso seleccionado actualmente. Te preguntaras por el nombre. Los grupos pueden contener otros grupos dentro de ellos, etc. Como indica bajo puedes arrastrar recursos hacia los grupos. Find Resource (Buscar recurso): Con este comando pones el nombre del recurso y abre el formulario de propiedades correspondiente. Show Object Information (Mostrar informacin del objeto): Usando este comando puedes obtener una vista general de todos los objetos en el juego.

15.3

Men Add

Con este men puedes aadir recursos adicionales. Fijate que para cada uno de ellos hay un botn en la barra de herramientas y un mtodo abreviado del teclado.

Captulo 16 Ms acerca de los sprites


Hasta ahora hemos cargado nuestros sprites desde archivos. Sin embargo, tambin es posible crearlos y modificarlos con Game Maker. Para hacer esto, abre la ventana de propiedades del sprite haciendo doble click en uno de tus sprites (o creando uno nuevo).Ahora presiona el botn con la etiqueta Edit Sprite. Un nuevo formulario aparecer mostrando todas las sub-imgenes que componen el sprite.

16.1

Editando tus sprites

El formulario de edicin de sprites luce as:

A la derecha veras las imgenes que componen el sprite. Fjate que en Game Maker todas las sub-imgenes del sprite deben tener el mismo tamao. A la izquierda se ve una vista previa de la animacin. (Si no ves la animacin chequea el botn Show Preview. Abajo de la animacin podrs cambiar la velocidad de esta y el color de fondo. De esta manera, tendrs una idea sobre como se vera la animacin en el juego. (Fjate que esta velocidad es solo para la vista previa, la velocidad de la animacin durante el juego depender de la velocidad del cuarto. El editor de sprites contiene muchos comandos para crear y cambiar el sprite. Estos se darn a travs de los mens. (Para algunos hay botones en la barra de herramientas.) Algunos comandos trabajan en imgenes individuales. Esto requiere que primero selecciones una sub-imagen con el mouse.

16.1.1 File menu


El Men File contiene un nmero de comandos relacionados con cargar y salvar sprites.

New. (Nuevo): Crear uno nuevo, un sprite vacio. Debes indicar el tamao del sprite. (Recuerda que todas las imgenes del sprite deben tener el mismo tamao). Create from file. (Crear desde archivo): Crear el sprite desde un archivo. Muchos tipos de archivos pueden ser usados. Crean una imagen que consiste de una imagen simple, excepto los Gif animados que se separaran en sub-imagenes. Por favor fjate que el color de la transparencia es tomado del pxel de la esquina izquierda-fondo, no de la transparencia del archivo gif. Add from file (Aadir desde archivo): Aade una imagen (o imgenes) desde un archivo al actual sprite. Si la imagen no tiene el mismo tamao puedes elegir el lugar donde colocarlo o reducirlo o achicarlo. Save as Gif (Guardar como gif): Salva el sprite como un gif animado. Save as strip (Guardar como Strip): Salva el sprite como mapa de bits (*bmp) con una imagen al lado de la otra con su respectivo orden. Create from strip (Crear desde Strip): Te permite crear un sprite desde un strip. Chequea mas abajo para ms informacin. Add from strip (Aadir desde Strip): Usa este para aadir imgenes desde un strip. Chequea abajo. Close saving changes (Cerrar guardando cambios): Cierra el formulario y salva los cambios hechos en el sprite. Si no quieres guardar los cambios, clickea en el botn de Cerrar la ventana.

16.1.2 Men Edit


El Men Edit contiene un nmero de comandos que trabajan con la seleccin actual del sprite. Puedes cortar hacia el portapapeles, pegar una imagen desde el portapapeles, limpiar el sprite actual, borrarlo y mover sprites hacia la derecha u izquierda en la secuencia. Finalmente, hay un comando para editar imgenes individualmente usando el editor interno (Chequea abajo)

16.1.3 Men Transform


En el Men Transform puedes realizar un nmero de transformaciones de las imgenes. Mirror horizontal. (Espejo horizontal): Voltea la imagen horizontalmente. Flip Vertical (Espejo vertical): Voltea la imagen verticalmente. Shift (Mover): Aqu t puedes mover las imgenes en un indicado monto horizontalmente o verticalmente. Rotate (Rotar): Puedes rotar las imgenes 90 grados, 180 grados, o hacia un monto arbitrario. En el ltimo de los casos puedes elegir la calidad. Experimenta para encontrar los mejores efectos. Resize Canvas (Redimensionar el contenedor de imgenes): Aqu t puedes cambiar el tamao del fondo del contenedor de imgenes. Tambin puedes indicar donde se ubicara la imagen vieja en el nuevo contenedor. Stretch (Reducir o agrandar): Aqu puedes reducir o agrandar la imagen a un nuevo tamao. Puedes indicar el factor de la escala y la calidad.

Scale (Escalar): Este comando escala la imagen (pero no el tamao de la imagen!). Puedes indicar el factor de la escala, la calidad y la posicin de la imagen actual en las escaladas.

16.1.4 Men Images


En el Men Images puedes realizar una numero de operaciones con las imgenes. Cycle left. (Ciclo izquierdo): Hace un ciclo de animacin hacia la una posicin en la izquierda. Esto efectivamente comienza la animacin en un punto diferente. Cycle Right (Ciclo derecho): Hace un ciclo de animacin hacia la una posicin en la derecha. Black and White (Blanco y negro): Convierte un sprite en blanco y negro (no afecta el color de transparencia!). Colorize (Colorizar): Aqu puedes cambiar el color de las imgenes. Utiliza el deslizador para elegir diferentes colores. Intensity (Intensidad): Cambia la intensidad proveyendo valores para el color de saturacin y la intensidad de la imagen. Fade (Desvanecer): Debes especificar un color y un monto. Los colores de las imgenes se desvanecern. Transparency (Transparencia): Aqu puedes indicar un nivel del umbral de transparencia. Esto har un nmero de pxeles transparentes. Blur (Borronear): Borroneando las imgenes los colores se mezclaran un poco, hacindolos mas vagos. Mientras mas alto sea el valor, habr mayor borroneo de la imagen. Crop (Recortar): Esto hace la imagen lo mas pequea posible. Esto es muy til, ya que, a mayor imagen, mayor memoria de video usa Game Maker. Tienes que dejar un pequeo borde alrededor de la imagen para evitar problemas de transparencia.

Experimenta con estos comandos para obtener el sprite que t quieres.

16.1.5 Men Animation


Con el Men Animation podrs crear nuevas animaciones partiendo de la animacin actual. Hay muchas opciones y debes experimentar un poco con ellas para crear los efectos que quieres. Tampoco no olvides que siempre puedes guardar las animaciones y despus aadirlas en la animacin actual. Tambin siempre puedes aadir imgenes vacas y eliminar las que desees. Haremos un pequeo recorrido a travs de las diferentes posibilidades. Set Length. (Cambiar longitud): Aqu puedes cambiar la longitud de la imagen. La animacin se repetir para crear la cantidad de frames que indiques.(Normalmente debers buscar un mltiplo de la cantidad de frames que utilizas.)

Stretch (Aumentar o reducir): Este comando tambin cambia la longitud de la animacin. Pero ahora, los frames sern duplicados o borrados hasta obtener el nmero correcto. Asi que, si aumentas el nmero de frames la animacin ser ms lenta y si lo reduces ser ms rpida. Reverse (Reversa): Como imaginas, este comando le da un sentido inverso a la animacin. Esto significa que se reproducir de manera inversa. Add Reverse (Aadir reversa): Esta vez la animacin inversa ser aadida, duplicando el nmero de frames. Es muy til para hacer un objeto vaya de derecha a izquierda, cambiar el color y reestablecerlo, etc. A veces debers borras algunos frames para que la animacin sea correcta. Translation Sequence (Secuencia de translacin): Crea una animacin en la cual la imagen rota o gira. Puedes elegir en el sentido del reloj o en contra. Especifica el numero de frames y la cantidad de grados del ngulo (360 es el giro completo). (Quizs necesites redimensionar el fondo para asegurarte que la imagen este completa durante la rotacin). Colorize (Colorizar): Crea una animacin que vuelve la imagen a un color en particular. Fade to color (Desvanecer hacia un color): Crea una animacin que decolora la imagen hacia un color en particular. Disappear (Desaparecer): Hace que una imagen desaparezca usando el umbral de transparencia. Shrink (Encoger hasta desaparecer): Encoge la image hacia desaparecer. Debes indicar la direccin. Grow (Expandir): Expande la imagen desde el sprite vaco. Flatten (Achatar): Achata la imagen hacia desaparecer en una direccin dada. Raise (Engrosar): Engrosa la imagen en una direccin dada. Overlay (Mezclar): Mezcla la animacin con otra animacin o un archivo de imagen. Morph (Transformar): Transforma la animacin hacia otra o una imagen de un archivo. Fjate que al transformar trabajaras mejor si las dos animaciones cubren la misma rea en la imagen. De otra manera, ciertos pxeles desaparecern y otros aparecern.

Los dos ltimos comandos son particularmente muy poderosos. Por ejemplo, para explotar un objeto, aade un numero de copias y luego un numero de frames vacos. Entonces mezclalo con una animacin de una explosin. (asegurate que el nmero de imgenes concuerde). Alternativamente trasfrmalo en explosin. Con algo de prctica podrs hacer sprites grandiosos.

16.1.6 Strips
Como indicamos arriba, normalmente los sprites son almacenados en archivos gif o en strips. Un strip es un bitmap grande que almacena todas las imgenes en un correcto orden. El nico problema es que el tamao de las imgenes individuales no es almacenado en la imagen. Muchos strips se encuentran disponibles en la Web en un solo

archivo. Por ejemplo, en la siguiente pieza de strip se encuentran cuatro animaciones diferentes.

Para seleccionar sprites individuales de estos archivos, puedes seleccionar create from strip o Add from strip en el Men File. Despus de indicar el strip apropiado veras el siguiente formulario:

A la derecha puedes ver una parte del strip que has seleccionado. A la izquierda puedes indicar un numero de parmetros que especifican las imgenes en las que estas interesado. Fjate que uno o ms rectngulos en la imagen indican las imgenes que seleccionaste. Los siguientes parmetros puedes ser especificados: Number of images. (Numero de imgenes): Es el nmero de imgenes que deseas tomar desde el strip.

Images per row (Imgenes por fila): Cuntas imgenes se toman en cada fila. Por ejemplo, determinando 1 estar seleccionando una secuencia vertical de imgenes. Image width (Ancho de imagen): El ancho de cada imagen individual. Image height (Alto de imagen): El alto de cada imagen individual. Horizontal cell offset (Offset horizontal de celda): Si no deseas seleccionar la imagen superior izquierda, debes indicar cuntas imgenes se saltean horizontalmente. Vertical cell offset (Offset vertical de celda): Aqu puedes indicar cuntas imgenes salta verticalmente. Horizontal pxel offset (Offset horizontal de pxel): Algunas veces existe un espacio adicional en el ngulo superior izquierdo. Aqu puedes indicar esta cantidad (en pxeles) Vertical pxel offset (Offset vertical de pxel): Cantidad vertical de espacio extra. Horizontal separation (Separacin horizontal): En algunos strips existen lneas vacas entre las imgenes. Aqu indicars la cantidad de pxeles que se saltan entre las imgenes. Vertical separation (Separacin vertical): Cantidad de pxeles verticales que se saltan entra imgenes.

Una vez que selecciones el conjunto de imgenes correcto, presiona OK para crear tu sprite. Recuerda que solo tienes permitido usar imgenes de otro si tienes el permiso o si son freeware.

16.2

Editando sub-imgenes individuales

Tambin puedes editar individualmente las sub-imgenes. Para esto selecciona una subimagen y elige Edit image del Men Image. Esto abrir el pequeo editor de imgenes interno de Game Maker. Por favor, recuerda que se trata de un programa limitado para tratar imgenes pequeas y no para crear nuevas. Por eso, es mejor usar un programa de edicin mas completo y usar las opciones de cortar o copiar y pegar para insertar la imagen dentro de Game Maker.

El formulario muestra la imagen en el medio y un nmero de botones con operaciones bsicas de dibujo a la izquierda. Aqu t puedes hacer zoom, ampliando o reduciendo, dibujar pxeles, lneas, rectngulos, textos, etc. Fjate que el color depende de lo que selecciones con el botn derecho o izquierdo del mouse. Para algunas herramientas de dibujo puedes seleccionar opciones (como el tamao de la lnea o si desees el borde visible o no). Existe un botn que permite cambiar el color de algunos pxeles por otro. Es muy til para cambiar el fondo para ser usado como transparencia. En la barra de herramientas, algunos botones especiales permiten mover los pxeles en una direccin particular. Tambin puedes ocultar o mostrar una grilla cuando la imagen se ampla (Trabaja solamente con un factor de al menos 4). A la derecha de el formulario puedes seleccionar el color que va a ser usado (uno con el botn derecho del mouse y otro con el izquierdo). Hay cuatro formas de cambiar el color. Primero que todo puedes clickear con el botn del mouse (derecho o izquierdo) en uno de los 16 colores basicos. Fijate que hay una caja especial de color que contiene el color del pxel superior izquierdo de la imagen que es usado como color de transparencia si el sprite es transparente. Puedes usar este color si deseas que una parte del sprite sea transparente. La segunda manera es hacer un click en la imagen con cambio de color. Aqu puedes elegir entre muchos mas colores. Puedes mantener algunos de los botones del mouse oprimido para ver el color que estas eligiendo. Tercero, puedes clickear con el botn izquierdo del mouse en las cajas indicando el color izquierdo o derecho. Una caja de dialogo de colores aparecer para elegir el color. Finalmente, puedes usar la

herramienta gotero y hacer click sobre la posicin en la imagen para copiar el color que all existe. En el men puedes encontrar los mismos comandos de transformacin y cambio de imgenes que estn disponibles en el editor de sprites. (Cuando un sprite tiene mltiples imgenes, los comandos que cambian el tamao, como stretcht, no estn disponibles). Tambin puedes guardar la imagen como bitmap. Otros comandos adicionales se encuentran el Men Image: Clear (Limpiar): Limpia la imagen con el color izquierdo (Que automticamente convierte la imagen en transparente). Gradient fill. (Cambio gradual de color): Con este comando puedes rellenar la imagen con un cambio gradual de color (No muy til para hacer sprites, pero puede ser usado para backgrounds que usen el mismo programa de dibujo).

Fjate que no hay un mecanismo para seleccionar partes de una imagen. Tambin algunas rutinas elegantes de dibujo no estn disponibles. Para esto deberas usar un programa de edicin de dibujo ms avanzado (o el Paint que viene con Windows). La forma ms fcil de hacer esto es copiar la imagen en el portapapeles. Ahora en tu programa de edicin de dibujo, usa pegar para obtener la imagen. Luego puedes volver a pegar la imagen en Game Maker y as obtenerla actualizada.

16.3

Configuracin avanzada de sprites

En Advanced Mode, en el formulario de propiedades del sprite hay un nmero de opciones avanzadas que aqu trataremos. En primer lugar hay opciones relacionadas con el control de colisin. Si dos instancias se encuentran un evento de colisin es generado. Son controladas de la siguiente manera. Cada sprite tiene una caja que lo rodea. Esta caja contiene las partes no-transparente de todas las sub-imgenes. Cuando las cajas se superponen se chequean los pxeles de las sub-imagines para ver si se superponen. Esta operacin consume bastantes recursos en cuanto a memoria se refiere. As que, si no estas interesado en una colisin precisa para cierto sprite, desactiva la casilla Precise collision checking. En este caso solo se chequea la caja que rodea al sprite. Tambin puedes cambiar las propiedades de dicha caja. Aunque es difcilmente requerido, pero a veces querrs hacer una caja ms pequea, con lo cual las colisiones que se generan en los bordes de la caja no sern controladas. Los sprites pueden ser almacenados en dos lugares: en la memoria de video y en la memoria Standard. La memoria de video se encuentra en la tarjeta grafica y generalmente es ms rpida. As que si tienes muchas instancias del sprite preferirs almacenarla ah. Pero el monto de la memoria de video es limitado, dependiendo de la tarjeta grafica que el jugador tenga. As que te recomendamos no almacenar los sprites ms grandes en la memoria de video. Algunos sprites quizs los uses en uno o dos niveles de tu juego. Es un poco incomodo mantener estos sprites en la memoria de video todo el tiempo. En este caso puedes activar

la casilla Load only on use. El sprite ahora es cargado en el momento en que se lo necesite. Al terminar el cuarto es descartado y se libera memoria. Para juegos grandes con muchos sprites es importante manejar cuidadosamente cuales sprites son cargados y cuales almacenados en la memoria de video. (Tambin puedes cargar y descartar sprites desde piezas de cdigo). Finalmente puedes indicar el origen del sprite. Este es el punto en que el sprite corresponde a una posicin. Cuando designes una instancia en una posicin particular, el origen del sprite se ubicara all. Predefinidamente esta en el ngulo superior izquierdo de sprite pero a veces es ms conveniente usar el centro u otro punto importante. Tambin puedes elegir un punto afuera del sprite, o marcar el origen clickeando en el sprite (cuando el origen es mostrado en la imagen).

Captulo 17 Ms sobre los sonidos y msica


Cuando aades un recurso de sonido a tu juego hay un nmero de aspectos que puedes indicar. Estn solo visibles en Advanced Mode. Todos los sonidos que desees utilizar pueden ser cargados como Load only on use. Esto es predefinido para archivos midi pero no para archivos wav. Si chequeas esta casilla el sonido no se cargara en la memoria cuando comience el juego. Solo se cargara cuando se necesite. Aunque hace un poco mas lento el juego, pero salva una gran cantidad de memoria y hace que el juego se cargue mas rpido. Tambin, al finalizar el cuarto, el sonido es descartado y se libera memoria. Solo si es requerido otra vez se cargara de nuevo. No uses esto para efectos de sonido cortos, pero es recomendado para msicas de fondo o para sonidos que se usan eventualmente. Para archivos wav puedes indicar el nmero de bferes. Este nmero indica el nmero de veces que un sonido puede ejecutarse simultneamente. Por ejemplo, cuando tienes algn sonido de explosin y un nmero de explosiones deben escucharse simultneamente, querrs incrementar este numero para que varias explosiones se escuchen simultneamente. Ten cuidado, ya que los bferes mltiples consumen (dependiendo de la tarjeta de sonido) mas memoria. Tambin puedes indicar los sonidos que se prepararan para ser efectos de sonido. Esos efectos, como cambiar el canal de audicin y cambiar el volumen, podrn solo ser usados desde el cdigo. Estos requieren ms recursos. Game Maker no tiene un editor interno de sonidos. Pero en Preferences puedes indicar los editores externos que quieras para editar tus sonidos. Si los indicas, puedes presionar en el botn Edit Sound para editar los sonidos que ests usando. (La ventana de Game Maker se ocultara mientras edites tus sonidos y se reestablecer cuando cuando cierres el editor de sonidos). Adems de archivos wav y midis, actualmente hay un tipo diferente de archivos de sonidos: los mp3. Son archivos wav comprimidos. Si bien, no los ves cuando eliges un archivo de sonido puedes usarlos en Game Maker. Selecciona mostrar todos los archivos en la parte inferior de la caja de dilogo y podrs cargarlos. Se cuidadoso, ya que hay un numero de desventajas. Primero, necesitan ser descomprimidos y esta operacin consume tiempo y recursos haciendo ms lento el juego. El hecho de que el tamao del archivo sea ms chico no significa que use menos memoria. Segundo, no todas las maquinas lo soportan. Entonces tu juego no podra ejecutarse en cualquier maquina. Preferentemente no los uses, es mejor convertirlos a wav. Si todava quieres usarlos usalos solamente como msica de fondo.

Captulo 18 Ms acerca de los fondos


Adems de importarlos desde archivos existentes, tambin tienes la posibilidad de crear tus propios fondos. Para este fn, presiona el botn Edit Background (Editar Fondo). Se abrir un programa de dibujo que viene includo en el que puedes crear o editar tus fondos. Es importante remarcar que ste no es un programa sofisticado de diseo. Para realizar tareas de diseo ms avanzadas y disponer de herramientas de dibujo ms sofisticadas utiliza algn programa especializado en ello. El programa includo se describe ms ampliamente en la Seccin 16.2. Hay una opcin que es particularmente til, en el men Image (Imagen) encontrars un comando llamado Gradient Fill (Relleno Degradado); Con esta opcin se pueden crear muy buenos fondos. En el modo avanzado, la ventana de propiedades de fondo, contiene algunas opciones avanzadas. Por defecto, los fondos son almacenados en la memoria de video. Esto no implica mayores complicaciones si stos son pequeos pero cuando se utilizan fondos de dimensiones ms grandes ser mejor utilizar la memoria normal a cambio. Esto reducir ligeramente la velocidad de carga del mismo, pero se debe considerar que la memoria de video es limitada. Para no utilizar sta, la casilla Use video memory (Usar memoria de video) no deber estr seleccionada. Tambin por defecto, los fondos se cargan en la memoria cuando se necesitan y se descargan de nuevo al salir de la habitacin. Esto ahorra grandes cantidades de memoria pero har ligeramente ms lentos los inicios de las habitaciones y pueden provocar un pequeo salto cuando se cambia el fondo a la mitad de una de ellas. Para evitar que esto suceda, no seleccione la casilla Load only on use (Cargar slo al usar).

Captulo 19 Ms acerca de los objetos


Cuando se aade un objeto nuevo en modo avanzado, se pueden configurar algunas opciones ms avanzadas.

19.1

Depth (Profundidad)

Antes que nada, se podr fijar la profundidad de las instancias del objeto en cuestin. Cuando stas se dibujan en pantalla, se muestran en orden de acuerdo a su profundidad. Las instancias con mayor profundidad se dibujarn primero y aquellas con menor profundidad, al final. Cuando varias instancias tienen la misma profundiad, se dibujan en el orden en que fueron creadas. Si se quiere asegurar que un objeto se encuentra encima de los demas dle una profundidad negativa, si se quiere que siempre se encuentre siempre debajo de los otros, dle una profundidad positiva muy grande. Tambin se puede cambiar la profundidad de una instancia en particular durante la ejecucin del juego utilizando la variable depth.

19.2

Persistent objects (Objetos persistentes)

En segundo trmino, se puede hacer persistente a un objeto. Un objeto persistente seguir existiendo an si se pasa de una habitacin a la otra. Solamente desaparecer cuando es destruda expresamente. De este modo, solo es necesario colocar una instancia del objeto en la primera habitacin y continuar apareciendo en todas las habitaciones. Esto es muy til cuando, por ejemplo, se tiene un personaje principal que se mueve de habitacin en habitacin. La utilizacin de objetos persistentes es un mecanismo poderoso pero tambin puede producir fcilmente errores.

19.3

Parents (Padres)

Todos los objetos pueden tener un objeto padre. Cuando un objeto tiene a otro como su padre, hereda el comportamiento de ste. Dicho de otra manera, el objeto es una especie de variante del objeto padre. Por ejemplo, si se tienen cuatro pelotas distintas, nombradas ball1, ball2, ball3 y ball4, y todas se comportan (interactan) de la misma forma pero tienen un sprite distinto, se puede hacer al objeto ball1 padre de las otras tres; De modo que slo es necesario especificar eventos y acciones para un objeto: ball1. Los otros heredarn los eventos y actuarn exactamente de la misma forma. Adems, cuando se ejecutan acciones a instancias del objeto padre tambin se aplicarn a los hijos. De forma que si se destruyen todas las instancias del objeto ball1 tambin se destruirn las instancias de los objetos ball2, ball3, y ball4. Esta opcin ahorra mucho trabajo. Con frecuencia varios objetos deben comportarse de manera casi idntica pero con algunas diferencias pequeas. Por ejemplo, un monstruo podra moverse arriba y abajo y el otro hacia la izquierda y la derecha. Para el resto ambos tendran el mismo comportamiento. En este caso casi todos los eventos deberan tener las mismas acciones excepto uno o dos que tendran que ser distintos. En este caso podemos hacer a un objeto el padre del otro. Pero tambin debemos definir algunos eventos para el objeto hijo. Estos eventos se sobrepondrn a los eventos del padre. De forma tal que mientras un evento del objeto hijo contenga acciones, stas se ejecutarn en lugar de las del mismo evento del

objeto padre. Si adems se requiere ejecutar el evento del padre, se puede 'llamar' al 'evento heredado' usando la accin apropiada. De hecho, es una buena prctica en tales casos crear un objeto base, por ejemplo un objeto ball0. Este objeto contiene todo el comportamiento por defecto pero nunca se utiliza en el juego. Todos los objetos 'reales' tienen a este objeto base como padre. Los objetos padre pueden as mismo tener padres, y as sucesivamente. (Obviamente no est permitido crear crculos.) De sta forma se puede crear una jerarqua de objetos. Esto es extremadamente til oara mantener tu juego estructurado y es ampliamente recomendado aprender a utilizar ste mecanismo. Tambin hay otra utilidad de los objetos padre. Permite heredar el comportamiento en colisiones para otros objetos. Permtame explicar sto con un ejemplo. Supongamos que tenemos cuatro objetos 'suelo' distintos. Cuando una pelota golpea el suelo sta debe cambiar su direccin. Este cambio debe especificarse en el evento colisin de la pelota con el suelo. Debido a que hay 4 distintos suelos necesitamos escribir cdigo en 4 eventos colisin distintos de la pelota. En cambio, cuando se tiene un objeto base y ste es padre de los 4 suelos reales, slo se debe especificar el evento colisin con ste objeto base. Las dems colisiones ejecutarn el mismo evento. Esto, igualmente ahorra mucho trabajo. Tal como se indica, dondequiera que se utiliza un objeto, se involucrarn a sus descendientes. Esto sucede cuando, en una accin, se indica que sta debe aplicarse a instancias de un objeto determinado. Lo mismo sucede cuando se utiliza la sentencia with() en cdigo (ver abajo). Y funciona cuando se llaman a funciones como instance_position, instance_number, etc. Finalmente, sucede cuando se hace referencia a variables en otros objetos. En el ejemplo anterior, cuando se fija la variable ball1.speed a 10 este cambio es tambin aplicado a los objetos ball2, ball3 y ball4.

19.4

Masks (Mscaras)

Cuando dos instancias hacen colisin ocurre un evento colisin. Para decidir en qu circunstancias se intersectan dos instancias, se utilizan los sprites de ambas. Esto es suficiente en la mayora de los casos, pero en ocaciones se desea basar las colisiones en formas distintas. Por ejemplo, si se est creando un juego isomtrico, los objetos tienen tpicamente una altura (para darles una apariencia en 3D). Pero para las colisiones slo se requiere usar la parte que se supone entra en contacto con el suelo de acuerdo al sprite. Este efecto puede lograrse creando un sprite separado que se utiliza como mscara de colisin para el objeto.

19.5

Informacin

El botn Show Information (Mostrar Informacin) brinda una visin completa de toda la informacin para el objeto que tambin puede imprimirse. Esto es til en particular cuando se pierde una visin integral de todas las acciones y eventos del objeto.

Captulo 20 Ms acerca de las habitaciones


Las habitaciones en Game Maker tienen muchas opciones. En Error! No se encuentra el origen de la referencia. solamente tratamos las ms importantes. En este captulo discutiremos las dems opciones disponibles.

20.1

Configuraciones avanzadas

Hay dos aspectos en la pestaa settings (configuraciones) que no hemos discutido an. La primer opcin que aparece es una casilla nombrada Persistent (persistente). Normalmente, cuando se abandona una habitacin y posteriormente se regresa al mismo, la configuracin de la habitacin vuelve a sus valores iniciales. Esto est muy bien si se tienen varios niveles en un juego (N.T. : En juegos como 'Tetris') pero no es lo que normalmente se desea en un RPG, por ejemplo. En este caso, la habitacin debe aparecer en el mismo estado en que se dejo la ltima vez que se visit. Al seleccionar la casilla Persistent se lograr precisamente eso. El estado de las habitaciones ser recordado y cuando se vuelva a ellas con posterioridad en el juego, stas estarn tal y como estaban al salir de ellas. Solamente cuando el juego sea reiniciado, el estado de las habitaciones se reestablecer. De hecho, hay una excepcin a sto, si algunos objetos estn configurados como persistentes (ver 0), las instancias de este objeto no permanecern en la habitacin sino se movern a la habitacin siguiente. Despus, hay un botn llamado Creation code (Cdigo de creacin). Aqu podrs escribir cdigo en GML (ver ms adelante) que ser ejecutado al momento de crear la habitacin. Esto es til para, por ejemplo, asignar valores a variables, crear algunas instancias, etc. Es muy til comprender que es exctamente lo que sucede cuando te mueves a una habitacin en particular. Primero, en la habitacin actual (si existiera) todas las instancias tendrn un evento salir-habitacin. Despues, los objetos no persistentes se remueven (sin generar un evento destruccin!). Posteriormente, se agregan a la nueva habitacin las instancias persistentes de la habitacin anterior. Se crean todas las instancias nuevas y se ejecutan sus eventos creacin (en caso de quela habitacin no sea persistente o nohaya sido visitada antes en el juego). Cuando la habitacin es la primera del juego, todas las instancias tendrn un evento inicio-juego. Ahora el cdigo de creacin de la habitacin es ejecutado. Finalmente, todas las instancias tendrn un evento inicio-habitacin. De modo que, por ejemplo, los eventos inicio-habitacin pueden emplear variables configuradas en el evento creacin de la habitacin y en el cdigo de creacin se puede referir a las instancias en la habitacin (tanto las nuevas como las persistentes). Hay una opcin ms. Si se configura la preferencia correcta, al dar click con el botn derecho del ratn en una instancias aparecer un men contextual. Aqu podrs usar los comandos usuales de suprimir o mover en el orden de profundidad, y tambin podrs indicar el cdigo de creacin de la instancia. Este cdigo se ejecutar cuando la

habitacin sea iniciada, justo antes de que el evento creacin de la instancia sea ejecutado. Esto es muy til para, por ejemplo, configurar ciertos parametros que son especficos a la instancia.

20.2

Agregando mosaicos

Tambin se pueden crear fondos llamados 'de mosaicos'. El objeto de sto es el siguiente: En muchos juegos querrs tener fondos atractivos. Por ejemplo, en una juego de laberintos, los muros del laberinto debern encajar, y en un juego de plataforma querrs ver rboles, plataformas, obstculos, etc. En Game Maker puedes lograr esto definiendo muchos objetos diferentes y armar las habitaciones con estos objetos. El problema, sin embargo, es que esto toma mucho trabajo, utiliza grandes cantidades de recursos, y provoca que los juegos se ejecuten lentamente debido a la gran cantidad de objetos distintos utilizados. Por ejemplo, para crear muros con buena apariencia en juegos de laberintos necesitas, por lo menos, 15 objetos con distinta forma. La solucin estndar, utilizada en muchos juegos, es que los muros y otros objetos estticos son dibujados en el fondo. Pero, te preguntars, como sabe la computadora que un objeto toca un muro si ste est dibujado en la imagen de fondo? El truco se logra como sigue: Solamente se crea un objeto 'muro' en tu juego. ste deber tener el tamao correcto pero no tendr que verse bien. Al momento de crear la habitacin, Coloca este objeto en todos los lugares en que halla un muro. Y haz a este objeto invisible. De forma que al momento de ejecutar el juego no se vern los objetos 'muro'. nicamente se ver la imagen de fondo. Pero los objetos 'muro' slidos an estarn ah y lo objetos reaccionarn a ellos. Puedes emplear esta tcnica para cualquier objeto que no cambie su forma ni posicin, y no requiera ser animado. Para juegos de plataforma, problemente necesitars slo un objeto para el suelo y otro para los muros, pero tus fondos podrn tener parte en que parezca que se camina sobre pasto, sobre ramas de rboles, etc. Para agregar mosaicos a tu habitacin primero necesitars una imagen de fondo que contenga los mosaicos. Algunas de stas se proveen con Game Maker. Si quieres que tus mosaicos sean parcialmente transparentes, asegrate que seleccionaste la opcin transparente al importar la imagen de fondo. Ahora, cuando ests definiendo la habitacin haz click en la etiqueta tiles (mosaicos). Aparecer una ventana como la siguiente (de hecho, en sta ya se agregaron algunos mosaicos a la habitacin).

En la esquina superior izquierda est el set de mosaicos utilizado. Para seleccionar un ser, haz click en el botn de men debajo de la parte que muestra la imagen de los mosaicos y selecciona la imagen de fondo apropiada. Debajo de ste botn, podrs cambiar varias opciones. Puedes indicar el largo (width) y alto (height) de cada mosaico y la separacin entre los mosaicos (normalmente 0 o 1). Ahora, podrs aadir mosaicos seleccionando el mosaico deseado en la imagen de la esquina superior izquierda, y despus posteriormente haciendo click en la posicin apropiada en la habitacin a la derecha. Esto funcions en la misma forma exactamente en que se aaden instancias de objetos. Si la opcin Delete underlying (Eliminar mosaico inferior) est seleccionada, al colocar un mosaico en un lugar donde ya exista uno se reemplazar el existente por el nuevo. Con el botn derecho del ratn se pueden eliminar mosaicos. Tambin hay botones para eliminar (Clear) todos los mosaicos y para trasladar (Shift) todos los mosaicos en una direccin. Hay una casilla llamada Foreground tiles (Mosaicos en primer plano). Si seleccionas esta casilla, los mosaicos se dibujarn en frente de los objetos, en lugar de debajo de ellos. Esto se puede utilizar en muchas formas. Cuando se selecciona esta casilla tambin se eliminan solo los mosaicos en primer plano.

Utilizar mosaicos es una opcin muy poderosa que debera ser empleada siempre que sea posible. Es mucho ms rpida que utilizar objetos y las imgenes de mosaicos se almacenan slo una vez. De modo que puedes utilizar habitaciones muy grandes llenas de mosaicos con muy poco consumo de memoria.

20.3

Vistas

Finalmente, hay una solapa llamada views (vistas). Esta opcin brinda un mecanismo para dibujar partes diferentes de una habitacin en distintos lugares de la pantalla. Existen muchos usos para las vistas. Primero que nada, en distintos juegos querrs mostrar slo una parte de la habitacin en todo momento. Por ejemplo, en la mayora de los juegos de plataformas, la vista sigue los movimientos del personaje principal. En juegos de dos jugadores, frecuentemente necesitars dividir la pantalla y mostrar en una parte a uno de los personajes y en otra al personaje que controla el otro jugador. Un tercer uso es comn en los juegos en que parte de la habitacin deber desplazarse con el personaje principal y ontra parte de la pantalla est fija (por ejemplo una barra de estado). Esto se puede lograr fcilmente en Game Maker. Cuando hace click en la solapa views (vistas) la siguiente informacin aparecer: En la parte superior hay una casilla llamada Enable the use of Views (Permitir el uso de Vistas). Debes seleccionar esta casilla para utilizar las vistas. Debajo vers la lista de las ocho vistas que puedes definir como mximo. Debajo de la lista puedes proporcionar la informacin de las vista. Primero que nada, debes indicar si la vista debe ser visible cuando la habitacin comienza. Asegrate de que por lo menos una vista es visible. Las vistas visibles se muestran con negritas. Despus podrs indicar el rea de la habitacin que debe mostrarse en la vista. Debes especificar las coordenadas izquierda (left) y superior (top), y el largo (width) y alto (height) de la vista. Debajo, indicas la posicin de la vista en la pantalla. Como se indico anteriormente, frecuentemente se quiere que la vista siga a un determinado objeto. Puedes indicar al objeto a seguir en la ltima opcin disponible. Si hay mltiples instancias de ese objeto, slo la primera de ellas es seguida por la vista. (Utilizando cdigo tambin se puede indicar qu instancia seguir.) Normalmente el personaje debe ser capaz de caminar libremente dentro de un determinado espacio sin que la vista cambie. Slo cuando el personaje se acerca a los lmites de la vista, sta debe cambiar. Puedes especificar el tamao del borde que debe permanecer visible alrededor del objeto. Finalmente, puedes restringir la velocidad con que la vista cambia. Esto puede significar que el personaje puede caminar fuera de la vista, pero da un movimiento mucho ms suave. Usa 1 si deseas que la vista cambie instantneamente.

Captulo 21 Paths
En la mayora de los juegos avanzados regularmente buscas permitir a las instancias seguir ciertos senderos. Incluso puedes indicarlo usando alarmas o cdigo, pero eso es complicado. Los recursos Paths es un mecanismo que lo hace fcil. La idea es bastante simple. Defines un sendero dibujndolo. Enseguida puedes situar una accin en Creation event del objeto para que este siga un sendero en particular. Este captulo explicar esto a detalle. La implementacin actual es bastante limitada. Espera ms posibilidades en versiones futuras (compatible con la versin actual).

21.1

Definiendo paths

Para aadir un path a tu juego, escoge Add Path en el men Add. Aparecer la siguiente ventana (en este ejemplo ya aadimos un pequeo path).

Arriba a la izquierda de la ventana puedes especificar el nombre del path. Debajo encontrars los puntos que influyen el path. Cada punto tiene una posicin y velocidad (indicado con sp). La posicin no es absoluta. Como se indica debajo, la instancia siempre empieza en la primera posicin del path, y lo sigue a partir de ah. La velocidad es interpretada de la siguiente manera. Un valor de 100 significa la velocidad original de la instancia. Un valor menor reduce la velocidad, un valor ms alto la incrementa (esto indica el porcentaje de la velocidad real). La velocidad es intercalada entre puntos, por lo que la velocidad cambia gradualmente.

Para aadir un punto presiona el botn Add. Ahora puedes indicar la posicin actual y la velocidad. En cualquier momento en que selecciones un punto en la lista, puedes cambiar sus valores. Presiona Insert para insertar un nuevo punto despus del actual, y Delete para borrar el punto actual. Finalmente, puedes usar Clear para borrar el path completamente. A la derecha de la ventana vers el path actual. Tambin puedes cambiar el path usando el ratn. Da un clic sobre la imagen para agregar un punto. Da clic en un punto existente y arrstralo para cambiar su posicin. Cuando mantienes <Shift> mientras das un clic, insertas un punto. Finalmente, puedes usar el botn derecho para borrar puntos. (Nota que de esta manera no puedes cambiar la velocidad.) Puedes influir la forma del path de dos maneras. Primero puedes usar un tipo de unin. Puedes escoger lneas rectas o curvas. En segundo lugar, puedes indicar que pasa cuando se llega al ltimo punto. Existen varias opciones. La ms comn es continuar movindose hacia el primer punto, cerrando el path (move to start). Tambin puede dejar de moverse (stop moving), brincar al primer punto (jump to start), o regresarse por el mismo path (reverse). La opcin final (continue) reinicia el path desde la posicin actual. De esta manera el path va a avanzar. Slo se muestran las primeras cinco repeticiones, pero el path contina despus de esto.

21.2

Asignando paths a los objetos

Para asignar un path a una instancia de un objeto, puedes asignar la accin path en algunos eventos, por ejemplo en el evento create. En esta accin debes especificar el path de un men desplegable. Tambin hay otros dos valores que debes proporcionar. Primero la velocidad a la que el path ser ejecutado (speed). Recuerda que cuando defines el path tu especificas la velocidad real relativo a la velocidad indicada. Despus puedes indicar en dnde debe iniciar el path. Un valor de 0 indica el inicio (que es lo ms comn). Un valor de 1 indica el final del path, esto es, que en el momento en que el path es ejecutado es la segunda vez. Por ejemplo cuando el cuando el path es inverso (reverse), un valor de 0.5, es el instante en que se regresa. Cuando usas scrips o piezas de cdigo tienes ms control sobre la manera en que el path es ejecutado. Existen 4 variables que lo influencian. La variable path_index indica el inicio del path. La variable path_position indica la posicin actual de le path. (Entre 0 y 1 como se indic anteriormente). Esto cambia mientras la instancia siga el path. La velociadad es controlada por la variable speed en path properties. Nota que la variable direction est fijada automticamente en cada paso hacia la direccin correcta a lo largo del path. Entonces puedes usar esta variable para por ejemplo escoger la subimagen correcta. La variable path_scale puede ser usada para escalar el path. Un valor de 1 es la talla real. Un valor ms grande indica que el path ser ms grande, uno menor lo disminuye. La variable path_orientation indica la orientacin en que el path es ejecutado (en grados contrario a las manecillas del reloj). Esto permite que puedas ejecutar paths en diferentes orientaciones (Ej. Movindose arriba y abajo en vez de izquierda y derecha.)

Tal vez te preguntes que pasa cuando la instancia coaliciona con otra instancia mientras este sigue un path. Primero el evento coalicin es ejecutado. Si la otra instancia es slida la instancia se detendr, como debera (Asumiendo que existe un evento de coalicin definido.) Sin embargo la variable path_position continuar siguiendo el path. En algn momento la instancia podra moverse otra vez en una direccin diferente, si una posicin semejante es alcanzada en el path.

21.3

El evento path

Como se describi antes, puedes indicar que sucede cuando la instancia llega al fin del path. En ente momento ocurre el evento End of path. Puedes encontrarlo en el evento Other. Aqu puedes aadir acciones. Por ejemplo, tal vez quieras destruir la instancia, o que empiece un nuevo path (diferente).

Captulo 22 Time Lines


En muchos juegos ciertas cosas deben pasar en ciertos lapsos de tiempo. Puedes intentas hacer esto usando el evento alarm pero cuando las cosas se vuelven muy complicadas esto no podra funcionar. Mediante el recurso time line lo puedes hacer. En una time line tu especificas que acciones deben suceder en ciertos lapsos de tiempo. Puedes utilizar todas las acciones que son disponibles para los diferentes eventos. Ya que hayas creado una time line puedes asignarla a una instancia de un objeto. Esta instancia ejecutar las acciones en los lapsos de tiempo indicados. Permteme explicarlo con un ejemplo. Supongamos que quieres crear un guardia. Este guardia debe moverse 20 pasos a la izquierda, despus 10 arriba, 20 a la derecha, 10 hacia abajo y despus detenerse. Para lograr esto creas una time line donde empiezas con un movimiento a la izquierda. En 20 pasos pones un movimiento hacia arriba. En el paso 30 un movimiento a la derecha, en el paso 50 un movimiento hacia abajo y en el 60 detienes el movimiento. Ahora puedes asignar esta lnea de tiempo al guardia y el guardia har exactamente lo que planeaste. Tambin puedes usar una lnea de tiempo para controlar tu juego de manera global. Crea un objeto invisible, crea una time line que en ciertos momentos cree enemigos, y asgnala a el objeto. Si empiezas a trabajar con esto encontrars que es un concepto muy poderoso. Para crear una time line, selecciona Add time line del men Add. Aparecer la siguiente ventana:

Se parece un poco a la ventana de propiedades del objeto. A la izquierda puedes poner el nombre y adems hay botones para aadir y modificar moments en la time line. Enseguida est la lista de los moments. Esta lista especifica los lapsos de tiempo en steps en que las acciones asignadas van a pasar. Y enseguida est la lista de acciones para

el moment seleccionado y finalmente a la derecha est la lista total de acciones disponibles. Para aadir un moment presiona el botn Add. Indicando un lapso de tiempo (esto es el nmero de pasos desde que la time line comienza). Ahora puedes arrastrar acciones a la lista de manera semejante como los eventos de los objetos. Tambin hay botones para borrar el moment seleccionado y para borrar toda la time line. Finalmente existen dos botones especiales. Con el botn Merge puedes unir varios moments en un rango deseado en uno solo. Con el botn Shift puedes cambiar todos los moments cierta cantidad de tiempo avanzndolos o retrocedindolos la cantidad deseada. Asegrate de que no creaste moments con un step negativo, porque nunca se ejecutarn. Existen dos acciones relativas a las time lines: Set a time line Con esta accin asignas una time line en particular a una instancia de un objeto. Aqu indicas la time line y la posicin de inicio de la time line (0 es al principio). Tambin puedes usar esta accin para finalizar una time line escogiendo No Time Line como valor. Set the time line position Con esta accin puedes cambiar la posicin de la time line actual (puede ser absolute o relative). Esto puede ser usado para saltar ciertas partes de la time line o para repetir ciertas partes. Por ejemplo, si quieres crear una time line que se repita una y otra vez, aade esta accin en el ltimo moment para que la posicin regrese a 0. Tambin puedes usarlo para esperar a que pase algo. Slo aade la accin de prueba (usa un if) y, si no es cierta, asignas la posicin de la time line un valor relative de -1.

Captulo 23 Scripts
Game Maker posee un lenguaje de programacin interno. Una vez que te familiarices con Game Maker y quieras usarlo a sus mximos alcances, es prudente aprender a usar este lenguaje. Ve el captulo 28 para una descripcin ms completa. Existen dos maneras para usar el lenguaje. Primero puedes crear scripts. Estos son piezas de cdigo a los que les dars un nombre. Son mostrados en el rbol de recursos y pueden ser salvados a un archivo y cargarlos desde un archivo. Pueden ser usados para formar una librera que extienda las posibilidades de Game Maker. Alternamente, puedes aadir una accin de cdigo a algn evento y escribir una pieza de cdigo ah. Aadir el cdigo funciona exactamente de la misma manera que aadir scripts excepto por dos cosas. Las piezas de cdigo no tienen un nombre y no usan argumentos. Adems ya tienen indicados a que objeto deben aplicar el cdigo. Por lo dems escribes el cdigo de la misma manera como en los scripts. En este captulo nos vamos a concentrar a fondo en los scripts. Como se seal antes, un script es una pieza de cdigo en el lenguaje de programacin interno que realiza una tarea especfica. Un script puede usar un nmero de argumentos. Para ejecutar un cdigo desde algn evento, puedes usar la accin script. En esta opcin especificas el script que desees ejecutar, junto con un mximo de cinco argumentos. (Tambin puedes ejecutar scripts desde una pieza de cdigo de la misma manera en que llamas una funcin. En este caso puedes usar 16 argumentos como mximo.) Cuando un script retorna un valor, puedes usarlo tambin como una funcin cuando provee valores en otras acciones. Para aadir un script a tu juego, selecciona Add script de el men Add. Aparecer la siguiente ventana (en este ejemplo ya aadimos un pequeo script que calcula el producto de dos argumentos).

(Realmente, este es el editor de scripts interno. En las preferencias puedes indicar si deseas usar un editor externo.) Arriba a la derecha puedes indicar el nombre del script. Tienes un pequeo editor donde puedes escribir el script. El editor tiene varias propiedades tiles la mayora mediante botones (presiona el botn derecho del ratn para algunos comandos adicionales): Mltiple deshacer y rehacer ya sea por tecla presionada o en grupos (puede ser cambiado en las preferencias) Sangra automtica inteligente que se alinea con la lnea previa (puede ser habilitado en las preferencias) Tabulador inteligente que hasta el primer carcter (no espacio) en la lnea previa (puede ser habilitado en las preferencias) Usa <Ctrl.+I> para aumentar la sangra en las lneas seleccionadas y <Shift><Ctrl>+I para reducirla en las lneas seleccionadas. Cortar y pegar Buscar y reemplazar Usa <Ctrl> + arriba, abajo, re-pag o av-pag para desplazarte sin cambiar la posicin del cursor. Usa F4 para abrir el script o el recurso cuyo nombre est en la posicin del cursor (no funciona en la accin de cdigo; slo en los scripts) Guardar y Cargar el script como un archivo de texto.

Tambin hay un botn con el cual puedes probar si el script est correcto. No todos los aspectos son probados, solo la sintaxis de tu script, junto con la existencia de alguna funcin usada. Como habrs notado, partes del texto del script tienen diferentes colores. El editor reconoce la existencia de objetos, variables internas y funciones, etc. El color del cdigo ayuda bastante a evitar errores. En particular, notas inmediatamente si escribiste mal algn nombre o si usaste una keyword (variable con una funcin definida como var, global, other, self, etc.) como variable. Sin embargo colorear el cdigo es algo lento. En las preferencias del men file puedes activarlo o desactivarlo. Adems puedes cambiar el color para los diferentes componentes de los programas. (Si algo sale mal con el coloreado del cdigo, presiona F12 dos veces, para desactivarlo y volver a activarlo.) Tambin puedes cambiar la fuente usada en los scripts y en las piezas de cdigo. Los scripts son extremadamente tiles para extender las posibilidades del Game Maker. Aunque esto requiere que disees tus scripts con cuidado. Los scripts pueden ser guardados en libreras que pueden ser aadidos a tu juego. Para importar una librera, usa el item Import scripts de el men file. Para guardar tu scripts como una librera usa Export scripts. Las libreras de scripts son simples archivos de texto (Aunque tienen la extencin .gml). Preferentemente no los edites directamente porque poseen una estructura especial. Algunas libreras con scripts tiles son incluidas. (Para evitar trabajo innecesario cuando cargas el juego, despus de importar una librera, es mejor borrar las libreras que no utilices.)

Cuando se crean scripts es muy fcil cometer errores. Siempre prueba los scripts usando el botn apropiado. Cuando ocurre un error durante la ejecucin del script este es reportado, junto con una indicacin del tipo de error y el lugar. Si necesitas verificar las cosas ms cuidadosamente, puedes correr el juego en debug mode (F6). En este caso aparece una ventana en la cual puedes monitorear mucha de la informacin de tu juego.

En el men Run puedes pausar el juego, correrlo paso a paso e incluso reiniciarlo. En el men Watch puedes ver el valor de ciertas expresiones. Usa Add para escribir algunas expresiones cuyos valores se mostrarn en cada paso del juego. De esta manera puedes ver si el juego est haciendo las cosas de la manera adecuada. Puedes ver varias expresiones. Puedes salvarlos para usarlos despus. (Ej. Para hacer correcciones al juego). En el men Tools se encuentran comandos para ver ms informacin. Puedes ver una lista de todas las instancias en el juego, puedes ver todas las variables globales (usa el nombre del objeto o el id de la instancia.) Adems puedes ver mensajes los cuales puedes enviar desde tu cdigo usando la funcin show_debug_message(str). Finalmente puedes dar al juego comandos y cambiar la velocidad del juego. Si haces juegos complicados deberas aprender a usar las opciones del debug mode.

Captulo 24 Data files


En la mayora de los juegos avanzados necesitas a menudo usar archivos adicionales, por ejemplo archivos que describan ciertas propiedades, backgrounds, videos, archivos dll (explicados ms adelante) o tus propias fuentes. Puedes distribuir estos archivos con tu juego, pero es ms agradable agregarlos dentro del juego. Para esto puedes usar el recurso data file. Los data file simplemente guardan el contenido de un archivo. Cuando comienza el juego este archivo es guardado en el disco y pueden ser usados en el juego. Para aadir un data file selecciona Add data file de el men Add. Aparecer la siguiente ventana:

Como siempre puedes darle un nombre. Presiona el botn Load data file para cargar el archivo dentro del recurso. Puedes escoger File name (nombre del archivo) el cual ser usado para guardar el recurso (no puedes usar un ruta en el file name). A continuacin puedes indicar que se har con el data file cuando comience el juego: Dont Export. No lo exporta. (Hay una funcin para exportarlo ms tarde.) To Temporary Folder. El archivo es guardado en el directorio temporal para el juego. Esto es muy til para por ejemplo cargar backgrounds, etc. To Working Folder. El archivo es guardado en el flder donde el juego es ejecutado. Muchas rutinas buscan por archivos ah, pero debes tener cuidado pues el jugador podra correr el juego desde una unidad de slo lectura. Install as Font. Si tu archivo es un archivo de fuente puedes seleccionar esta opcin. El archivo es guardado en la carpeta temporal y enseguida instalado como una fuente que puede ser usada en el juego.

Finalmente hay unas cuantas opciones: Free Data Memory. Si lo habilitas la memoria usada para el data file es liberada despus de exportarla. Esto salva memoria pero significa que el recurso no puede ser usado en funciones. Overwrite the File. Si lo habilitas el archivo es sobrescribido si ya existe. Remove at Game End. Si est habilitado el archivo es removido al finalizar el juego. (Nota que los archivos en el directorio temporal siempre son removidos al final del juego.) Si ocurre un error durante la exportacin el juego seguir corriendo. Pero el archivo o fuente no estar disponible. Los Data Files pueden usar mucha memoria, pero cargarlos y exportarlos en muy rpido.

Captulo 25 Informacin del juego


Un buen juego provee al jugador con cierta informacin sobre como jugar el juego. Esta informacin es desplegada cuando el jugador presiona la tecla <F1> durante el juego. Para crear la informacin del juego, da doble clic en Game Information en el rbol de recursos a la izquierda de la pantalla. Se abre un pequeo editor de texto en donde puedes editar la informacin del juego. Puedes usar diferentes fuentes, diferentes colores, y estilos. Tambin puedes poner un color de fondo. Una opcin interesante en el men Format es Mimic Main Form. Cuando habilitas esta opcin la ventana de la ayuda se muestra exactamente en la misma posicin y tamao que el juego. Esto da como resultado que se vea como si el texto apareciera en la ventana del juego. Escogiendo el color de fondo apropiado provee un efecto visual agradable. (Podras indicar en el fondo de la ayuda que el jugador debe presionar Escape para continuar jugando.) Un buen consejo es hacer la informacin corta pero precisa. Por supuesto puedes agregar tu nombre porque t creaste el juego. Todos los juegos de ejemplo proveen un archivo de informacin acerca del juego y de cmo fue creado. Si quieres hacer una ayuda ms imaginativa, usa por ejemplo Word. Y entonces seleccionas la parte que desees y usa copiar y pegar para moverlo desde Word al editor de Game Information. A good game provides the player with some information on how to play the game. This information is displayed when the player presses the <F1> key during game play. To create the game information, double click Game Information in the resource tree at the left of the screen. A little build-in editor is opened where you can edit the game information. You can use different fonts, different colors, and styles. Also you can set the background color. One interesting option in the Format menu is to Mimic Main Form. When you check this option the help form is displayed exactly at the position and the size of the game form. As a result it looks like the text appears in the game window. Choosing the correct background color now provides a nice visual effect. (You might want to indicate at the bottom of the help file that the user must press Escape to continue playing.) A good advice is to make the information short but precise. Of course you should add your name because you created the game. All example games provided have an information file about the game and how it was created. If you want to make a bit more fancy help, use e.g. Word. Then select the part you want and use copy and paste to move it from Word to the game information editor.

Captulo 26 Opciones del juego


Existen un nmero de opciones que puedes cambiar para tu juego. Pueden ser encontradas haciendo doble clic en Game Options en el rbol de recursos a la izquierda de la pantalla. Estas estn subdivididas en varias pestaas. There are a number of options you can change for your game. They can be found by double clicking on Game Options in the resource tree at the left of the screen. They are subdivided in a number of tabbed pages.

26.1

Opciones para los grficos

En esta pestaa puedes poner un nmero de opciones que estn relacionadas con la apariencia grfica del juego. Normalmente es til comprobar los efectos de esas opciones porque pueden tener un efecto significativo en la forma en que el juego luce. Recuerda que diferentes usuarios tienen mquinas diferentes. Entonces asegrate que las opciones funcionen en las mquinas de otra gente. Start in fullscreen mode Cuando lo habilitas el juego corre en pantalla completa; de lo contrario corre en una ventana. Scale percentage in windowed mode Aqu puedes indicar que la imagen en el modo ventana debe ser escalada. 100 es no hacer una escala. Tpicamente lo usas cuando tus sorites y cuantos son muy pequeos. Crear escalas es muy lento pero la mayora de las tarjetas de video actuales pueden hacerlo sin problemas. Es mejor no usar valores menores de 100 pues hacer escalas para reducir en tamao normalmente es muy lento. Scale percentage in fullscreen mode Aqu indicas que la imagen en pantalla completa debe ser escalada. 100 es sin escala. Un valor de 0 indica que la escala debe ser la mxima posible. Usar escalas es muy lento pero la mayora de las tarjetas de video actuales pueden hacerlo sin problemas. Es mejor no usar valores menores de 100 pues hacer escalas para reducir en tamao normalmente es muy lento. Only scale when there is hardware support Si lo habilitas solo se usan las escalas si el hardware lo soporta. Desafortunadamente aunque algunas tarjetas de video indican que el hardware soporta escalas, aunque en realidad no lo puedan hacer. Dont draw a border in windowed mode Si lo habilitas en el modo ventana no tendr un borde ni la barra de ttulo. Dont show the buttons in the window caption Cuando est habilitado, en el modo ventana va a mostrar los botones para cerrar o para minimizar.

Wait for vertical blank before drawing La pantalla de tu computadora se refresca cierto nmero de veces por segundo (normalmente entre 50 y 100). Despus de refrescar la pantalla hay algo llamado vaco vertical donde nada pasa en la pantalla. Si dibujas la pantalla continuamente, parte de una imagen y parte de la siguiente podra verse en la pantalla, lo cual le da un efecto visual pobre. Si esperas por el vaco vertical antes de dibujar el siguiente cuadro, este problema desaparece. La desventaja es que el programa debe esperar por el vaco vertical lo que puede hacer un poco ms lento el juego. Display the cursor Aqu indicas si quieres que el puntero del ratn vaya a ser visible. Desactivarlo es normalmente ms rpido y agradable. (Puedes hacer fcilmente tu propio cursor con el Game Maker.) Display the caption in fullscreen mode Si lo habilitas, en el modo pantalla completa una pequea caja blanca es dibujada arriba a la izquierda, mostrando el caption del cuarto, el score y el number of lives. Puedes deshabilitarlo aqu. Es ms agradable si t dibujas estas cosas en un lugar apropiado en tus cuartos. Freeze the game when the form looses focus Cuando lo habilitas, si el jugador pone alguna otra ventana sobre el juego (por ejemplo otro programa) el juego se congela hasta que la ventana del juego es enfocada otra vez.

26.2

Resolucin

En esta pestaa puedes indicar la resolucin en que correr el juego. Set the resolution of the screen La pantalla tiene una resolucin particular. Tres aspectos juegan un papel aqu: el nmero de pxeles de la pantalla (horizontales y verticales), el nmero de bits usados para representar los colores, y la frecuencia en que la pantalla es actualizada. Normalmente Game Maker no cambia estas opciones, esto es, que usa la configuracin de la mquina donde el juego se ejecuta. Esto nos lleva a grficos pobre. Por ejemplo, si tus cuartos son pequeos y un usuario tiene una resolucin ms grande, el juego se va a mostrar en una pantalla muy pequea. Puedes seleccionar esto usando full screen mode (pantalla completa) y escalando la imagen, pero esto puede hacer lento el juego. La mejor manera de resolver esto es decir al Game Maker que cambie la resolucin de la pantalla cuando corra el juego. Lo cambiar de regreso despus del juego. Para hacerlo habilita esta opcin. Un nmero de opciones adicionales aparecern. Primero puedes indicar la intensidad del color (16 o 32 bits; 16 bits es mejor; en Windows 98 los juegos siempre corren con una paleta de colores de 16 bits, incluso si especificas 32 bits). Despus puedes indicar el tamao de la pantalla (320x240, 640x480, 800x600, 1024x768, 1280x1024, o 1600x1200). Tambin aqu hay algunas advertencias. Si usas una resolucin pequea (Ej. 320x240) Windows cambiar el tamao de todas la ventanas cuando corra el juego. Esto puede causar problemas con otras aplicaciones que estn corriendo (incluyendo Game Maker). (Usa exclusive Mode para evitarlo.) Cuando usas

las dos ms grandes tienes que tener cuidado porque no todas las computadoras lo soportan. Tambin puedes indicar que no cambie la resolucin de la pantalla. Finalmente puedes indicar la frecuencia (60, 70, 85, 100; si el que especificas es demasiado alto, la frecuencia predeterminada es usada; tambin puedes especificar que usa la frecuencia predeterminada). Tambin la siguiente opcin aparece: Use exclusive graphics mode En modo exclusivo, el juego tiene el control total sobe la pantalla. Ninguna otra aplicacin la puede usar ms. Esto hace los grficos un poco ms rpidos y permite algunos efectos especiales (como la configuracin gamma). Si quieres asegurarte que la computadora del jugador est y se mantenga en la resolucin de pantalla correcta, mejor usa exclusive mode (modo exclusivo). Adems no se pueden mostrar advertencias. En modo exclusivo no se puede mostrar ninguna otra ventana. Esto significa que no puedes usar acciones que muestren un mensaje, hagan una pregunta, muestre los puntajes ms altos, o la informacin del juego. Adems ningn error puede ser reportado. En general, cuando algo falla en modo exclusivo el juego termina, y a veces esto no ayuda y el jugador no tiene otra opcin que reiniciar el juego. Debes asegurarte que tu juego funcione correctamente. No puedes correr el juego en debug mode cuando se usa el modo exclusivo.

26.3

Opciones de teclas

Let <Esc> end the game Cuando lo habilitas, al presionar la tecla Escape termina el juego. Los juegos ms avanzados normalmente no quieren que esto pase porque talvez quieran hacer algunos procesos (como salvar) antes de terminar el juego. En este caso, deshabilita esta opcin y provee tu propia accin para la tecla escape. (Dar un clic sobre la cruz de la ventana tambin genera un evento de la tecla escape.) Let <F1> show the game information Cuando est habilitado, presionando la tecla F1 muestra la informacin del juego (pero no en el modo exclusivo). Let <F4> switch between screen modes Si lo habilitas, la tecla F4 cambiar entre pantalla completa y el modo ventana (no en el modo exclusivo.) Let <F5> and <F6> load and save the game Cuando est habilitado, el jugador puede usar F5 para guardar la situacin actual del juego, y F6 para cargar el ltimo juego guardado.

26.4

Opciones de carga

Aqu puedes indicar lo que debe suceder cuando cargas el juego. Primero puedes especificar una imagen propia de cargado. Despus puedes indicar si se mostrar una barra del proceso de cargado en la parte baja de la imagen. Tienes tres opciones. Que no se muestre una barra de progreso, que se muestre la barra que est por defecto o puedes especificar dos imgenes: El fondo de la barra de cargado (back image) y la imagen en

primer plano (front image). Estas se ajustarn para obtener el tamao adecuado. (En este caso debes de especificar ambas imgenes, no slo una.) Despus, puedes indicar un icono que ser usado en el juego ejecutable. Slo puedes usar un icono de 32x32 pixeles. Si intentas seleccionar otro tipo de icono obtendrs una advertencia. Finalmente puedes cambiar el id nico del juego. Este id se usa para registrar los puntajes ms altos y los juegos salvados. Si t liberas una nueva versin de tu juego y no quieres usar los puntajes anteriores, debes cambiar este nmero.

26.5

Opciones de errores

Aqu especificas algunas opciones relativas a la manera en que los errores son reportados. Display error messages Si lo habilitas, los mensajes de error se muestran al jugador (excepto en exclusive mode. ) En la versin final de tu juego deberas deshabilitar esta opcin. Write error messages to file game_errors.log Si lo seleccionas, todos los mensajes de errores son escritos en un archivo llamado game_errors.log en la carpeta del juego. Abort on all error messages Normalmente ciertos errores son fatales, mientras otros pueden ser ignorados. Cuando habilitas esta opcin todos los errores son considerados fatales y el juego es terminado. En la versin final del juego deberas habilitar esta opcin. Treat uninitialized variables as 0 Un error comn es utilizar una variable antes de que tenga un valor asignado. Algunas veces esto es difcil de evitar. Cuando habilitas esta opcin, las variables sin inicializar no reportarn un error pero se les asignar el valor de 0. Aunque debes tener cuidado. Esto significar que ya no sers informado de errores de escritura.

26.6

Opciones de informacin

Aqu indicas el nombre del autor del juego. La versin del juego, y alguna informacin acerca del juego. Adems se mantiene la fecha de la ltima modificacin. Esto es til si ests trabajando con varias personas en un juego o haciendo una nueva versin. Esta informacin no es accesible mientras se ejecute el juego.

Captulo 27 Consideraciones sobre la velocidad


Si ests haciendo juegos complicados probablemente quieras hacer que corran lo ms rpido posible. Aparte de que Game Maker hace que el juego corra lo ms rpido posible, mucho depende en como disees el juego. Adems es muy fcil crear juegos que utilicen mucha memoria. En este captulo te dar algunas sugerencias sobre cmo hacer tus juegos ms rpidos y de tamao pequeo. Antes de todo, mira cuidadosamente a los sprites y backgroundos que utilizas. Los sprites animados necesitan mucha memoria y dibujar muchos sprites toma mucho tiempo. Debes hacer tus sprites lo ms pequeos que puedas. Decide cuidadosamente cuales sprites sern almacenados en la memoria de video y cuales cargar slo en uso. Lo mismo sucede con los backgrounds. En general deben cargarse solo en uso y, en particular cuando las imgenes son muy grandes, no debes de almacenarlas en la memoria de video. Si tienes un background que cubra el fondo, asegrate de deshabilitar el uso de un color de fondo (background color) en las opciones de tus cuartos. Si utilizas el modo pantalla completa o el modo exclusivo, asegrate de que el tamao del cuarto (o ventana) no sea mayor que el tamao de la pantalla. La mayora de las tarjetas de video pueden eficientemente aumentar a escala las imgenes, pero reducir a escala es lento. Adems, dibuja la menor cantidad de cosas que no sean sprites. Esto es lento. Si las necesitas, prefiere dibujar una despus de otra. Finalmente, si es posible, desactiva el cursor. Esto hace lentos los grficos. Tambin ten cuidado de no utilizar muchas vistas. Por cada vista el cuarto se vuelve a dibujar. Aparte de los grficos, otros aspectos influyen a la velocidad. Asegrate de tener la menor cantidad de instancias (objetos) como sea posible. En particular, destruye los objetos que ya no sean requeridos (Ej. cuando abandonan el cuarto). Evita mucho cdigo en el evento step o en el evento drawing de los objetos. Frecuentemente las cosas no necesitan ser verificadas en cada paso. La interpretacin del cdigo es razonablemente rpida, pero esto es interpretado. Adems, algunas funciones y acciones toman mucho tiempo; en particular cuando tiene que verificar todos los objetos (como las acciones de colisin). Piensa acerca de donde utilizar los eventos de colisin. Normalmente tienes dos opciones. Los objetos que no tienen eventos de colisin son tratados mucho ms rpidos, entonces utilzalos en los objetos que tengan pocas instancias. Ten cuidado con el uso de archivos de sonido muy grandes. Necesitan mucha memoria y adems se comprimen muy mal. Deberas verificar tus sonidos y ver si puedes detenerlos. Finalmente, si quieres crear un juego que muchas personas puedan jugar, asegrate de probar el juego en mquinas viejas.

Captulo 28 El Lenguaje Game Maker (GML)


Como habrs ledo antes, el Game Maker contiene un lenguaje de programacin interno. Este lenguaje te da mucha ms flexibilidad y control que las acciones estndar. Nos referiremos a este lenguaje como el GML (de Game Maker Language). Hay tres diferentes lugares en los que puedes escribir programas con este lenguaje. El primero, cuando defines scripts. Un script es un programa en GML. Segundo, cuando agregas una accin de cdigo a un evento. En una accin de cdigo debes escribir un programa en GML. Finalmente, en cualquier momento que necesites especificar algn valor en una accin, puedes tambin emplear una expresin en GML. Una expresin, como veremos ms adelante no es un programa completo, sino una pieza de cdigo que devuelve un resultado. En este captulo describir la estructura bsica de los programas en GML. Cuando desees usar programas en GML, se debe tener cuidado con ciertos aspectos. Primero que nada, para todos tus recursos (sprites, objetos, sonidos, etc.) debes emplear nombres que inicien con una letra y que slo consistan de letras, nmeros y el guin bajo _. De otra forma no podrs referirte a ellas desde el programa. Tambin ten cuidado de no nombrar a tus recursos self, other, global o all porque estas son palabras que tienen un significado especial dentro del lenguaje. Tampoco debes usar ninguna de las palabras reservadas indicadas a continuacin.

28.1

Un programa

Un programa consiste en un bloque. Un bloque consiste de una o ms sentencias, delimitadas por los smbolos { y }. Las sentencias deben separarse con el smbolo ;. As, la estructura global de todo programa es:
{ <sentencia>; <sentencia>; }

Una sentencia puede ser tambin un bloque de ellas. Hay varios tipos de sentencias, de las cuales hablaremos a continuacin.

28.2

Variables

Como en cualquier lenguaje de programacin, el GML contiene variables. Las variables pueden almacenar valores reales o cadenas. Las variables no necesitan ser declaradas. Hay un gran nmero de variables internas. Algunas son generales, como mouse_x y mouse_y, las cuales indican la posicin actual del cursor, mientras otras son locales para la instancia del objeto para el cual se ejecuta el programa, como x y y que indican la posicin actual de la instancia. Una variable tiene un nombre que debe iniciar con una letra, y puede contener slo letras, nmeros, y el smbolo _. (La longitud mxima es de 64 caracteres). Cuando haces uso de una nueva variable, sta es local para la instancia actual y no es conocida en los programas de otras instancias (an del mismo objeto).

aunque existe la posibilidad de hacer referencia a variables de otras instancias; ve a continuacin.

28.3

Asignacin

Una asignacin pasa el valor de una expresin a una variable. Una asignacin tiene la siguiente forma:
<variable> = <expresin>;

Adems de asignar un valor a una variable, tambin se le puede sumar usando +=, restar usando -=, multiplicarla usando *=, o dividirla usando /=. (Esto solo funciona para variables que contengan valores reales y expresiones, no para las cadenas).

28.4

Expresiones

Las expresiones pueden ser nmeros reales (p. ej. 3.4), cadenas entre comillas simples o dobles (p. ej. hola o hola) u otras ms complicadas. Para las expresiones, existen los siguientes operadores binarios (en orden de prioridad):
&&, ||: funciones Booleanas (&& para la funcin and, || para la funcin) <, <=, ==, !=, >, >=: comparaciones, el resultado es true (1) o false (0) +, -: adicin, sustraccin *, /, div, mod: multiplicacin, divisin, divisin entera y mdulo.

Tambin, tenemos los siguientes operadores unarios:


!: not, convierte un valor verdadero en falso y uno falso en verdadero -: cambio de signo

Como valores se pueden emplear nmeros, variables o funciones que devuelvan algn valor. Las sub-expresiones se pueden colocar entre parntesis. Todos los operadores funcionan para valores reales. Las comparaciones tambin funcionan para las cadenas y el + concatena cadenas. Ejemplo Aqu tenemos un ejemplo con algunas asignaciones.
{ x = 23; str = 'hola mundo'; y += 5; x *= y; x = 23*((2+4) / sin(y)); str = 'hola' + " mundo"; b = (x < 5) && !(x==2 || x==4); }

28.5

Ms sobre variables

Puedes crear nuevas variables al asignndoles un valor (no es necesario declararlas antes). Si simplemente usas un nombre de variable, la variable ser almacenada slo para la instancia actual. Por lo que no esperes encontrarla cuando manejes otro objeto (u otra instancia del mismo objeto). Tambin se puede cambiar y leer variables de otros objetos colocando el nombre del objeto con un punto antes del nombre de la variable. Para crear variables globales, cuyo valor pueda ser visto por todas las instancias, coloca antes la palabra global y un punto. Por ejemplo puedes escribir:
{ if (global.hacer) { // hacer algo global.hacer = false; } }

28.6

Direccionando variables en otras instancias

Como se dijo antes, puedes alterar variables en la instancia actual usando sentencias como
x = 3;

Pero en ciertos casos querrs acceder a variables en otra instancia. Por ejemplo, para detener el movimiento de todas las pelotas, o para mover al personaje principal a cierta posicin, o, en el caso de una colisin, cambiar el sprite de la otra instancia involucrada. Esto puede lograrse antecediendo el nombre del objeto y un punto al nombre de la variable. As por ejemplo, puedes escribir
pelota.speed = 0;

Esto cambiar la velocidad de todas las instancias del objeto pelota. Hay ciertos objetos especiales. self: La instancia actual para la que estamos ejecutando la accin other: La otra instancia involucrada en un evento de colisin all: Todas las instancias noone: Ninguna instancia (tal vez te parezca raro pero puede ser til como veremos ms adelante) global: No es precisamente una instancia, sino un contenedor que almacena variables globales As, por ejemplo, puedes usar las siguientes sentencias:
other.sprite_index = sprite5; all.speed = 0; global.mensaje = 'Buen resultado'; global.x = pelota.x;

Ahora tal vez te ests preguntando lo que la ltima tarea realiza cuando hay ms de una pelota. Bien, se toma la primera y su valor x es asignado al valor global. Pero qu tal si deseas establecer la velocidad de una pelota en particular, en lugar de la de todas ellas. Esto es un poco ms difcil. Cada instancia tiene un id nico. Cuando colocas instancias en un cuarto en el diseador, este id se muestra cuando colocas el ratn sobre la instancia. Estos nmeros son mayors o iguales a 100000. Puedes emplear estos nmeros como la parte a la izquierda del punto. Pero ten cuidado. El punto sera interpretado como el punto decimal en el nmero. Para evitarlo, colocalo entre parntesis. As por ejemplo, asumiendo que el ide de la pelota es 100032, puedes escribir:stos nmeros But what if you want to set the speed of one particular ball, rather than all balls. This is slightly more difficult. Each instance has a unique id. When you put instances in a room in the designer, this instance id is shown when you rest the mouse on the instance. These are numbers larger than or equal to 100000. Such a number you can also use as the left-hand side of the dot. But be careful. The dot will get interpreted as the decimal dot in the number. To avoid this, put brackets around it. So for example, assuming the id of the ball is 100032, you can write:
(100032).speed = 0;

Cuando creas una instancia en el programa, la llamada devuelve su id. Una pieza de programa vlido es
{ nnn = instance_create(100,100,pelota); nnn.speed = 8; }

Esto crea una pelota y establece su velocidad. Nota que hemos asignado el id de la instancia a una variable y usamos esta variable como indicacin antes del punto. Esto es completamente vlido. Djame explicarlo un poco major. Un punto es de hecho, un operador. Toma un valor como el operador de la izquierda y una variable (direccin) como el operador de la derecha, y devuelve la direccin de esta variable en particular para el objeto o instancia indicados. Todos los nombres de objetos, y los objetos especiales nombrados antes representan valores y pueden ser tratados como con cualquier otro valor. Por ejemplo, el siguiente programa es correcto: This creates a ball and sets its speed. Note that we assigned the instance id to a variable and used this variable as indication in front of the dot. This is completely valid. Let me try to make this more precise. A dot is actually an operator. It takes a value as left operand and a variable (address) as right operand, and returns the address of this particular variable in the indicated object or instance. All the object names, and the special objects indicated above simply represent values and these can be dealt with like any value. For example, the following program is valid:
{ obj[0] = pelota; obj[1] = bandera; obj[0].alarm[4] = 12;

obj[1].id.x = 12; }

La ltima sentencia debiera interpretarse como sigue. Tomamos el id de la primera bandera. Para la instancia con ese id establecemos a 12 su coordenada x. Los nombres de objetos, objetos especiales y los id de las instancias pueden tambin emplearse en otras funciones.

28.7

Arrays

Puedes emplear arrays de una o dos dimensiones en el GML. Simplemente coloca el ndice entre corchetes cuadrados para un array unidimensional, y los dos ndices con una coma entre ellos para los arrays bidimensionales. En el momento en que emplees un ndice el array es generado. Cada array inicia en el ndice 0. Por lo que debes tener cuidado al usar ndices muy grandes ya que se ocupar memoria para un array grande. Nunca emplees indices negativos. El sistema coloca un lmite de 32000 para cada indice y 1000000 para el tamao total. Por ejemplo, puedes escribir lo siguiente:
{ a[0] = 1; i = 1; while (i < 10) { a[i] = 2*a[i-1]; i += 1;} b[4,6] = 32; }

28.8

Sentencia if
if (<expresin>) <sentencia>

Una sentencia if tiene la forma o

if (<expresin>) <sentencia> else <sentencia>

La sentencia tambin puede ser un bloque. La expresin se evaluar. Si el valor (entre parntesis) es <=0 (false) se ejecuta la sentencia despus del else, de otra forma (true) se ejecuta la otra sentencia. Es un buen hbito colocar siempre corchetes a las sentencias en la sentencia if. Por lo que mejor usa
if (<expresin>) { <sentencia> } else { <sentencia> }

Ejemplo El siguiente programa mueve el objeto hacia el centro de la pantalla.

{ if (x<200) {x += 4} else {x -= 4}; }

28.9

Sentencia repeat
repeat (<expresin>) <sentencia>

Una sentencia repeat tiene la forma

La sentencia se repite el nmero de veces indicado por el valor redondeado de la expresin. Ejemplo El siguiente programa crea cinco pelotas en posiciones aleatorias.
{ repeat (5) instance_create(random(400),random(400),pelota); }

28.10 Sentencia while


Una sentencia while tiene la forma
while (<expresin>) <statement>

Mientras la expresin sea verdadera, la sentencia (que puede tambin ser un bloque) es ejecutada. Ten cuidado con tus ciclos while. Puedes fcilmente hacer que se repitan eternamente, en cuyo caso el juego se bloquear y ya no responder a los comandos del usuario. Ejemplo El siguiente programa intenta colocar al objeto actual en una posicin libre (esto es casi lo mismo que la accin para mover un objeto a una posicin aleatoria).
{ while (!place_free(x,y)) { x = random(room_width); y = random(room_height); } } }

28.11 Sentencia do
Una sentencia do tiene la forma
do <sentencia> until (<expresin>)

La sentencia (que puede tambin ser un bloque) es ejecutada hasta que la expresin sea verdadera. La sentencia se ejecuta por lo menos una vez. Ten cuidado con los ciclos do. Puedes fcilmente crear uno que se repita indefinidamente, en cuyo caso el juego se bloquear y ya no responder a los eventos generados por el usuario. Ejemplo El siguiente programa intenta colocar el objeto actual en una posicin libre (es casi lo mismo que la accin para mover un objeto a una posicin aleatoria).
{ do { x = random(room_width); y = random(room_height); } until (place_free(x,y)) }

28.12 Sentencia for


Una sentencia for tiene la forma
for (<sentencia1> ; <expresin> ; <sentencia2>) <sentencia3>

Funciona de la manera siguiente. Primero se ejecuta la sentencia1. entonces se evala la expresin. Si es verdadera, se ejecuta la sentencia3; entonces la sentencia2 y luego se evala nuevamente la expresin. Esto contina hasta que la expresin sea falsa. Puede sonar complicado. Debes interpretarlo de la manera siguiente. La primera sentencia inicializa el ciclo for. La expresin prueba si el ciclo debiera terminar. La sentencia2 es la sentencia de paso hacia la evaluacin del siguiente ciclo. El uso ms comn es para llevar un contador hasta cierto valor. Ejemplo El siguiente programa inicializa un array lista de longitud 10 con los valores 1-10.
{ for (i=0; i<9; i+=1) lista[i] = i+1; }

28.13 Sentencia switch


En ciertas situaciones querrs llevar a cabo alguna accin dependiendo de un valor en particular. Puedes lograrlo empleando varias sentencias if pero es ms sencillo si empleas la sentencia switch. Una sentencia switch tiene la siguiente forma:
switch (<expresin>) {

case <expresin1>: <sentencia1>; ; break; case <expresin2>: <sentencia2>; ; break; default: <sentencia>; }

Funciona como sigue. Primero se ejecuta la expresin. Despus se compara con los resultados de las diferentes expresiones delante de las sentencias case. La ejecucin contina despus de la sentencia case con el valor correcto, hasta que se encuentre una sentencia break. Si no se encuentra una sentencia case con el valor correcto, la ejecucin contina despus de la sentencia default. (No es necesaria la sentencia default. Nota que se pueden colocar mltiples sentencias case para la misma sentencia. Tambin, no es necesaria la sentencia break. Si no existe una sentencia break, la ejecucin simplemente contina con el cdigo para la siguiente sentencia case.This works as follows. First the expression is executed. Next it is compared with the results of the different expressions after the case statements. The execution continues after the first case statement with the correct value, until a break statement is encountered. If no case statement has the right value, execution is continued after the default statement. (No default statement is required. Note that multiple case statements can be placed for the same statement. Also, the break is not required. If there is no break statement the execution simply continues with the code for the next case statement. Ejemplo El siguiente programa lleva a cabo una accin de acuerdo a la tecla que sea presionada.
switch (keyboard_key) { case vk_left: case vk_numpad4: x -= 4; break; case vk_right: case vk_numpad6: x += 4; break; }

28.14 Sentencia break


La sentencia break tiene la forma
break

Si se emplea en un ciclo for, while, repeat, en una sentencia switch o with, finaliza el ciclo o sentencia. Si es empleada fuera de una de estas sentencias finaliza el programa (no el juego).

28.15 Sentencia continue


La sentencia continue tiene la forma
continue

Si se emplea dentro de un ciclo for, while, repeat o con una sentencia with, continua con el siguiente valor del ciclo for o de la sentencia with.

28.16 Sentencia exit


La sentencia exit tiene la forma
exit

Simplemente termina la ejecucin del programa/script actual. (No termina la ejecucin del juego! Para ello necesitas la funcin game_end(); ver ms abajo)

28.17 Funciones
Una funcin tiene la siguiente estructura: nombre de la funcin, seguido por uno o varios argumentos entre parntesis, separados por comas (tambin puede no incluir ningn argumento).
<funcin>(<arg1>,<arg2>,)

Hay dos tipos de funciones. En primer lugar, tenemos una gran cantidad de funciones internas, para controlar todos los aspectos del juego. Despus, cualquier scipt que definas en el juego puede ser empleado como una funcin. Nota que para una funcin sin argumentos an se necesitan los parntesis. Algunas funciones devuelven valores y pueden ser empleadas en expresiones. Otras simplemente ejecutan rdenes.

28.18 Scripts
Cuando creas un script, querrs tener acceso a los argumentos enviados a l (ya sea cuando uses una accin script, o cuando llames al script como una funcin desde un programa u otro, o inclusive desde el mismo script). Estos argumentos se almacenan en las variables argument0, argument1, , argument9. Por lo que puede haber como mximo 10 argumentos. (Nota: cuando se llama un script desde una accin, slo se pueden especificar los primeros 3 argumentos). Los scripts tambin pueden devolver un valor, por lo que pueden ser empleados en expresiones. Para ello debes emplear la declaracin return:
return <expresin>

La ejecucin del script termina en la declaracin return! statement! Ejemplo Aqu est la definicin de un pequeo scrpt que calcula el cuadrado del argumento:
{

return (argument0*argument0); }

Para llamar un script desde una pieza de cdigo, solo hazlo como cuando se hacen las llamadas a funciones. Esto es, el nombre del script con sus argumentos entre parntesis.

28.19 Construcciones with


Como se indic antes, es posible leer y cambiar el valor de las variables en otras instancias. Pero en ciertos casos querrs hacer mucho ms con esas otras instancias. Por ejemplo, imagina que deseas mover todas las pelotas 8 pixeles hacia abajo. Pudieras pensar que eso se logra con el siguiente cdigo
pelota.y = pelota.y + 8;

Pero no es cierto. El valor a la derecha de la asignacin obtiene la coordenada y de la primera pelota y le suma 8. Entonces este nuevo valor se toma como la coordenada y para todas las pelotas. Por lo que el resultado es que todas las pelotas tienen la misma coordenada y. La sentencia
pelota.y += 8;

tendr exactamente el mismo efecto porque es simplemente una abreviatura de la primera declaracin. Entonces, cmo logramos esto? Para ello existe la declaracin with. Su forma general es
with (<expresin>) <statement>

<expresin> indica una o ms instancias. Para esto puedes emplear el id de la instancia, o el nombre de un objeto (para indicar todas las instancias de este objeto) o uno de los objetos especiales (all, self, other, noone). <declaracin> se ejecuta para cada una de las instancias indicadas, como si la instancia fuera la instancia (self) actual. As, para mover todas las pelotas 8 pixeles hacia abajo, puedes escribir
with (pelota) y += 8;

Si deseas ejecutar mltiples declaraciones, colcalas entre corchetes. Por ejemplo, para mover todas las pelotas a una posicin aleatoria, puedes usar
with (pelota) { x = random(room_width); y = random(room_height); }

Nota que, dentro de las declaraciones, la instancia indicada se ha vuelto la instancia self. En tonces, la instancia self original ahora es la instancia other. As, por ejemplo, para mover todas las pelotas a la posicin de la instancia actual, puedes usar

with (pelota) { x = other.x; y = other.y; }

El uso de la declaracin with es muy poderoso. A continuacin te muestro unos cuantos ejemplos ms. Para destruir todas las pelotas usas
with (pelota) instance_destroy();

Si una bomba explota y quieres destruir todas las instancias cercanas a ella puedes usar
with (all) { if (distance_to_object(other) < 50) instance_destroy(); }

28.20 Comentarios
Puedes agregar comentarios a tus programas. Todo en una lnea despus de // no se ejecuta. Internamente se emplea para indicar el fin de una lnea.

28.21 Funciones y variables en GML


El GML contiene un gran nmero de funciones y variables internas. Con ellas puedes controlar cualquier parte del juego. Para todas las acciones existe una funcin correspondiente por lo que de hecho no necesitas emplear ninguna accin si prefieres emplear cdigo. Pero hay muchas ms funciones y variables que controlan aspectos del juego que no se pueden acceder slo empleando acciones. Por lo que si deseas crear juegos ms avanzados se te recomienda leer los siguientes captulos para tener un panorama general de todo lo que es posible lograr. Por favor nota que estas variables y funciones pueden tambin emplearse cuando se envan valores para las acciones. Por lo que an si no planeas emplear cdigo o escribir algn script, an obtendrs beneficios de esta informacin. En los captulos siguientes se emplean las siguientes convenciones. Los nombres de variables marcados con un * son slo de lectura, es decir, no se puede cambiar su valor. Los nombres de variables con [0..n] despus de ellos son arrays. Se da el intervalo posible de sus ndices.

Captulo 29 Haciendo clculos


El Game Maker contiene un gran nmero de funciones para llevar a cabo diversos clculos. Aqu est una lista completa.

29.1

Constantes
true Igual a 1. false Igual a 0. pi Igual a 3.1415

Se tienen las siguientes constantes:

29.2

Funciones de valores reales


random(x) Devuelve un nmero real entre 0 y x. El nmero siempre es menor

Se tienen las siguientes funciones que manejan nmeros reales. que x.

abs(x) Devuelve el valor absoluto de x. sign(x) Devuelve el signo de x (-1 or 1). round(x) Devuelve x redondeado al entero ms cercano. floor(x) Devuelve x redondeado al entero inmediato inferior. ceil(x) Devuelve x redondeado al entero inmediato superior. frac(x) Devuelve la parte fraccional de x, es decir, la parte despus del punto

decimal.

sqrt(x) Devuelve la raz cuadrada de x. x no debe ser negativo. sqr(x) Devuelve x*x. power(x,n) Devuelve x elevado a la potencia n. exp(x) Devuelve e elevado a la potencia x. ln(x) Devuelve el logaritmo natural de x. log2(x) Devuelve el logaritmo base 2 de x. log10(x) Devuelve el logaritmo base 10 de x. logn(n,x) Devuelve el logaritmo base n de x. sin(x) Devuelve el seno de x (x en radianes). cos(x) Devuelve el coseno de x (x en radianes). tan(x) Devuelve la tangente de x (x en radianes). arcsin(x) Devuelve el seno inverso de x. arccos(x) Devuelve el coseno inverso de x. arctan(x) Devuelve la tangente inversa de x. arctan2(y,x) Calcula arctan(Y/X), y devuelve un ngulo en el cuadrante

correcto.

degtorad(x) Convierte grados a radianes. radtodeg(x) Convierte radianes a grados. min(x,y) Devuelve el mnimo de x y y. max(x,y) Devuelve el mximo entre x y y.

min3(x,y,z) Devuelve el mnimo de x, y y z. max3(x,y,z) Devuelve el mximo de x, y y z. mean(x,y) Devuelve el promedio de x y y. point_distance(x1,y1,x2,y2) Devuelve la distancia entre el punto (x1,y1)

y el punto (x2,y2).

point_direction(x1,y1,x2,y2) Devuelve la direccin del punto (x1,y1)

hacia el punto (x2,y1) en grados. is_real(x) Devuelve 1 si x es un valor real (comparado contra un string). is_string(x) Devuelve 1 si x es un string (comparado contra un valor real).

29.3

Funciones para el manejo de strings


chr(val) Devuelve una cadena que contiene el caracter con valor de cdigo

Las siguients funciones manejan caracteres y cadenzas (strings). ascii val.

ord(str) Devuelve el cdigo ascii del primer caracter en str. real(str) Convierte str en un nmero real. str puede contener un signo menos,

un punto decimal e inclusive una parte exponencial. string(val) Convierte un valor real en una cadena empleando un formato estndar (no hay parte decimal si es un entero, y dos decimales para los dems casos). string_format(val,tot,dec) Convierte val en una cadena empleando tu propio formato: tot indica el nmero total de caracteres y dec indica el nmero de decimales. string_length(str) Devuelve el nmero de caracteres en la cadena. string_pos(substr,str) Devuelve la posicin de substr en str (0 = substr no aparece en str). string_copy(str,index,count) Devuelve una subcadena de str, empezando en la posicin index, y con longitud count. string_char_at(str,index) Devuelve el caracter en posicin index de la cadena str. string_delete(str,index,count) Devuelve una copia de str con la parte removida que empieza en la posicin index con longitud count. string_insert(substr,str,index) Devuleve una copia de str con substr insertado en la posicin index. string_replace(str,substr,newstr) Devuelve una copia de str con la primer ocurrencia de substr reemplazada por newstr. string_replace_all(str,substr,newstr) Devuelve una copia de str con todas las ocurrencias de substr reemplazadas por newstr. string_count(substr,str) Devuelve el nmero de ocurrencias de substr en str. string_lower(str) Devuelve una copia de str en minsculas string_upper(str) Devuelve una copia en maysculas de str.
string_repeat(str,count) Devuelve una cadena que consiste de count copias de str.

string_letters(str) Devuelve una cadena que solo contiene las letras en str. string_digits(str) Devulve una cadena que solo contiene los dgitos en str. string_lettersdigits(str) Devuelve una cadena que contiene las letras y dgitos en str.

Las siguientes funciones acceden al portapapeles para almacenar texto.


clipboard_has_text() Devuelve si hay texto en el portapapeles. clipboard_get_text() Devuelve el texto actual en el portapapeles. clipboard_set_text(str) Coloca la cadena str en el portapapeles.

Captulo 30 GML: Game play


Hay una gran cantidad de variables y funciones que puedes emplear para definir el game play. Estas en particular influyen en el movimiento y creacin de instancias, el timing, y el manejo de los eventos.

30.1

Movindose

Obviamente, un aspecto importante de los juegos es el movimiento de las instancias de los objetos. Cada instancia tiene dos variables internas x y y que indican la posicin de la instancia. (Para ser precisos, indican el lugar donde se encuentra el punto de origen del sprite). La posicin (0,0) es la esquina superior izquierda del cuarto. Puedes cambiar la posicin de la instancia al cambiar los valores de sus variables x y y. Es lo que debes hacer si deseas movimientos ms complicados. Este cdigo normalmente se coloca en el evento sep del objeto. Si el objeto se mueve con velocidad y direccin constants, hay una manera ms fcil de lograrlo. Cada instancia tiene una velocidad horizontal (hspeed) y vertical (vspeed). Ambas se indican en pixeles por paso (step). Una velocidad horizontal positiva indica movimiento a la derecha, una velocidad horizontal negativa indica movimiento a la izquierda. La velocidad vertical positiva es movimiento hacia abajo y la negativa indica movimiento hacia arriba. Por lo que slo debes establecer estos valores una vez (por ejemplo en el evento de creacin) para dar al objeto un movimiento constante. Hay otra manera muy diferente de especificar el movimiento, usando direccin (en grados 0-359), y velocidad (no debe ser negativa). Puedes configurar y leer estas variables para especificar un movimiento arbitrario. (Internamente se convierte a valores de hspeed y vspeed). Tambin tenemos la friccin y la gravedad, y la direccin de la gravedad. Finalmente, tenemos la funcin motion_add(dir,speed) para agregar movimiento al actual. Para concluir, cada instancia tiene las siguientes variables y funciones referents a su posicin y movimiento:
x Su posicin x. y Su posicin y. xprevious Su posicin x anterior. yprevious Su posicin y previa. xstart Su posicin x inicial en el cuarto. ystart Su posicin y inicial en el cuarto. hspeed Componente horizontal de la velocidad. vspeed Componente vertical de la velocidad. direction Su direccin actual (0-360, contra las manecillas del reloj, 0 = a la

derecha). speed Su velocidad actual (pixels por step). friction Friccin actual (pixels por step).

gravity Cantidad actual de gravedad (pixels por paso). gravity_direction Direccin de la gravedad (270 es hacia abajo). motion_set(dir,speed) Establece el movimiento a la velocidad speed y la

direccin dir.

motion_add(dir,speed) Agrega el movimiento al movimiento actual (como

una suma vectorial). path_index Indice del path actual que la instancia sigue. 1 indica que no hay path. path_position Posicin en el path actual. 0 es el inicio del path. 1 es el fin del path. path_orientation Orientacin (contra las manecillas del reloj) en el que se ejecuta el path. 0 es la orientacin normal del path. path_scale Escala del path. Incremntala para hacer al path ms grande. 1 es el valor por defecto. Se tiene una gran cantidad de funciones disponibles que te ayudarn a la definicin de movimientos:
place_free(x,y) Devuelve si la instancia colocada en la posicin (x, y) est

libre de colisin. Normalmente se emplea para revisar antes de mover la instancia a la nueva posicin. place_empty(x,y) Devuelve si la instancia colocada en la posicin (x, y) no se encuentra con nadie. Esta funcin tambin tma en cuenta las instancias no slidas. place_meeting(x,y,obj) Devuelve si la instancia colocada en la posicin (x,y) se encuentra con un el objeto obj. obj puede ser un objeto en cuyo caso la funcin devuelve verdadero si se encuentra con una instancia de ese objeto. Tambin puede ser el id de una instancia, o la palabra especial other. place_snapped(hsnap,vsnap) Devuelve si la instancia est alineada con los valores de snap hsnap y vsnap.
move_random(hsnap,vsnap) Mueve la instancia a una posicin libre, y la

alinea con los valores hsnap y vsnap, alineada, al igual que la accin correspondiente. move_snap(hsnap,vsnap) Alinea la instancia, como la accin correspondiente. move_towards_point(x,y,sp) Mueve la instancia con velocidad sp hacia el punto (x,y). move_bounce_solid(adv) Rebotar contra objetos slidos, como la accin correspondiente. adv indica si se emplea rebote avanzado, que toma en cuenta las paredes inclinadas. move_bounce_all(adv) Rebotar contra todas las insntancias, en lugar de solo con las slidas. move_contact_solid(dir,maxdist) Mover la instancia en la direccin dir hasta que haya contacto con un objeto slido. Si no hay collision en la posicin actual, la instancia es colocada justo antes de donde ocurre una colisin. Si ya hay

una collision en la posicin actual, la instancia no se mueve. Puedes especificar la distancia mxima a mover la instancia maxdist (emplea un nmero negativo para indicar distancia arbitraria). move_contact_all(dir,maxdist) Igual que la funcin anterior pero esta vez se detiene hasta que haya contacto con cualquier objeto, no solo slidos. move_outside_solid(dir,maxdist) Mueve la instancia en la direcin dir hata que no est al alcance de un objeto slido. Si no hay collision en la posicin actual, no se mueve la instancia. Puedes especificar la distancia mxima a mover (usa un valor negativo para indicar una distancia arbitraria). move_outside_all(dir,maxdist) Igual que la anterior pero se mueve hasta estar fuera de alcance de cualquier objeto, no solo objetos slidos.
distance_to_point(x,y) Devuelve la distancia de la caja lmite de la

instancia actual hacia el punto (x,y). distance_to_object(obj) Devuelve la distancia de la instancia actual a la instancia ms cercana del objeto obj.

position_empty(x,y) Indica si no hay nada en la posicin (x,y). position_meeting(x,y,obj) Indica si en la posicin (x,y) hay una instancia obj. obj puede ser un objeto, una id de una instancia, o las palabras clave self, other o all.

30.2

Instancias

En el juego, las unidades bsicas son las instancias de los diferentes objetos. Durante el juego puedes cambiar varios aspectos de estas instancias. Tambin puedes crear nuevas instancias y destruir otras. Adems de las variables relacionadas con el movimiento mostradas arriba y las variables relacionadas con el dibujo de las instancias que se tratarn ms adelante, cada instancia cuenta con las siguientes variables:
object_index* ndice del objeto del cual es instancia. Esta variable no puede

ser cambiada. id* El identificador nico para la instancia (>=100000). (Nota: al definir cuartos siempre se muestra el id de la instancia bajo el cursor). mask_index ndice del sprite empleado como mascara para las colisiones. Da un valor de 1 para que que sea igual a sprite_index. solid Indica si la instancia es slida. Puede cambiarse durante el juego. persistent Indica si la instancia es persistente y reaparecer al moverse a un Nuevo cuarto. Normalmente desactivas la persistencia en ciertos momentos. (Por ejemplo si vuelves al cuarto anterior).

Slo hay un problema al manejar instancias, no es fcil identificar instancias individuales. No cuentan con un nombre. Cuando slo hay una instancia de un objeto en particular puedes usar el nombre del objeto pero en otros casos requerirs obtener el id de la instancia. Este es un identificador nico para la instancia, puedes emplearlo en las sentencias with y como identificador de un objeto (el uso de la construccin . se describe

en la seccin 28.6). Afortunadamente hay varias variables y rutinas que te ayudan a obtejer los id de las instancias.
instance_count* El nmero de instancias que existen actualmente en el

cuarto.

instance_id[0..n-1]* El id de la instancia en particular. n es el nmero de la

instancia.

Permteme darte un ejemplo. Considera que cada unidad en tu juego tiene un poder en particular y quieres encontrar la ms poderosa, pudieras usar el siguiente trozo de cdigo:
{ maxid = -1; maxpower = 0; for (i=0; i<instance_count; i+=1) { iii = instance_id[i]; if (iii.object_index == unit) { if (iii.power > maxpower) {maxid = iii; maxpower = iii.power;} } } }

Despus del ciclo, maxid contendr el id de la unidad con mayor poder. (No destruyas instancias durante un ciclo de este tipo porque se quitarn automticamente del array y como resultado empezars a saltarte instancias).
instance_find(obj,n) Devuelve el id de la instancia (n+1)sima de tipo obj.

obj puede ser un objeto o la palabra clave all. Si obj no existe, se devuelve el objeto especial noone. instance_exists(obj) Indica si la instancia de tipo obj existe. obj puede ser un objeto, un id de una instancia, o la palabra clave all. instance_number(obj) Devuelve el nmero de instancias de tipo obj. obj pude ser un objeto o la palabra clave all. instance_position(x,y,obj) Devuelve el id de la instancia de tipo obj en la posicin (x,y). cuando varias instancias estn en esa posicin se devuelve la primera. obj puede ser un objeto o la palabra clave all. Si no existe, se devuelve el objeto especial noone. instance_nearest(x,y,obj) Devuelve el id de la instancia de tipo obj ms cercana al punto (x,y). obj puede ser un objeto o la palabra clave all. instance_furthest(x,y,obj) Devuelve el id de la instancia de tipo obj ms alejada del punto (x,y). obj puede ser un objeto o la palabra clave all. instance_place(x,y,obj) Devuelve el id de la instancia de tipo obj encontrado cuando la instancia actual es colocada en la posicin (x,y). obj puede ser un objeto o la palabra clave all. Si no existe, se devuelve el objeto especial noone.

Las siguientes funciones pueden emplearse para crear y destruir instancias.


instance_create(x,y,obj) Crea una instancia de obj en la posicin (x,y).

La funcin devuelve el id de la nueva instancia. instance_copy(performevent) Crea una copia de la instancia actual. El argumento indica si el evento de creacin se debe ejecutar para la copia. La funcin devuelve el id de la nueva copia. instance_destroy() Destruye la instancia actual. instance_change(obj,perf) Camba la instancia en obj. perf indica si se deben ejecutar los eventos de destruccin y creacin. position_destroy(x,y) Destruye todas las instancias cuyo sprite contenga la posicin (x,y). position_change(x,y,obj,perf) Cambia todas las instancias en (x,y) en obj. perf indica si se deben ejecutar los eventos de destruccin y creacin.

30.3

Timing

Los buenos juegos requirieron de cuidado especial de los tiempos en que las cosas se llevaban a cabo (timing). Afortunadamente el Game Maker se ocupa de la mayor parte del timing por ti. Se asegura de que las cosas ocurran con un ritmo constante. Este ritmo es definido al definir los cuartos. Pero puedes cambiarlo usando la variable global
room_speed. As por ejemplo, puedes incrementar lentamente la velocidad del juego, hacindolo ms difcil, agregando una muy pequea cantidad (como 0.001) a room_speed en cada step. Si tu mquina es lenta la velocidad del juego pudiera no alcanzarse. Esto puede checarse usando la varible fps que monitorea constantemente el nmero actual de cuadros por segundo. Finalmente, para un timing avanzado puedes usar la variable current_time que te da el nmero de milisegundos desde que la computadora fue iniciada. Aqu est la coleccin completa de variables disponibles (slo la primera puede ser cambiada): room_speed Velocidad del juego en el cuarto actual (en steps por segundo). fps* Nmero de cuadros que son dibujados por segundo. current_time* Nmero de milisegundos que han pasado desde que el sistema

fue iniciado.

current_year* El ao actual. current_month* El mes actual. current_day* El da actual. current_weekday* El da actual de la semana (1=domingo, , 7=sbado). current_hour* La hora actual. current_minute* El minuto actual. current_second* El segundo actual.

Algunas veces querrs detener el juego por un corto periodo. Para esto, usa la funcin sleep.
sleep(numb) Pausa el juego por numb milisegundos.

Como debes saber, cada instancia tiene 8 diferentes alarmas que puedes configurar. Para cambiar los valores (u obtener los valores) de las diferentes alarmas usa la siguiente variable: Valor de la alarma indicada. (Nota: las alarmas solo se actualizan cuando el evento de alarma para el objeto contiene acciones!)
alarm[0..7]

Hemos visto que para los problemas de un timing complejo puedes usar el recurso de las lneas de tiempo (time lines). Cada instancia puede tener un recurso time line asociado con ella. Las siguientes variables estn relacionadas con esto:
timeline_index ndice de la time line asociada con la instancia. Puedes

establecerlo a una time line en particular para usarla. Ponlo en 1 para pdejar de usar la time line para la instancia. timeline_position Posicin actual dentro de la time line. Puedes cambiarla para saltar o repetir ciertas partes. timeline_speed Normalmente, en cada step la posicin en la time line se incrementa en 1. Puedes cambiar esta cantidad configurando esta variable a un valor diferente. Puedes usar nmeros reales, p. ej. 0.5. si el valor es mayor que uno, varios momentos pueden ocurrir dentro del mismo tiempo del step. Se realizarn en el orden correcto, por lo que no se saltar ninguna accin.

30.4

Cuartos y score

Los juegos funcionan en cuartos. Cada cuarto tiene un ndice que se indica por el nombre del cuarto. El cuarto actual es almacenado en la variable room. No puedes asumir que los
cuartos estn numerados en un orden consecutivo. Por lo que nunca sumes o restes un nmero de la variable room. En lugar de ello usa las funciones y variables indicadas abajo. Por lo que una tpica pieza de cdigo que usars sera:
{ if (room != room_last) { room_goto_next(); } else { game_end(); } }

Las siguientes variables y funciones se relacionan con los cuartos (rooms).


room ndice del cuarto actual; puede cambiarse para ir a un cuarto diferente, pero

major usa las rutinas listadas abajo. room_first* ndice del primer cuarto en el juego. room_last* ndice del ultimo cuarto en el juego. room_goto(numb) Ir al cuarto con indice numb.

room_goto_previous()Ir al cuarto anterior. room_goto_next()Ir al siguiente cuarto. room_restart() Reiniciar el cuarto actual. room_previous(numb)Devuelve el ndice del cuarto anterior aa numb (-1 =

ninguno) pero no va a l. room_next(numb) Devuelve el ndice del cuarto posterior a numb (-1 = ninguno). game_end() Finaliza el juego. game_restart() Reinicia el juego. Los cuartos tienen varias propiedades adicionales:
room_width* Ancho del cuarto en pixeles. room_height* Alto del cuarto en pixeles. room_caption Ttulo de la ventana del cuarto. room_persistent Indica si el cuarto es persistente.

Muchos juegos ofrecen al jugador la posibilidad de guardar el juego y cargar un juego guardado. En el Game Maker esto ocurre automticamente cuando el jugador presiona <F5> para guardar y <F6> para cargar. Tambin puedes guardar y cargar juegos desde una pieza de cdigo (nota que la carga slo se lleva a cabo al final del step actual).
game_save(string) Guarda el juego al archivo con nombre string. game_load(string) Carga el juego del archivo con nombre string.

Otro aspecto importante de muchos juegos es el score, la energa, y el nmero de vidas. El Game Maker mantiene el score en la variable global score y el nmero de vidas en la variable global lives. Puedes cambiar el score simplemente cambiado el valor de esta variable. Lo mismo aplica para la energa y las vidas. Si la variable lives es mayor que 0 y se vuelve menor o igual a 0 se ejecuta el evento no-more-lives para todas las instancias. Si no quieres mostrar el score y las vidas en el ttulo, pon la variable show_score, etc., a falso. Tambin puedes cambiar el ttulo. Para juegos ms complicados major muestra el score t mismo.
score El marcador actual. lives El nmero de vidas. health La energa actual (0-100). show_score Indica si se muestra el marcador en el ttulo de la ventana. show_lives Indica si se muestra el nmero de vidas en el ttulo de la ventana. show_health Indica si se muestra la energa en el ttulo de la ventana. caption_score El ttulo empleado para el marcador. caption_lives El ttulo empleado para el nmero de vidas. caption_health El ttulo para la energa.

Tambin hay un mecanismo interno para manejar una lista de los mejores marcadores. Puede contener hasta diez nombres. Para ms informacin, ve el Captulo 34.

30.5

Generando eventos

Como sabes, el Game Maker es completamente manejado por eventos. Todas las acciones ocurren como resultado de eventos. Hay una gran cantidad de eventos diferentes. Los eventos de creacin y destruccin ocurren cuando una instancia es creada o destruda. En cada step, el sistema maneja primero los eventos de alarma. Despus los eventos de teclado y ratn, y luego el siguiente evento step. Despus de esto las instancias son colocadas en su nueva posicin despus de lo cual se maneja el evento de colisin. Finalmente el evento draw se usa para dibujar las instancias (nota que cuando empleas mltiples vistas el evento draw es llamado varias veces en cada step). Tambin puedes aplicar un evento a la instancia actual desde una pieza de cdigo. Se tienen las siguientes funciones:
event_perform(type,numb)Realiza el evento numb del tipo type para la

instancia actual. Se pueden emplear los siguientes tipos de eventos:


ev_create ev_destroy ev_step ev_alarm ev_keyboard ev_mouse ev_collision ev_other ev_draw ev_keypress ev_keyrelease

Cuando hay varios eventos del tipo dado, numb puede usarse para especificar el evento preciso. Para el evento de alarma numb puede tener un valor de 0 a 7. Para el evento de teclado puedes usar el cdigo de tecla para la tecla. Para los eventos de ratn puedes usar las siguientes constantes:
ev_left_button ev_right_button ev_middle_button ev_no_button ev_left_press ev_right_press ev_middle_press ev_left_release ev_right_release ev_middle_release ev_mouse_enter ev_mouse_leave ev_joystick1_left ev_joystick1_right ev_joystick1_up ev_joystick1_down ev_joystick1_button1

ev_joystick1_button2 ev_joystick1_button3 ev_joystick1_button4 ev_joystick1_button5 ev_joystick1_button6 ev_joystick1_button7 ev_joystick1_button8 ev_joystick2_left ev_joystick2_right ev_joystick2_up ev_joystick2_down ev_joystick2_button1 ev_joystick2_button2 ev_joystick2_button3 ev_joystick2_button4 ev_joystick2_button5 ev_joystick2_button6 ev_joystick2_button7 ev_joystick2_button8

Para el evento de collision proporcionas el ndice del otro objeto. Finalmente, para el evento other puedes usar las siguientes constantes:
ev_outside ev_boundary ev_game_start ev_game_end ev_room_start ev_room_end ev_no_more_lives ev_no_more_health ev_animation_end ev_end_of_path ev_user0 ev_user1 ev_user2 ev_user3 ev_user4 ev_user5 ev_user6 ev_user7

Para el evento step puedes dar el ndice usando las siguientes constantes:

ev_step_normal ev_step_begin ev_step_end event_perform_object(obj,type,numb) Esta funcin trabaja igual que la

anterior pero esta vez puedes especificar eventos en otro objeto. Nota que las acciones en estos eventos se aplican a la instancia actual, no a las instancias del objeto dado. event_user(numb)En los eventos other tambin puedes definir 8 eventos definidos por el usuario. Estos son ejecutados solo si llamas esta funcin. numb debe tener valores de 0 a 7.

event_inherited()Ejecuta el evento heredado. Esto solo funciona si la

instancia tiene un objeto padre.

Puedes obtener informacin sobre el evento actualmente ejecutado usando las siguientes variables de solo lectura: event_type* El tipo del evento que se est ejecutando. event_number* El nmero del evento que se est ejecutando. event_object* El ndice del objeto para el cual se est ejecutando el evento actual. event_action* El ndice de la accin que est siendo ejecutada (0 es la primera en el evento, etc.)

30.6

Variables miscelneas y funciones

Aqu estn algunas variables y funciones que se refieren a los errores.


error_occurred Indica si ha ocurrido un error error_last Cadena que indica el ultimo mensaje de error show_debug_message(str) Muestra la cadena str en modo debug

Captulo 31 GML: Interaccin con el usuario


No hay juego sin interaccin con el usuario. La manera estndar de interactuar con el usuario en el Game Maker es colocando acciones en los eventos del ratn o del teclado. Pero en ocasiones se necesita ms control. Desde una pieza de cdigo puedes checar la posicin del ratn o si alguno de sus botones es presionado. Normalmente esto se checa en el evento step de algn objeto controlador y llevas a cabo las acciones adecuadas. Tenemos las siguientes variables y funciones:
mouse_x* coordenada-X del ratn. No puede cambiarse. mouse_y* coordenada-Y del ratn. No puede cambiarse. mouse_button Botn del ratn presionado actualmente. como valores puedes

emplear mb_none (ningn botn), mb_any (cualquier botn), mb_left (botn izquierdo), mb_middle (botn central) o mb_right (botn derecho). keyboard_lastkey Cdigo de la ltima tecla presionada. Lee ms abajo las constantes de los cdigos de las teclas. Puedes cambiarlo, p. ej. ponerlo a 0 si t lo manipulaste. keyboard_key Cdigo de tecla de la tecla presionada actualmente (ve a continuacin; 0 si no hay tecla presionada). keyboard_lastchar ltimo caracter introducido (como string). keyboard_string Cadena de caracteres que contiene los ltimos 80 caracteres introducidos. Esta cadena solo contendr los caracteres imprimibles en pantalla. Tambin responde a la tecla de retroceso borrando el ultimo caracter. En ocasiones es til mapear una tecla a otra. Por ejemplo pudieras permitir al jugador emplear tanto las teclas del cursor como las del teclado numrico. En lugar de duplicar las acciones puedes mapear el teclado numrico a las teclas del cursor. Tambin pudieras implementar un mecanismo en el que el jugador pueda seleccionar las teclas a usar. Para este fin, contamos con las siguientes funciones
keyboard_set_map(key1,key2) Mapea la tecla con el cdigo de tecla key1 a

la tecla key2.

keyboard_get_map(key) Devuelve el mapeado actual de la tecla key. keyboard_unset_map() Reestablece todas las teclas a su mapa original.

Para checar si una tecla o botn del ratn en particular han sido presionados puedes emplear las siguientes funciones. Esto es til particularmente cuando se presionan varias teclas simultneamente.
keyboard_check(key) Indica si la tecla con el cdigo key ha sido presionada. keyboard_check_direct(key) Indica si la tecla con el cdigo key es

presionada checando el hardware directamente. El resultado es independiente de la aplicacin enfocada. Esta funcin permite algunos chequeos ms. En este caso puedes emplear los cdigos vk_lshift, vk_lcontrol, vk_lalt, vk_rshift, vk_rcontrol y vk_ralt para checar si se presiona la tecla shift, control o alt, ya sea izquierda o derecha. (No funciona en Windows 95!).

mouse_check_button(numb) Indica si se presiona el botn del ratn numb

(como valores de numb emplea mb_none, mb_left, mb_middle, o mb_right). Las siguientes rutinas pueden emplease para manipular el estado del teclado:
keyboard_get_numlock() Indica si BloqNum est activada. keyboard_set_numlock(on) Activa (on=true) o desactiva

BloqNum. (No funciona en Windows 95). keyboard_key_press(key) Simula el presionar de la tecla con el cdigo key. keyboard_key_release(key) Simula la liberacin de la tecla con el cdigo key. Tenemos las siguientes constants para los cdigos de las teclas:
vk_nokey cdigo que representa que ninguna tecla est presionada vk_anykey cdigo que representa que alguna tecla ha sido presionada vk_left cdigo para la tecla de la flecha izquierda vk_right cdigo para la tecla de la flecha derecha vk_up cdigo para la tecla de la fecha hacia arriba vk_down cdigo para la tecla de la flecha hacia abajo vk_enter tecla enter (o intro) vk_escape tecla escape vk_space tecla espacio vk_shift tecla shift vk_control tecla control vk_alt tecla alt vk_backspace tecla de retroceso vk_tab tecla tab vk_home tecla inicio vk_end tecla fin vk_delete tecla supr vk_insert tecla insert vk_pageup tecla AvPag vk_pagedown tecla RePag vk_pause tecla Pausa/Inter vk_printscreen tecla ImpPnt/PetSis vk_f1 vk_f12 cdigos para las teclas de funcin desde F1 a F12 vk_numpad0 vk_numpad9 teclas numricas en el teclado numrico vk_multiply tecla de multiplicacin en el teclado numrico vk_divide tecla dedivisin en el teclado numrico vk_add tecla de suma en el teclado numrico vk_subtract tecla de resta en el teclado numrico vk_decimal tecla del punto decimal en el teclado numrido

(on=false)

Para las teclas de las letras usa por ejemplo ord('A'). (Las letras maysculas). Las siguientes constants solo pueden ser empleadas en keyboard_check_direct:
vk_lshift tecla shift izquierda vk_lcontrol tecla control izquierda vk_lalt tecla alt izquierda vk_rshift tecla shift derecha vk_rcontrol tecla control derecha vk_ralt tecla alt derecha

No funcionan en versions anteriores de Windows! Por ejemplo, asumiendo que tienes un objeto que el usuario puede controlar con las teclas del cursor puedes colocar el siguiente cdigo en el evento step del objeto:
{ if if if if } (keyboard_check(vk_left)) (keyboard_check(vk_right)) (keyboard_check(vk_up)) (keyboard_check(vk_down)) x x y y -= += -= += 4; 4; 4; 4;

Por supuesto que esto es mucho ms fcil si simplemente lo ponemos en los eventos del teclado correspondientes. Hay tres funciones adicionales relacionadas con la interaccin con el usuario.
keyboard_clear(key) Limpia el estad o de la tecla key. Esto significa que no

generar eventos de teclado hasta que se vuelva a presionar. mouse_clear(button) Limpia el estado del botn del ratn button. Esto significa qeu no generar eventos del ratn hasta que el jugador lo suelte y lo vuelva a presionar. io_clear() Limpia todos los estados del teclado y del ratn. io_handle() Maneja la entrada y salida por parte del usuario, actualizando los estados del teclado y del ratn. keyboard_wait() Espera hasta que el usuario presione una tecla del teclado.

31.1

Soporte para joystick

Tenemos algunos eventos asociados con los joysticks (mandos de control, controles, palancas de mando, palancas de juego, etc.) Pero para tener control total sobre los joysticks hay un grupo de funciones para tratarlos. El Game Maker soporta hasta dos joystick. Por lo que todas estas funciones reciben el id del joystick como argumento.
joystick_exists(id) Indica si el joystick id (1 o 2) existe. joystick_name(id) Devuelve el nombre del joystick. joystick_axes(id) Devuelve el nmero de ejes del joystick. joystick_buttons(id) Devuelve el nmero de botones del joystick.

joystick_has_pov(id) Indica si el joystick tiene capacidades point-of-view. joystick_direction(id) Devuelve el cdigo (vk_numpad1 a vk_numpad9) correspondiente a la direccin del joystick id (1 o 2). joystick_check_button(id,numb) Indica si el botn del joystick id es

presionado (numb est en el intervalo 1-32). joystick_xpos(id) Devuelve la posicin (-1 a 1) del eje-x del joystick id. joystick_ypos(id) Devuelve la posicin y del joystick id.

joystick_zpos(id) Devuelve la posicin z del joystick id (si es que cuenta con eje z). joystick_rpos(id) Devuelve la posicin del timn del joystick id (del cuarto eje). joystick_upos(id) Devuelve la posicin u del joystick id (del quinto eje). joystick_vpos(id) Devuelve la posicin v del joystick id (del sexto eje). joystick_pov(id) Devuelve la posicin del point-of-view del joystick id. Este es un ngulo entre 0 y 360 grados. 0 es adelante, 90 a la derecha, 180 atrs y 270 a la izquierda. Cuando no se especifica la direccin del point-of-view se devuelve 1..

Captulo 32 GML: Grficos del juego


Una parte importante de un juego son los grficos. Game Maker normalmente se encarga de esto y en juegos simples no hay de que preocuparse. Pero algunas veces quieres ms control. Para algunos aspectos hay acciones pero con cdigo puedes controlar ms aspectos. Este captulo describe todas las variables para esto y da ms informacin acerca de lo que realmente est sucediendo.

32.1

Ventana y cursor

Originalmente, el juego corre dentro de una ventana centrada. EL jugador puede cambiar esto presionando la tecla F4 a menos que esta opcin no est disponible. Tambin puedes hacer esto desde el programa usando la siguiente variable:
full_screen Esta variable es verdadera cuando se est en el modo de pantalla

completa. Puedes cambiar el modo poniendo esta variable en verdadero o falso.

Nota que en el modo de pantalla completa el ttulo y la puntuacin se muestran en la pantalla. (Esto se puede evitar en las opciones del juego.) En el modo de pantalla completa la imagen est centrada o escalada. Puedes controlar esto usando la siguiente variable:
scale_window Esta variable indica le porcentaje de escala en el modo de

ventana. 100 indica sin escala. scale_full Esta variable indica el porcentaje de escala en el modo de pantalla completa. 100 indica sin escala. 0 indica la mxima escala posible. El modo escalado puede ser lento en mquinas con un procesador o tarjeta de grficos lentos. Los juegos corren por defecto con el cursor visible. Para la mayora de los juegos no quieres esto. Para quitar el cursor usa la variable:
show_cursor Cuando tiene el valor de falso, el cursor se hace invisible en el

rea de juego, de lo contrario es visible.

Tambin puedes asignar el cursor como uno de los predefinidos en Windows usando la siguiente funcin:
set_cursor(cur) Da al cursor el valor asignado. Puedes usar las siguientes

constantes: cr_default, cr_none, cr_arrrow, cr_cross, cr_beam, cr_size_nesw, cr_size_ns, cr_size_nwse, cr_size_we, cr_uparrow, cr_hourglass, cr_drag, cr_nodrop, cr_hsplit, cr_vsplit, cr_multidrag, cr_sqlwait, cr_no, cr_appstart, cr_help, cr_handpoint, cr_size_all. Por cierto, es muy fcil hacer tu propio objeto cursor. Solo crea un objeto con profundidad negativa que, en el evento sep, sigue la posicin del mouse. Para saber la resolucin del monitor, puedes usar las siguientes variables de slo lectura:

monitor_width El ancho del monitor, en pxeles. monitor_height La altura del monitor, en pxeles.

32.2

Sprites e imgenes

Cada objeto tiene un sprite asociado a l. sta puede ser una imagen simple o consistir de imgenes mltiples. Por cada instancia del objeto, el programa dibuja la imagen correspondiente en la pantalla con su origen (definido en las propiedades del sprite) en la posicin (x,y) de la instancia. Cuando hay imgenes mltiples, cicla a travs de las imgenes para tener un efecto de animacin. Hay un nmero de variables que afectan la manera en la que se dibuja la imagen. Estas pueden ser usadas para cambiar el efecto. Cada instancia tiene las siguientes variables: Las instancias invisibles estn an activas y generan eventos de colisin; slo t no las ves. Poner la visibilidad en falso es til, por ejemplo, objetos controladores (hazlos no slidos para evitar eventos de colisin) o interruptores escondidos. sprite_index Este es el ndice del sprite actual de la instancia. Puedes cambiarlo para darle a la instancia un sprite diferente. Como valor puedes usar los nombres que le hayas asignado a los diferentes sprites creados. Cambiar el sprite no cambia el ndice de la sub-imagen visible actual. sprite_width* Indica el ancho del sprite. Este valor no puede ser cambiado pero puede que quieras usarlo. sprite_height* Indica la altura del sprite. Este valor no puede ser cambiado pero puede que quieras usarlo. sprite_xoffset* Indica el origen horizontal del sprite como fue definido en las propiedades del sprite. Este valor no puede ser cambiado pero puede que quieras usarlo. sprite_yoffset* Indica el origen vertical del sprite como fue definido en las propiedades del sprite. Este valor no puede ser cambiado pero puede que quieras usarlo. image_number* El nmero de sub-imgenes del sprite actual. (No puede ser cambiado) image_index Cuando la imagen tiene mltiples sub-imgenes el programa cicla a travs de ellos. Esta variable indica la sub-imagen actualmente dibujada (se numeran a partir del 0). Puedes cambiar la imagen actual cambiando esta variable. El programa va a continuar ciclando a partir de este nuevo ndice. image_single Algunas veces quieres que una sub-imagen particular sea visible y no quieres que el programa cambie a travs del resto. Esto se puede lograr asignando a esta variable el ndice el la sub-imagen que quieres que quieres ver (la primera sub-imagen tiene el ndice 0). Dale el valor de 1 para ciclar a travs de las sub-imgenes. Esto es til cuando un objeto tiene mltiples apariencias. Por ejemplo, supn que tienes un objeto que puede rotar y creas un sprite que tiene sub-imgenes para varias orientaciones (contra-reloj) Entonces, en el evento step del objeto puedes poner:
{

visible Si es verdadera (1) la imagen es dibujada, de lo contrario no se dibuja.

image_single = direction * image_number/360; }

image_speed La velocidad con la que se cicla a travs de las sub-imgenes. Un

valor de 1 indica que en cada paso (step) se obtiene la siguiente imagen. Valores ms pequeos cambian la sub-imagen ms lento, mostrando cada imagen mltiples ocasiones. Valores ms grandes saltarn imgenes para hacer el movimiento ms rpido. depth Normalmente las imgenes son dibujadas en el orden en el que se crearon las instancias. Puedes cambiar esta indicando la profundidad (depth) de la imagen. El valor original es 0 a menos que especifiques un valor diferente en las propiedades del objeto. Mientras ms alto sea el valor, la imagen est ms lejos. (Tambin puedes usar valores negativos). Las instancias con una profundidad mayor quedarn dibujadas detrs de las instancias de profundidad menor. Indicar la profundidad garantiza que las imgenes se dibujaran en el orden que quieras. (Por ejemplo, el avin enfrente de la nube). Las instancias que se usen como fondo deben de tener una profundidad positiva muy alta, y las de primer plano (foreground) una profundiad negativa muy baja. image_scale Un factor de escala que hace grande o pequea a las imgenes. Un valor de 1 indica el tamao normal. Cambiarla escala tambin cambia los valores del ancho y alto de la imagen e influencia las colisiones como puedes esperar. Nota que las imgenes escaladas (en particular cuando las haces ms pequeas) toman ms tiempo de dibujar. Cambiar la escala puede ser usado para obtener un efecto de 3-D. image_alpha El valor de la transparencia (alpha) para usar en la imagen. Un valor de 1 es la condicin normal. Un valor de 0 es completamente transparente. salo con cuidado. Dibujar imgenes parcialmente transparentes toma mucho tiempo y puede reducir la velocidad del juego. bbox_left* Lado izquierdo de la caja perimetral usado para la imagen de la instancia. (Tomando en cuenta la escala) bbox_right* Lado derecho de la caja perimetral de la imagen de la instancia. bbox_top* Lado superior de la caja perimetral de la imagen de la instancia. bbox_bottom* Lado inferior de la caja perimetral de la imagen de la instancia.

32.3

Fondos

Cada cuarto puede tener hasta 8 fondos. Tambin tiene un color de fondo. Todos los aspectos de estos fondos pueden ser cambiados usando las siguientes variables. (Algunas variables son arreglos que van del 0 al 7 indicando los diferentes fondos):
background_color El color de fondo del cuarto background_showcolor Whether to clear the window in the background color. background_visible[0..7] Indica sI la imagen de fondo es visible. background_foreground[0..7] Indica si el fondo es una imagen de primer

plano.

background_index[0..7] ndice de la imagen del fondo.

background_x[0..7] Posicin X de la imagen de fondo. background_y[07] Posicin Y de la imagen de fondo. background_width[07]* Ancho de la imagen de fondo. background_height[07]* Altura de la imagen de fondo. background_htiled[0..7] Indica si el fondo es de mosaico horizontalmente. background_vtiled[0..7] Indica si el fondo es de mosaico vertical. background_hspeed[0..7] Velocidad de desplazamiento horizontal del

fondo (pixeles por paso). (pixeles por paso).

background_vspeed[0..7] Velocidad de desplazamiento vertical del fondo background_alpha[0..7] Valor de transparencia (alpha) al dibujarse el

fondo. Un valor de 1 es el valor normal; un valor de 0 es completamente transparente. salo con cuidado. Dibujar un fondo parcialmente transparente toma mucho tiempo y puede hacer lento el juego.

32.4

Tiles

Como sabes, puedes agregar Tiles a los romos (cuartos). Un tile es una parte de un recurso de fondo 8background). Los tiles simplemente son imgenes visibles. No reaccionan a los eventos y no generan colisiones. Como resultado de esto, los tiles se manejan mucho ms rpido que los objetos. Cualquier cosa que no requiera de una colisin es mejor que se maneje con Tiles. Adems, es frecuente usar los tiles para un grfico agradable mientras que el objeto es usado, por ejemplo, pars generar los eventos de colisin. Actualmente, t tienes ms control sobre los tiles de lo que piensas. Puedes agregarlas cuando diseas el room pero tambin puedes agregarlas mientras corres el juego. Puedes cambiar su posicin e incluso escalarlas o hacerlas parcialmente transparentes. Un tile tiene las siguientes propiedades: background. El fondo del cual es tomado el tile. left, top, width, height. La parte del fondo que es usada. x,y. La posicin de la esquina superior izquierda del tile en el room. depth. La profundidad del tile. Cuando diseas un room slo puedes indicar si usas tiles de fondo (con profundidad 1000000) o de primer plano (de profundidad 1000000) pero puedes seleccioner cualquier profundidad que quieras haciendo que los tiles aparezcan entre las instancias de los objetos. visible. Indica si el tile es visible. xscale, yscale. La escala con la que se dibuja el sprite. (El valor original es 1) alpha. El valor alpha indicando la transparencia del tile. 1 = no transparente. = = completamente transparente. Debes de tener cuidado porque dibujar tiles parcialmente transparentes es muy lento y puede ocasionar problemas en ciertos sistemas. Para cambiar las propiedades de un tile en particular necesitas saber su Id. Cuando agregas tiles al crear un cuarto la id es mostrada in la barra de informacin en la parte

inferior. Tambin hay una funcin para encontrar la id de un tile en una posicin especfica. Las siguientes funciones existen para manejar los tiles: Agrega un nuevo tile en el room con los valores indicados (Ve arriba para ver su significado). Esta funcin regresa la id del tile que puede ser usada despus. tile_delete(id) Elimina el tile con la id indicada. tile_find(x,y,foreground) Regresa la id del tile en la posicin (x,y). Cuanod no existe un tile en esa posicin el valor 1 es regresado. Cuando el parmetro foreground es verdadero (true) slo las tiles con profundidad menor a cero son regresados. De otra manera slo los tiles con prufundidad mayor o igual es regresado. Cuando multiples tiles de fondo o primer plano existen en la posicin dada, la primera es regresada. tile_delete_at(x,y,foreground) Elimina el tile en la posicin (x,y). Cuando el parmetro foreground es verdadero (true), solo los tiles con profundidad menor a 0 son eliminadas. De lo contrario, slo los tiles con profundidad igual o mayor a 0 son eliminadas. Cuando mltiples tiles (de fondo o de primer plano) existen en la posicin dada, todas son eliminadas. tile_exists(id) Indica si el tile con el id indicado existe.
tile_add(background,left,top,width,height,x,y,depth) tile_get_x(id) Regresa la posicin x del tile con el id indicado. tile_get_y(id) Regresa la posicin y del tile con el id indicado. tile_get_left(id) Regresa el valor left del tile con el id indicado. tile_get_top(id) Regresa el valor top del tile con el id indicado. tile_get_width(id) Regresa el ancho del tile con el id indicado. tile_get_height(id) Regresa la altura del tile con el id indicado. tile_get_depth(id) Regresa la profundidad del tile con el id indicado. tile_get_visible(id) Regresa el tile con el id indicado es visible o no. tile_get_xscale(id) Regresa la escala x del tile con el id indicado. tile_get_yscale(id) Regresa la escala y del tile con el id indicado. tile_get_background(id) Regresa el fondo del tile con el id indicado. tile_get_alpha(id) Regresa el valor alpha del tile con el id indicado. tile_set_position(id,x,y) Asigna la posicin del tile con el id indicado. tile_set_region(id,left,right,width,height) Asigna la regin del

tile con el id indicado dentro de su fondo. id indicado. o no.

tile_set_background(id,background) Asigna el fondo para el tile con el tile_set_visible(id,visible) Asigna si el tile con el id idicado es visible tile_set_depth(id,depth) Asigna la profundidad del tile con el id indicado. tile_set_scale(id,xscale,yscale) Asigna la escala del tile con el id

indicado.

tile_set_alpha(id,alpha) Asigna el valor alfa del tile con el id indicado.

32.5

Funciones de dibujo

Es posible permitir que los objetos se vean diferentes con respecto a sus imgenes. Hay una coleccin completa de funciones disponibles para dibujar diferentes formas. Tambin hay funciones para dibujar texto. Slo puedes usar estas funciones en el evento drawing de un objeto. Estas funciones no sirven en ningn otro evento. Ten en cuenta que el hardware de grficos de la computadora slo dibuja las imgenes rpido. As que cualquier otra rutina de dibujo va a ser relativamente lenta. Tambin Game Maker est optimizado para dibujar imgenes. As que evita usar estas rutinas de dibujo tanto como te sea posible. (Cuando sea posible, crea mejor un bitmap) Tambin ten en cuenta que la colisin entre instancias se determina por sus sprites (o mscaras de colisin) y no por lo que actualmente se dibuja. Las siguientes funciones de dibujo existen:
draw_sprite(n,img,x,y) Dibuja la sub-imagen img (-1 = actual) del sprite

con el ndice n con su origen en la posicin (x,y). draw_sprite_scaled(n,img,x,y,s) Dibuja el sprite escalado con el factor s. draw_sprite_stretched(n,img,x,y,w,h) Dibuja el esprite estirado de manera que llene la regin con la esquina superior izquierda (x,y) y de ancho w y alto h. draw_sprite_transparent(n,img,x,y,s,alpha) Dibuja el sprite escalado con factor s mezclado con su fondo. Alpha indica el valor de transparencia. Un valor de 0 hace el sprite completamente transparente. Un valor de 1 hace el sprite completamente slido. Esta funcin puede crear grandes efectos (por ejemplo, explosiones parcialmente transparentes). Es lento porque se hace con software y se dede de usar con cuidado. draw_sprite_tiled(n,img,x,y) Dibuja el sprite varias veces de manera que llene el cuarto entero. (x,y) es el lugar donde uno de los sprites es dibujado.
draw_background(n,x,y) Dibuja el fondo con ndice n en la posicin (x,y). draw_background_scaled(n,x,y,s) Dibuja el background escalado. draw_background_stretched(n,x,y,w,h) Dibuja el fondo ajustndolo a la

regin indicada.

draw_background_transparent(n,x,y,s,alpha) Dibuja el fondo con

escala s y transparencia alpha (0-1). (Lento!). draw_background_tiled(n,x,y) Dibuja el background varias veces hasta que llene el room completo. The following drawing functions draw basic shapes. They use a number of properties, in particular the brush and pen color that can be set using certain variables.
draw_pixel(x,y) Draws a pixel at (x,y) in the brush color. draw_getpixel(x,y) Returns the color of the pixel at (x,y).

draw_fill(x,y) Flood fill from position (x,y) in the brush color. draw_line(x1,y1,x2,y2) Draws a line from (x1,y1) to (x2,y2). draw_circle(x,y,r) Draws a circle at (x,y) with radius r. draw_ellipse(x1,y1,x2,y2) Draws an ellipse. draw_rectangle(x1,y1,x2,y2) Draws a rectangle. draw_roundrect(x1,y1,x2,y2) Draws a rounded rectangle. draw_triangle(x1,y1,x2,y2,x3,y3) Draws a triangle. draw_arc(x1,y1,x2,y2,x3,y3,x4,y4) Draws an arc of an ellipse. draw_chord(x1,y1,x2,y2,x3,y3,x4,y4) Draws a chord of an ellipse. draw_pie(x1,y1,x2,y2,x3,y3,x4,y4) Draws a pie of an ellipse. draw_button(x1,y1,x2,y2,up) Draws a button, up indicates whether

up (1) or down (0).

draw_text(x,y,string) Draws the string at position (x,y). A # symbol or

carriage return chr(13) or linefeed chr(10) are interpreted as newline characters. In this way you can draw multi-line texts. (Use \# to get the # symbol itself.) draw_text_ext(x,y,string,sep,w) Similar to the previous routine but you can specify two more things. First of all, sep indicates the separation distance between the lines of text in a multiline text. Use -1 to get the default distance. Use w to indicate the width of the text in pixels. Lines that are longer than this width are split-up at spaces or signs. Use -1 to not split up lines.
draw_text_sprite(x,y,string,sep,w,sprite,firstchar,scale)

Drawing text using the functions above is relatively costly. This function works exactly the same as the previous one but takes its character images from a sprite. This sprite must have a subimage for each character. The first character is indicate with the argument firstchar. From this character on the characters should follow the ASCI order. You can check the character map tool of windows to see the correct order of the characters. If you only need the first few (e.g. up to the numbers or the uppercase characters) you dont need to provide the other characters. scale indicates the scale factor used (1 is the normal size). Be careful will scaling though, it can slow down the game considerably. Please realize that these sprites tend to be large. Also, you obviously dont need precise collision checking for them. draw_polygon_begin() Start describing a polygon for drawing. draw_polygon_vertex(x,y) Add vertex (x,y) to the polygon. draw_polygon_end() End the description of the polygon. This function actually draws it. You can change a number of settings, like the color of the lines (pen), region (brush) and font, and many other font properties. The effect of these variables is global! So if you change it in the drawing routine for one object it also applies to other objects being drawn later. You can also use these variables in other event. For example, if they dont change, you can set them once at the start of the game (which is a lot more efficient).
brush_color Color used to fill shapes. A whole range of predefined colors is

available:

c_aqua

c_black c_blue c_dkgray c_fuchsia c_gray c_green c_lime c_ltgray c_maroon c_navy c_olive c_purple c_red c_silver c_teal c_white c_yellow

Other colors can be made using the routine make_color(red,green,blue), where red, green and blue must be values between 0 and 255. brush_style Current brush style used for filling. The following styles are available:
bs_hollow bs_solid bs_bdiagonal bs_fdiagonal bs_cross bs_diagcross bs_horizontal bs_vertical pen_color Color of the pen to draw boundaries. pen_size Size of the pen in pixels. font_color Color of the font to use. font_size Size of the font to use (in points). font_name Name of the font (a string). font_style Style for the font. The following styles are available (you can add

them if you want the combination of the styles):

fs_normal fs_bold fs_italic fs_underline fs_strikeout font_angle Angle with which the font is rotated (0-360 degrees). For example,

for vertical text use value 90. font_align Alignment of the text w.r.t. the position given. The following values can be used
fa_left fa_center fa_right

A few miscellaneous functions exist:


string_width(string) Width of the string in the current font as it would

drawn using the draw_text() function. Can be used for precisely positioning graphics. string_height(string) Height of the string in the current font as it would drawn using the draw_text() function. string_width_ext(string,sep,w) Width of the string in the current font as it would drawn using the draw_text_ext() function. Can be used for precisely positioning graphics. string_height_ext(string,sep,w) Height of the string in the current font as it would drawn using the draw_text_ext() function. screen_gamma(r,g,b) Sets the gamma correction values. r,g,b must be in the range from 1 to 1. The default is 0. When you use a value smaller than 0 that particular color becomes darker. If you use a value larger than 0 that color becomes lighter. Most of the time you will keep the three values the same. For example, to get the effect of lightning you can temporarily make the three values close to 1. This function works only in exclusive mode! screen_save(fname) Saves a bmp image of the screen in the given filename. Useful for making screenshots. screen_save_part(fname,left,top,right,bottom) Saves part of the screen in the given filename.

32.6

Views

As you should know you can define up to eight different views when designing rooms. In this way you can show different parts of the room at different places on the screen. Also, you can make sure that a particular object always stays visible. You can control the views from within code. You can make views visible and invisible and change the place or size of the views on the screen or the position of the view in the room (which is in particular useful when you indicated no object to be visible), you can change the size of the horizontal and vertical border around the visible object, and you can indicate which object must remain visible in the views. The latter is very important when the important object changes during the game. For example, you might change the main character object based on its current status. Unfortunately, this does mean that it is no longer the object that must remain visible. This can be remedied by one line of code in the creation event of all the possible main objects (assuming this must happen in the first view):
{ view_object[0] = object_index; }

The following variables exist that influence the view. All, except the first two are arrays ranging from 0 (the first view) to 7 (the last view).
view_enabled Whether views are enabled or not.

view_current* The currently drawn view (0-7). Use this only in the drawing

event. You can for example check this variable to draw certain things in only one view. Variable cannot be changed. view_visible[0..7] Whether the particular view is visible on the screen. view_left[0..7] Left position of the view in the room. view_top[0..7] Top position of the view in the room. view_width[0..7] Width of the view (in pixels). view_height[0..7] Height of the view (in pixels). view_x[0..7] X-position of the view on the screen. view_y[0..7] Y-position of the view on the screen. view_hborder[0..7] Size of horizontal border around the visible object (in pixels). view_vborder[0..7] Size of vertical border around visible object (in pixels). view_hspeed[0..7] Maximal horizontal speed of the view. view_vspeed[0..7] Maximal vertical speed of the view. view_object[0..7] Object whose instance must remain visible in the view. If there are multiple instances of this object only the first one is followed. You can also assign an instance id to this variable. In that case the particular instance is followed. Note that the size of the image on the screen is decided based on the visible views at the beginning of the room. If you change views during the game, they might no longer fit on the screen. The screen size though is not adapted automatically. So if you need this you have to do it yourself, using the following variables:
screen_width Width of the image on the screen, that is, the area in which we draw. When there are no views, this is the same as room_width. screen_height Height of the image on the screen.

32.7

Transitions

As you know, when you move from one room to another you can indicate a transition. You can also set the transition for the next frame without moving to another room using the variable called transition_kind. If you assign a value between 1 and 17 to it the corresponding transition is used (these are the same transitions you can indicate for the rooms). A value of 0 indicates no transition. It only affects the next time a frame is drawn. You can also set these variables before going to the next room using code.
transition_kind Indicates the next frame transition (0-17). transition_time Total time used for the transition (in milliseconds). transition_steps Number of steps for the transition.

32.8

Repainting the screen

Normally at the end of each step the room is repainted on the screen. But in rare circumstances you need to repaint the room at other moments. This happens when your program takes over the control. For example, before sleeping a long time a repaint might

be wanted. Also, when your code displays a message and wants to wait for the player to press a key, you need a repaint in between. There are two different routines to do this.
screen_redraw() Redraws the room by calling all draw events. screen_refresh() Refreshes the screen using the current room image

(not performing drawing events).

To understand the second function, you will need to understand a bit better how drawing works internally. There is internally an image on which all drawing happens. This image is not visible on the screen. Only at the end of a step, after all drawing has taken place, the screen image is replaced by this internal image. (This is called double buffering.) The first function redraws the internal image and then refreshes the screen image. The second function only refreshes the image on the screen. Now you should also realize why you couldn't use drawing actions or functions in other events than drawing events. They will draw things on the internal image but these won't be visible on the screen. And when the drawing events are performed, first the room background is drawn, erasing all you did draw on the internal image. But when you use screen_refresh() after your drawing, the updated image will become visible on the screen. So, for example, a script can draw some text on the screen, call the refresh function and then wait for the player to press a key, like in the following piece of code.
{ draw_text(screen_width/2,100,'Press any key to continue.'); screen_refresh(); keyboard_wait(); }

Please realize that, when you draw in another event than the drawing event, you draw simply on the image, not in a view! So the coordinates you use are the same as if there are no views. Be careful when using this technique. Make sure you understand it first and realize that refreshing the screen takes some time.

Captulo 33 GML: Sonido y msica


El sonido juega un papel crucial en los juegos de computadora. Hay dos diferentes tipos de sonidos: la msica de fondo y los efectos. La msica de fondo normalmente consiste de una pieza de msica midi larga que se repite infinitamente. Por otro lado, los efectos de sonido son archivos wave cortos. Para tener efectos inmediatos, estas piezas son colodadas en la memoria. Por lo que asegrate de que no sean demasiados largos. Los sonidos se agregan a tu juego en la forma de recursos de sonido. Asegrate de que los nombres que uses sean vlidos. Hay un aspecto de los sonidos que puede ser confuso al principio, el nmero de buffers. El sistema puede reproducir un archivo wave solo una vez al mismo tiempo. Esto quiere decir que cuando uses el efecto nuevamente antes de que el sonido anterior haya terminado, el anterior es detenido. Esto no es muy atractivo. Por lo que cuando tengas un efecto de sonido que se emplee varias veces simultneamente (como p. ej. un disparo de pistola) necesitas almacenarlo varias veces. Este nmero es el nmero de buffers. Entre ms buffers tenga un sonido, ms veces puede ser reproducido simultneamente, pero tambin consume memoria. As que usa esto con cuidado. El Game Maker usa automticamente el primer buffer disponible, por lo que una vez que hayas indicado el nmero no debes preocuparte ms por esto. Hay cinco funciones bsicas relacionadas con los sonidos, dos para reproducir un sonido, una para checar si un sonido se est reproduciendo, y dos para detener los sonidos. La mayora reciben el ndice del sonido como argumento. El nombre del sonido representa su ndice. Pero tambin puedes almacenar el ndice en una variable, y usar esta ltima.
sound_play(index) Reproduce una vez el sonido indicado. sound_loop(index)Reproduce el sonido indicado, repitindolo continuamente. sound_stop(index) Detiene el sonido indicado. Si hay varios sonidos con este

ndice reproducindose simultneamente, todos sern detenidos. sound_stop_all() Detiene todos los sonidos. sound_isplaying(index) Indica si se est reproduciendo el sonido index.

Es possible emplear ms efectos de sonido. Estos solo aplican a los archivos wave, no a los midi. Cuando desees usar efectos especiales de sonido, debes indicarlo en la ficha advanced de las propiedades del sonido seleccionando la opcin adecuada. Nota que los sonidos que habiliten efectos consumen ms recursos que los otros. As que slo usa esta opcin cuando emplees las funciones siguientes. Hay tres tipos de efectos de sonido. Primero que nada puedes cambiar el volumen. Un valor de 0 indica que no hay sonido. Un valor de 1 es el volumen del sonido original. (No puedes indicar un volumen mayor que el original). Segundo, puedes cambiar el balance, esto es, la direccin de la que viene sl sonido. Un valor de 0 es completamente a la izquierda. Un valor de 1 indica completamente a la derecha. 0.5 es el valor por defecto que indica justo en el medio. Puedes usar el balance para p. ej. Escuchar que un objeto se mueve de izquierda a derecha. Finalmente puedes cambiar la frecuencia del sonido. Esto puede usarse p. ej. Para cambiar la velocidad de un motor. Un valor de 0 es la frecuencia ms baja; un valor de 1 es la frecuencia ms alta.

sound_volume(index,value) Cambia el volumen del sonido index (0 = bajo,

1 = alto).

sound_pan(index,value) Cambia el balance del sonido index (0 = izquierda,

1 = derecha).

sound_frequency(index,value) Cambia la frecuencia del sonido index (0 =

baja, 1 = alta).

El sonido es un tema complicado. Los archivos midi son reproducidos usando el reproductor multimedia estndar. Slo puede reproducirse un archivo midi a la vez y no hay soporte para efectos de sonido. Para los archivos wave el Game Maker usa DirectSound. En este caso todos los archivos wave son almacenados en la memoria y pueden tener efectos. De hecho, el Game Maker intenta reproducir otros archivos de msica cuando los especificas, en particular archivos mp3. Para esto emplea el reproductor multimedia estndar. Pero ten cuidado. El que esto funcione depende del sistema y algunas veces de que otro software est instalado o ejecutndose. Por lo que se recomiendoa no usar archivos mp3 cuando quieras distribuir tus juegos. Tambin hay varias funciones relacionadas con la reproduccin de msica desde un CD:
cd_init() Debe ser llamada antes de usar las otras funciones. Debiera llamarse

tambin cuando se cambia el CD (o simplemente de vez en cuando). cd_present() Indica si hay un CD en la unidad CD por defecto. cd_number() Devuelve el nmero de pistas del CD. cd_playing() Indica si el CD est reproducindose. cd_paused() Indica si el CD est en pausa o detenido. cd_track() Devuelve el nmero de la pista actual (1=la primera). cd_length() Devuelve la duracin total del CD en milisegundos. cd_track_length(n) Devuelve la duracin de la pista n del CD en milisegundos. cd_position() Devuelve la posicin actual del CD en milisegundos. cd_track_position() Devuelve la posicin actual de la pista en reproduccin en milisegundos. cd_play(first,last) Le indica al CD reproducir las pistas desde first hasta last. Si deseas reproducir el CD completo usa 1 y 1000 como argumentos. cd_stop() Detiene la reproduccin. cd_pause() Pausa la reproduccin. cd_resume() Continua la reproduccin. cd_set_position(pos)Establece la posicin del CD en milisegundos. cd_set_track_position(pos)Establece la posicin de la pista actual en milisegundos. cd_open_door() Abre la bandeja del reproductor de CD. cd_close_door() Cierra la bandeja del reproductor de CD. Hay una funcin muy general para acceder a las funciones multimedia de Windows.

MCI_command(str) Esta funcin enva el commando str al sistema multimedia

de Windows usando la Interfaz de Control de Medios (MCI Media Control Interface). Devuelve la cadena return. Puedes usarla para controlar todo tipo de dispositivos multimedia. Lee la documentacin de Windows para ms informacin sobre cmo usar este commando. Por ejemplo MCI_command('play cdaudio from 1') reproduce un cd (despus de que lo hayas inicializado correctamente usando otros comandos). Esta funcin es solo para uso avanzado!

Captulo 34 GML: Splash screens, highscores, and other pop-ups


En muchos juegos aparecen algunas ventanas emergentes. Estas ventanas muestran un video, una imagen o algo de texto. Son usadas frecuentemente al inicio del juego (como intro), al principio del nivel o al final del juego (por ej. los crditos). En Game Maker estas ventanas con texto, imgenes o videos pueden ser mostradas en cualquier momento del juego. El juego es pausado temporalmente mientras esta ventana es mostrada. stas son las funciones a utilizar:
show_text(fname,full,backcol,delay) Muestra una ventana con texto.

fname es el nombre del archivo de texto. (.txt o .rtf). Debes poner este archivo dentro del mismo directorio en que est el juego. Adems al crear la versin ejecutable (stand-alone) de tu juego, no debes olvidarte de aadir este archivo junto con el juego. full indica si se mostrar en pantalla completa o no. backcol es el color de fondo, y delay es un retraso en segundos antes de regresar el juego. (El jugador puede dar un clic con el ratn sobre la pantalla para regresar al juego.) show_image(fname,full,delay) Muestra una imagen en una ventana emergente. fname es el nombre del archivo de imagen (solo archivos .bmp, .jpg, y wmf). Tienes que agregar este archivo en la carpeta donde est el juego. full indica si se va a mostrar en pantalla completa o no. delay es el retraso en segundos antes de regresar al juego. show_video(fname,full,loop) Muestra un video en una ventana. fname es el nombre del archivo de video (.avi, .mpg). Debes poner este archivo en la misma carpeta donde esta el juego. full indica si se va a mostrar a pantalla completa. loop si se debe repetir al finalizar su reproduccin. show_info() Muestra la pantalla de informacin del juego (game information). load_info(fname) Carga la informacin del juego desde un archivo indicado en fname. Este debe de ser un archivo rtf. Esto hace posible mostrar diferentes archivos de ayuda en diferentes momentos. Puedes usar el recurso data file para poner estos archivos dentro del juego. Tambin hay varias funciones para mostrar pequeas ventanas con mensajes, preguntas, un men con opciones o un dialogo en el cual el jugador puede introducir un nmero, una cadena de texto, un color o un nombre de algn archivo:
show_message(str) Muestra un cuadro de dilogo como un mensaje. show_message_ext(str,but1,but2,but3) Muestra un cuadro de dilogo

con el valor str como un mensaje, adems de 3 botones. But1, but2 y but3 contienen el texto de cada botn. Si no escribes nada significar que el botn no se mostrar. En el texto puedes utilizar el smbolo & para indicar que el siguiente caracter debe ser usado como un acceso directo para este botn. Esta funcin regresa un valor de el botn presionado (0 si el usuario presiona la tecla Esc). show_question(str) Mustra una pregunta; devuelve truecuando el usuario presiona yes o falso si no.

get_integer(str,def) Pide al jugador en un cuadro de dilogo por un

nmero. Str es el mensaje. Def es nmero por defecto que se mostrar message_background(back) Establece una imagen de fondo para el cuadro de dilogo para las funciones anteriores. back debe ser uno de los backgrounds definidos en el juego. message_button(spr) Establece el sprite usado por los botones del cuadro de dilogo. spr debe ser un sprite que contenga tres imgenes, la primera para el botn cuando no esta presionado y el ratn no est sobre el botn, la segunda para cuando el ratn est sobre el botn pero no esta presionado y la tercera es para cuando es botn est presionado. message_text_font(name,size,color,style) Establece la fuente usada en el cuadro de dilogo. message_button_font(name,size,color,style) Establece la fuente usada en los botones del cuadro de dilogo. message_input_font(name,size,color,style) Establece la fuente para el cuadro de texto (si el usuario necesita introducir algn valor) del cuadro de dilogo. message_mouse_color(col) Establece el color de la fuente del cuadro e texto (si el usuario necesita introducir algn valor) del cuadro de dilogo cuando el ratn est sobre este. message_input_color(col) Establece el color de fondo del cuadro e texto (si el usuario necesita introducir algn valor) del cuadro de dilogo. message_caption(show,str) Establece el ttulo del cuadro de dilogo. show indica si el borde debe ser mostrado (1) o no (0) y str indica el ttulo cuando el borde es mostrado. message_position(x,y) Establece la posicin del cuadro e dilogo. message_size(w,h) Fija el tamao del cuadro de dilogo. Si indicas 0 para el width el ancho de la imagen es utilizado. Si escoges 0 para el height el alto es calculado en base al nmero de lneas del mensaje. show_menu(str,def) Muestra un men emergente. str indica el texto del men. Esto consiste de los diferentes elementos del men con una barra vertical entre ellos. Por ejemplo, str =menu0|menu1|meny2. Cuando la primera opcin es seleccionado el valor de 0 es regresado, etc. Cuando el jugador no selecciona ningn elemento, el valor por defecto def es regresado. show_menu_pos(x,y,str,def) Muestra un men desplegable como en la funcin anterior pero en la posicin x,y de la pantalla. get_color(defcol) Pide al jugador por un color. defcol es el color por defecto. Si el usuario presiona Cancel el valor -1 es retornado. get_open_filename(filter,fname) Solicita al jugador por un nombre de archivo para abrir con un filtro dado. El filtro tiene la forma name1|mask1|name2|mask21. Una mscara contiene las diferentes opciones con un punto y coma entre ellos. * significa cualquier cadena de texto. Ej. bitmaps|*.bmp;*.wmf. Si el usuario presiona Cancel una cadena de texto vaca es retornada.

get_save_filename(filter,fname) Pide al usuario un nombre de archivo

para guardar con el filtro dado. Si el usuario presiona Cancel una cadena de texto vaca es retornada. get_directory(dname) Pregunta por un directorio. dname es el nombre por defecto. Si el usuario presiona Cancel una cadena de texto vaca es retornada. get_directory_alt(capt,root) Una manera diferente de pedir un directorio. caps es el ttulo a ser mostrado. root es la ruta del directorio a ser mostrado. Usa una cadena vaca y se mostrar el rbol completo. Si el usuario presiona Cancelar se regresa una cadena vaca. show_error(str,abort) Despliega un mensaje de error estndar (y/o lo escribe en un archivo log). abort indica si el juego debe ser abortado. Una ventana especial es la de highscore que es mantenida por cada juego. Estas son las funciones a utilizar:
highscore_show(numb) Muestra la table highscores. numb es el nuevo record. highscore_show_ext(numb,back,border,col1,col2,name,size)

Si el puntaje es suficientemente bueno para ser aadido a la lista, el jugador podr ingresar un nombre. Usa -1 para desplegar la lista actual. Muestra la tabla highscore. numb es el nuevo puntaje. Si el puntaje es suficientemente bueno para ser aadido a la lista, el jugador podr ingresar un nombre. Usa -1 para desplegar la lista actual. back es la imagen de fondo a usar, border es si debe o no mostrarse un borde. coll es el color para el nuevo registro, col2 es el color de los otros puntajes. name es el nombre de la fuente a usar, y size es el tamao de la fuente. highscore_clear() Borra todos los puntajes. highscore_add(str,numb) Aade un jugador de nombre str con el puntaje numb a la lista. highscore_add_current() Aade el puntaje actual a la lista de highscores. Se le preguntar al jugador por un nombre. highscore_value(place) Devuelve el puntaje de la persona en el lugar indicado (1-10). Esto puede ser usado para dibujar tu propia lista de puntajes ms altos. highscore_name(place) Devuelve el nombre de la persona en el lugar indicado (1-10). draw_highscore(x1,y1,x2,y2) Muestra la tabla de puntajes ms altos (highscores) en la ventana y con la fuente indicada. Por favor recuerda que ninguna de estas ventanas pueden ser mostradas cuando el juego corre en modo exclusivo de grficos!

Captulo 35 GML: Resources


En Game Maker puedes especificar varios tipos de recursos, como sprites, sounds, data files, objects, etc. En este captulo encontrars un nmero de opciones que actan sobre estos recursos. Antes de que empieces a usarlas, asegrate de entender lo siguiente. En cualquier momento en que modifiques un recurso el original se pierde! Esto significa que el recurso es modificado para todas las instancias que lo usen. Por ejemplo, si cambias un sprite todas las instancias que usen este sprite lo tendrn modificado hasta que juego termine. Reiniciar la habitacin o el juego no regresar este recurso a su forma original! Adems cuando guardes el juego los recursos modificados NO son salvados. Si t cargas un juego guardado es tu responsabilidad tener el recurso en el estado apropiado.

35.1

Sprites
sprite_exists(ind) Devuelve si el sprite con el ndice (ind) especificado

Las siguientes funciones te darn informacin acerca de un sprite: existe.

sprite_get_name(ind) Devuelve el nombre del sprite con el ind especificado. sprite_get_number(ind) Devuelve el nmero de subimgenes del sprite con

el indice dado. especificado.

sprite_get_width(ind)

Devuelve el ancho del sprite con el ndice

sprite_get_height(ind) Devuelve la altura del sprite con el ndice dado. sprite_get_transparent(ind) Devuelve si el sprite con el ndice

especificado utiliza transparecia.

sprite_get_xoffset(ind) Devuelve el x-offset (punto de origen en x) del

sprite con el ndice especificado. sprite con el ndice especificado.

sprite_get_yoffset(ind) Devuelve el y-offset (punto de origen en y) del sprite_get_bbox_left(ind) Devuelve el valor del lmite izquierdo del sprite

(bounding box) con el ndice especificado. sprite_get_bbox_right(ind) Devuelve el valor del lmite derecho del sprite (bounding box) con el ndice especificado. sprite_get_bbox_top(ind) Devuelve el valor del lmite superior del sprite (bounding box) con el ndice especificado. sprite_get_bbox_bottom(ind) Devuelve el valor del lmite inferior del sprite (bounding box) con el ndice especificado. sprite_get_precise(ind) Devuelve si el sprite con el ndice dado utiliza la coalicin precisa (precise collision checking). sprite_get_videomem(ind) Devuelve si el sprite con el ndice especificado utiliza la memoria de video. sprite_get_loadonuse(ind) Devuelve si el sprite con el ndice especificado es cargado slo en uso (load only on use).

Los sprites usan mucha memoria. Para dibujarlos ms rpido es importante almacenarlos en la memoria de video. Como est indicado en el captulo 14 puedes indicar cuales sprites deben ser almacenados en la memoria de video. Adems puedes indicar que ciertos sprites slo deben ser cargados cuando se necesiten. Esos sprites sern descartados una vez que termine el nivel. Puedes controlar parcialmente este proceso con cdigo. Estas son las funciones a usar:
sprite_discard(numb) Libera la memoria de video usada por el sprite. Si el

sprite usa la propiedad de cargar slo en uso este ser removido completamente. De lo contrario, una copia es mantenida en la memoria normal (de la cual hay normalmente suficiente) de este modo el sprite puede ser restaurado si se ocupa. sprite_restore(numb) Restaura al sprite en la memoria de video. Normalmente esto pasa automticamente cuando el sprite es necesitado. Pero esto puede causar un pequeo problema, en particular cuando se usa cargar slo en uso y el sprite es grande. Entonces tal vez quieras forzar esto por ejemplo en el inicio de la habitacin en la cual el sprite es necesitado. discard_all() Descarta todos los sprites, backgrounds y sounds que usan cargar slo en uso. Cuando un juego usa muchos sprites grandes diferentes, esto hace al archivo del juego grande y por lo tanto carga lento. Adems, si quieres mantenerlos en la memoria de video mientras los necesites, esto incrementa el tamao de la memoria requerida de manera considerable. Como alternativa, puedes distribuir las imgenes del sprite con el juego (como archivos .bmp, .jpg, o .gif; no se permiten otros formatos) y cargarlos durante el juego. Existen tres rutinas para ello:
sprite_add(fname,imgnumb,precise,transparent,videomem,loadon use,xorig,yorig) Aade la imagen almacenada en el archivo fname al

conjunto de recursos sprites. Slo deben tratarse de imgenes bmp, jpg y gifs. Cuando la imagen es un bmp o jpg esta puede ser un strip conteniendo cierto nmero de subimgenes para el sprite enseguida del otro. Usa imgnumb para indicar su nmero (1 para una imagen simple). Para gifs animados, este argumento no es usado; el nmero de imgenes del gif es usado. precise indica si la coalicin precisa debe ser usada. transparent indica si la imagen es particularmente transparente, videomem indica si el sprite debe ser almacenado en la memoria de video, y loadonuse indica si el sprite debe ser cargado slo en uso. xorig y yorig indica la posicin de origen en el sprite. La funcin devuelve el ndice del nuevo sprite para que puedas usarlo para dibujar o asignarlo a la variable sprite_index de una instancia. Cuando ocurre un error -1 es devuelto.
sprite_replace(ind,fname,imgnumb,precise,transparent,videome m,loadonuse,xorig,yorig) Lo mismo que el anterior pero en este caso el

sprite con indice ind es reemplazado. La funcin devuelve si esto fue logrado. sprite_delete(ind) Elimina el sprite de la memoria, liberando la memoria usada. (Este ya no puede ser recuperado.)

ADVERTENCIA: Cuando salvas el juego en el transcurso del juego, sprites aadidos o reemplazados NO son almacenados junto con el juego salvado. Por lo tanto si cargas el juego despus, no podrn estar ah ms. Adems hay algunas cuestiones de derecho de copia con la distribucin de archivos gifs con tu aplicacin (comercial). Entonces es mejor no usar stos.

35.2

Sounds
sound_exists(ind) Devuelve si un sonido con el ndice dado existe. sound_get_name(ind) Devuelve el nombre de el sonido con el ndice dado. sound_get_kind(ind) Devuelve el tipo de el sonido con el indice especificado

Las siguientes funciones te darn informacin acerca de los sonidos:

(0=wave, 1=midi, 2=mp3, 10=unknown) sound_get_buffers(ind) Devuelve el nmero de buffers de le sonido con un ndice especificado. sound_get_effect(ind) Devuelve si el sonido con el ndice dado acepta efectos especiales. sound_get_loadonuse(ind) Devuelve si el sonido con el ndice dado usa cargar slo en uso. Los sonidos usan muchos recursos y la mayora de los sistemas pueden almacenar y tocar un nmero limitado de sonidos. Si creas un juego largo te interesara tener un mayor control sobre que sonidos son cargados en memoria y en que tiempo. Puedes usar la opcin cargar slo en uso (load on use) para los sonido para estar seguro que los sonidos son cargados slo cuando se utilicen. Esto aunque puede tener un ligero problema al cargar el sonido. Adems, esto no ayuda mucho cuando tienes una habitacin grande. Para ms control puedes usar los siguientes funciones:
sound_discard(index) Libera la memoria usada por el sonido indicado. sound_restore(index) Restaura el sonido indicado en memoria. discard_all() Descarta todos los sprites, backgrounds y sonidos que usan

load-on-use (cargar en uso).

Cuando tu juego usa muchos sonidos complicados diferentes, por ejemplo, como msica de fondo, es mejor no almacenarlos todos en dentro del juego. Esto hace el tamao del archivo del juego muy grande. En cambio, es mejor proveerlos como archivos separados con el juego y cargarlos cuando sean necesitados. Esto puede reducir el tiempo de carga del juego. Las siguientes tres rutinas existen para ello:
sound_add(fname,buffers,effects,loadonuse) Aade un sonido a el

juego. fname es el nombre del archivo de sonido. buffers indica el nmero de buffers a ser usados, y effects y loadonuse indican si los efectos de sonido son permitidos y si el sonido debe ser almacenado en la memoria interna (true o false). La funcin devuelve el ndice del nuevo sonido, el cual puede ser usado para tocar un sonido. (-1 si un error ocurre, por ejemplo que el archivo no exista).

sound_replace(index,fname,buffers,effects,loadonuse) Lo mismo

que el anterior pero esta vez no es creado un nuevo sonido sino que el sonido con ndice (index) es reemplazado, liberando el sonido anterior. Devuelve si se logr. sound_delete(index) Borra el sonido indicado, liberando la memoria asociada con este. Este no puede ser restaurado. ADVERTENCIA: Cuando salvas el juego mientras juegas, sonidos aadidos o reemplazados NO son guardados junto con el archivo de guardado. As que si cargas el juego despus, esos sonidos no estarn ah.

35.3

Backgrounds
background_exists(ind) Devuelve si el background con el ndice dado

Las siguientes funciones te darn informacin acerca de un background: existe.

background_get_name(ind) Devuelve el nombre de el background con el

ndice indicado. ndice indicado.

background_get_width(ind) Devuelve el ancho de el background con el background_get_height(ind) Devuelve la altura de el background con el

ndice especificado.

background_get_transparent(ind) Devuelve si el backgrund con el ndice

indicado usa la memoria de video. dado es cargado slo en uso.

background_get_videomem(ind) Devuelve si el background con el ndice background_get_loadonuse(ind) Devuelve si el background con el ndice

especificado es cargado slo en uso.

Los backgrounds usan mucha memoria. Para dibujarlos ms rpido es muy til almacenarlos en la memoria de video. Como est indicado en el captulo 18 puedes indicar cuales backgrounds deben ser almacenados en la memoria de video. Adems puedes indicar que ciertos backgrounds slo deben ser cargados cuando se necesiten. Esos backgrounds sern descartados una vez que termine el nivel. Puedes controlar parcialmente este proceso con cdigo. Estas son las funciones a usar:
background_discard(numb) Libera la memoria de video usada por el

background. Si el backgroune usa la propiedad de cargar slo en uso este ser removido completamente. De lo contrario, una copia es mantenida en la memoria normal (de la cual hay normalmente suficiente) de este modo el sprite puede ser restaurado si se ocupa. background_restore(numb) Restaura al background en la memoria de video. Normalmente esto pasa automticamente cuando el background es necesitado. Pero esto puede causar un pequeo problema, en particular cuando se usa cargar slo en uso y la imagen es grande. Entonces tal vez quieras forzar esto por ejemplo en el inicio de la habitacin en la cual el sprite es necesitado.

discard_all()Descarta todos los sprites, backgrounds y sounds que usan

cargar slo en uso.

Cuando un juego usa muchos backgrounds grandes diferentes, esto hace al archivo del juego grande y por lo tanto carga lento. Adems, si quieres mantenerlos en la memoria de video mientras los necesites, esto incrementa el tamao de la memoria requerida de manera considerable. Como alternativa, puedes distribuir las imgenes de los backgrounds con el juego (como archivos .bmp, .jpg, o .gif; no se permiten otros formatos) y cargarlos durante el juego. Existen tres funciones para ello. Otro uso es cuanto quieres permitir al jugador escoger una imagen de fondo. Adems tal vez quieras guardar la imagen desde el juego y usarla despus como un background (por ejemplo un programa para dibujar). Finalmente, backgrounds complejos,, guardados como jpg usan mucho menos memoria. Aqu estn las funciones:
background_add(fname,transparent,videomem,loadonuse) Aade la

imagen almacenada en el archivo fname al conjunto de recursos backgrounds. Slo deben tratarse de imgenes bmp y jpg. transparent indica si la imagen es particularmente transparente, videomem indica si el background debe ser almacenado en la memoria de video, y loadonuse indica si el background debe ser cargado slo en uso. La funcin devuelve el ndice del nuevo background para que puedas usarlo para dibujar o asignarlo a la variable background_index[0] para hacerlo visible en el cuarto actual. Cuando ocurre un error -1 es devuelto.
background_replace(ind,fname,transparent,videomem,loadonuse)

Lo mismo que el anterior pero en este caso el background con ndice ind es reemplazado. La funcin devuelve si esto fue logrado. Cuando el background es actualmente visible en el cuarto tambin ser reemplazado. background_delete(ind) Elimina el background de la memoria, liberando la memoria usada. (Este ya no puede ser recuperado.) ADVERTENCIA: Cuando salvas el juego en el transcurso del juego, backgrounds aadidos o reemplazados NO son almacenados junto con el juego salvado. Por lo tanto si cargas el juego despus, no podrn estar ah ms. Adems hay algunas cuestiones de derecho de copia con la distribucin de archivos gifs con tu aplicacin (comercial). Entonces es mejor no usar stos.

35.4

Paths
path_exists(ind) Devuelve si el path con un indice dado existe. path_get_name(ind) Devuelve el nombre del path con un nombre dado. path_get_length(ind) Devuelve la longitud del path con el ndice indicado. path_get_kind(ind) Devuelve el tipo de conexiones del path con el ndice

Las siguientes opciones te darn informacin acerca de los paths:

especificado (0=recto, 1=curvo).

path_get_end(ind) Devuelve lo que pasa al finalizar del path con el ndice

sealado (0=detener, 1=brinca al inicio, 2=conecta al inicio, 3=regresa, 4=continua).

35.5

Scripts
script_exists(ind) Returns Devuelve si un script con el ndice indicado

Las siguientes opciones te darn informacin acerca de un script: existe. dado.

script_get_name(ind) Devuelve el nombre del script con el ndice indicado. script_get_text(ind) Devuelve la cadena de texto del script con el ndice

35.6

Data Files
datafile_exists(ind) Devuelve si el data file con el ndice dado existe. datafile_get_name(ind) Devuelve el nombre del data file con un ndice

Las siguientes opciones proporcionarn informacin acerca de un data file:

especificado.

datafile_get_filename(ind) Devuelve el nombre del archivo del data file

con el ndice especificado.

Las siguientes opciones pueden ser usadas si no exportaste el data file al inicio del juego.
datafile_export(ind,fname) Exporta el data file con el nombre de archivo

sealado (fname) (si no lo exportaste por defecto al inicio) datafile_discard(ind) Libera los datos almacenados internamente por el data file.

35.7

Objects
object_exists(ind) Devuelve si el objeto con el ndice dado existe. object_get_name(ind) Devuelve el nombre del objeto con el ndice dado. object_get_sprite(ind) Devuelve el ndice del sprite por defecto del objeto

Las siguientes opciones proporcionarn informacin acerca de un objeto:

con el ndice epecificado. defecto.

object_get_solid(ind) Devuelve si el objeto con el ndice dado es slido por object_get_visible(ind) Devuelve si el objeto con el ndice dado es visible

por defecto. dado.

object_get_depth(ind) Devuelve la profundidad del objeto con el ndice

object_get_persistent(ind) Devuelve si el objeto con el ndice sealado es

persistente.

object_get_mask(ind) Devuelve el ndice de la mscara del objeto con el

ndice dado (-1 si no tiene mscara especial). object_get_parent(ind) Devuelve el ndice del objeto pariente del objeto ind (-1 si no tiene pariente). object_is_ancestor(ind1,ind2) Devuelve si el objeto ind2 es un progenitor del objeto ind1.

35.8

Rooms
room_exists(ind) Devuelve si el cuarto con el ndice sealado existe. room_get_name(ind) Devuelve el nombre de la habitacin con el ndice dado.

Las siguientes funciones darn informacin acerca de una habitacin:

Nota que porque las habitaciones cambian durante el juego hay otras rutinas para cambiar los contenidos de la habitacin actual.

Captulo 36 GML: Archivos, registro y ejecucin de programas


En juegos ms avanzados probablemente querrs leer datos de un archivo que haz incluido con el juego. Por ejemplo, pudieras crear un archivo que indique en qu momento deben ocurrir ciertas cosas. Probablemente tambin quieras guardar informacin para la siguiente vez que se ejecute el juego (por ejemplo, el cuarto actual). Para esto tenemos las siguientes funciones:
file_exists(fname) Indica si el archivo con el nombre fname existe (true) o no (false). file_delete(fname) Borra el archivo con el nombre fname. file_rename(oldname,newname) Renombra el archivo con el nombre

oldname a newname.

file_copy(fname,newname) Copia el archivo fname al nombre newname. file_open_read(fname) Abre el archivo fname para lectura. file_open_write(fname) Abre el archivo fname para escritura, crendolo si

no existe.

file_open_append(fname) Abre el archivo fname para agregar datos al final,

crendolo si no existe. file_close() Cierra el archivo actual (No olvides llamarla!). file_write_string(str) Escribe la cadena str al archivo abierto actualmente.. file_write_real(x) Escribe el valor real x en el archivo abierto actualmente. file_writeln() Escribe un caracter de nueva lnea en el archivo. file_read_string() Lee una cadena del archivo y devuelve esta cadena. Una cadena termina al final de la lnea. file_read_real()Lee un valor real del archivo y devuelve este valor. file_readln() Salta el resto de la lnea en el archivo e inicia al principio de la siguiente lnea. file_eof() Indica si hemos llegado al final del archivo. directory_exists(dname)Indica si la carpeta dname existe. directory_create(dname)Crea una carpeta con el nombre dname (incluyendo la ruta a esa carpeta) si no existe. file_find_first(mask,attr) Devuelve el nombre del primer archivo que satisfaga las condiciones de la mscara mask y los atributos attr. Si no existe tal archivo, devuelve una cadena vaca. La mscara puede contener una ruta y wildchars, por ejemplo C:\temp\*.doc. Los atributos indican archivos adicionales que quieras ver. (Por lo que los archivos normales son siempre devueltos cuando satisfacen la mscara). Puedes agregar las siguientes constants para ver el tipo de archivos que desees: fa_readonly archivos de slolectura fa_hidden archivos ocultos fa_sysfile archivos de sistema fa_volumeid archivos volume-id

fa_directory carpetas fa_archive archivos archivados file_find_next() Devuelve el nombre del siguiente archivo que satisface la

mscara y los atributos indicados previamente. Si no existe tal archivo, devuelve una cadena vaca. file_find_close() Debe ser llamada despus de manipular los archivos para liberar la memoria. file_attributes(fname,attr) Indica si el archivo fname tiene todos los atributos dados por attr. Usa una combinacin de las constanets indicadas anteriormente.

Si el jugador ha seleccionado modo seguro en sus preferencias, para ciertas rutinas, no se permite especificar la ruta, y slo puedes acceder a los archivos en la carpeta de la aplicacin p. ej. para escribir en ellos. Las siguientes tres variables de slo lectura pueden ser tiles:
game_id* Identificador nico para el juego. Puedes usarlo si necesitas un

nombre nico de archivo. invertida final).

working_directory* Carpeta de trabajo del juego. (No incluye la diagonal temp_directory* Carpeta temporal creada para el juego. Puedes almacenar

archivos temporales aqu. Sern eliminados cuando el juego finalice.

En ciertas situaciones podras dar al jugador la posibilidad de introducir argumentos mediante la lnea de commandos al juego que estn ejecutando (para por ejemplo crear cheats o modos especiales). Para obtener estos argumentos puedes usar las siguientes dos rutinas.
parameter_count() Devuelve el nmero de parmetros de la lnea de

commandos (nota que el nombre del programa es uno de ellos). parameter_string(n)Devuelve los parmetros n de la lnea de commandos. El primer parmetro tiene ndice 0. Se trata del nombre del programa.

Si deseas almacenar una pequea cantidad de informacin entre cada ejecucin del juego hay un mecanismo ms simple que el emplear un archivo. Puedes usar el registro. El registro es una gran base de datos de Windows para mantener todo tipo de configuraciones para los programas. Una entrada tiene un nombre, y un valor. Puedes usar tanto cadenas como valores reales. Tenemos las siguientes funciones:
registry_write_string(name,str) Crea una entrada en el registro con el

nombre name y como valor la cadena str. registry_write_real(name,x) Crea una entrada en el registro con el nombre name y el valor real x.

registry_read_string(name) Devuelve la cadena almacenada con el

nombre name. (El nombre debe existir, de otra forma se devuelve una cadena vaca). registry_read_real(name) Devuelve el valor real almacenado en la entrada name. (El nombre debe existir, de otra forma se devuelve el nmero 0). registry_exists(name) Indica si la entrada name existe. En realidad, los valores en el registro estn agrupados en claves. Las rutinas anteriores trabajan con valores dentro de la clave que est creada especialmente para tu juego. Tu programa puede usar esto para obtener cierta informacin sobre el sistema en el que se est ejecutando el juego. Tambin puedes leer valores en otras claves. Puedes escribir valores en ellas pero ten mucho cuidado. PUEDES FCILMENTE DESTRUIR TU SISTEMA de esta forma. (La escritura no se permite en modo seguro). Nota que las claves tambin estn colocadas en grupos. Las siguientes rutinas trabajan por defecto con el grupo HKEY_CURRENT_USER. Pero puedes cambiar el grupo raz. As, por ejemplo, si quisieras encontrar la carpeta temporal actual, usa Actually, values in the registry are grouped into keys. The above routines all work on values within the key that is especially created for your game. Your program can use this to obtain certain information about the system the game is running on. You can also read values in other keys. You can write them also but be very careful. YOU EASILY DESTROY YOUR SYSTEM this way. (Write is not allowed in secure mode.) Note that keys are again placed in groups. The following routines default work on the group HKEY_CURRENT_USER. But you can change the root group. So, for example, if you want to find out the current temp dir, use
path = registry_read_string_ext('/Environment','TEMP');

Tenemos las siguientes funciones.


registry_write_string_ext(key,name,str) Crea una entrada en el

registro dentro de la clave key con el nombre name y como valor la cadena str. registry_write_real_ext(key,name,x) Crea una entrada en el registro dentro de la clave key con el nombre name y el valor real x. registry_read_string_ext(key,name) Devuelve la cadena con el nombre name dentro de la clave key. (El nombre debe existir, de otra forma se devuelve una cadena vaca). registry_read_real_ext(key,name) Devuelve el valor real con el nombre name en la clave key. (El nombre debe existir, de otra forma se devuelve el nmero 0). registry_exists_ext(key,name) Indica si el nombre name existe dentro de la clave key. registry_set_root(root) Configura la raz para las otras rutinas. Usa los siguientes valores: 0 = HKEY_CURRENT_USER 1 = HKEY_LOCAL_MACHINE 2 = HKEY_CLASSES_ROOT

3 = HKEY_USERS El Game Maker tambin tiene la posibilidad de iniciar programas externos. Hay dos funciones disponibles para esto: execute_program y execute_shell. La funcin execute_program inicia un programa, posiblemente con algunos argumentos. Puede esperar hasta que el programa termine (pausando el juego) o continuar con el juego. La funcin execute_shell abre un archivo. Puede ser cualquier archivo para cuyo tipo est definida una asociacin, p. ej. un archivo html, un archivo de Word, etc. O puede ser un programa. No puede esperar a que se termine la ejecucin por lo que el juego contina. execute_program(prog,arg,wait) Exeuta el programa prog con los argumentos arg. wait indica si se debe esperar a que termine la aplicacin. execute_shell(prog,arg) Ejecuta el programa (o archivo) en el entorno. Ambas funciones no funcionarn si el jugador activa el modo seguro en sus preferencias. Puedes checar esto usando la variable de solo lectura:
secure_mode* Indica si el juego est ejecutndose en modo seguro.

Captulo 37 GML: Juegos multiplayer


Jugar contra la computadora es divertido. Pero jugar contra oponentes humanos puede serlo mucho ms. Es relativamente fcil crear este tipo de juegos porque no tienes que implementar IA compleja para un oponente manejado por la computadora. Por supuesto que puedes sentar a dos jugadores tras el mismo monitor y emplear diferentes teclas o algn otro dispositivo de entrada, pero es mucho ms interesante cuando cada jugador est detrs de su propia computadora. O an mejor, un jugador se encuentra del otro lado del ocano. El Game Maker tiene soporte multijugador. Por favor toma en cuenta que el crear juegos multijugador efectivos que se sincronicen bien y no tengan latencia es una tarea difcil. Este captulo da una breve descripcin de las posibilidades. En el sitio web hay un tutorial con ms informacin.

37.1

Estableciendo una conexin

Para que dos computadoras se comuniquen necesitarn sierto protocolo de conexin. Como la mayora de los juegos, el Game Maker ofrece cuatro diferentes tipos de conexin: IPX, TCP/IP, Mdem y Serial. La conexin IPX (para ser ms precisos, se trata de un protocolo) funciona casi completamente transparente. Puede emplearse para jugar juegos con otras personas en la misma red local. Se necesita que est instalada en tu computadora para que pueda emplearse. (Si no funciona, consulta la documentacin de Windows. O ve a la opcin Red dentro del Panel de Control y agrega el protocolo IPX). TCP/IP es el protocolo de internet. Puede usarse para jugar con otros jugadores en cualquier lugar mediante internet, suponiendo que conozcas su direccin IP. Una conexin modem se realiza a travs del modem. Tienes que introducir cierta informacin del modem (una caden de inicializacin y un nmero telefnico) para usarla. Finalmente, al usar la lnea serial (una conexin directa entre las computadoras) necesitas introducir varias opciones de puertos. Hay cuatro funciones dentro del GML que pueden emplearse para inicializar estas conexiones:
mplay_init_ipx()inicializa una conexin IPX. mplay_init_tcpip(addr)inicializa una conexin TCP/IP. addr es una cadena

que indica la direccin web o IP, p. ej. 'www.gameplay.com' o '123.123.123.12', posiblemente seguida por un nmero de puerto (p. ej. ':12'). Slo se necesita la direccin para unirse a una sesin (ve a continuacin). En una red local no se necesitan direcciones. mplay_init_modem(initstr,phonenr)inicializa una conexin via mdem. initstr es la cadena de inicializacin para el mdem (puede estar vaca). phonenr es una cadena que contiene el nmero telefnico a marcar (p. ej. '0201234567'). Slo se nec el nmero telefnico al unirse a una sesin (ve a esita continuacin). mplay_init_serial(portno,baudrate,stopbits,parity,flow)inicializa una conexin serial. portno es el nmero del puerto (1-4). baudrate es la velocidad a emplear en baudios (100-256K). stopbits indica el nmero de bits de parada (0 = 1 bit, 1 = 1.5 bit, 2 = 2 bits). parity incida la paridad (0=ninguna, 1=impar, 2=par, 3=mark). Y flow indica el tipo de control de flujo (0=ninguno,

1=xon/xoff, 2=rts, 3=dtr, 4=rts y dtr). Indica si la conexin se ha establecido. Da un valor de 0 como el primer argumento para abrir mostrar un dilogo en el que el usuario puede cambiar la configuracin. Tu juego debe llamar una de estas funciones una sola vez. Todas las funciones indican si han tenido xito (si se logra la conexin). No tiene xito si el protocolo en particular no est instalado o soportado por tu mquina. Para checar si hay una conexin exitosa disponible puedes emplear la siguiente funcin
mplay_connect_status()devuelve el estado de la conexin actual. 0 = no hay

conexin, 1 = conexin IPX, 2 = conexin TCP/IP, 3 = conexin via mdem, and 4 = conexin serial. Para finalizar la conexin llama
mplay_end()finaliza la conexin actual.

Cuando empleas una conexin TCP/IP tal vez quieras decirle a la persona con la que deseas jugar cul es la direccin ip de tu computadora. La siguiente funcin te ser de ayuda:
mplay_ipaddress()devuelve

la direccin IP de tu mquina (p. ej. '123.123.123.12') como cadena. Puedes p. ej. mostrarla en pantalla. Nota esta que rutina es lenta por lo que mejor no la llames a menudo.

37.2

Creando y unindose a sesiones

Cuando te conectas a una red, puede haber mltiples juegos ejecutndose en la misma red. Esos juegos reciben el nombre de sesiones. Estas diferentes sesiones pueden corresponder a juegos diferentes o al mismo. Un juego debe identificarse en la red. Afortunadamente, el Game Maker hace esto por ti. Lo nico que debes saber es que cuanto cambias el id del juego en la ventana de opciones esta identificacin cambia. De esta forma puedes evitar que personas con versiones anteriores de tu juego jueguen contra personas que cuentan con versiones ms recientes. diferentes juegos o al When you connect to a network, there can be multiple games happening on the same network. We call these sessions. These different sessions can correspond to different games or to the same game. A game must uniquely identify itself on the network. Fortunately, Game Maker does this for you. The only thing you have to know is that when you change the game id in the options form this identification changes. In this way you can avoid that people with old versions of your game will play against people with new versions. Si quieres iniciar un nuevo juego multijugador necesitas crear una nueva sesin. Para esto puedes emplear la siguiente rutina:
mplay_session_create(sesname,playnumb,playername)Crea

una nueva mieva sesin en la conexin actual. sesname es una cadena que indica el nombre de la sesin. playnumb indica el nmero mximo de jugadores

permitidos para este juego (usa 0 para un nmero arbitrario de jugadores). playname es tu nombre como jugador. Indica si ha tenido xito. Una instancia del juego debe crear la sesin. La(s) otra(s) instancia(s) del juego deben unirse a esta sesin. Esto es un poco ms complicado. Primero debes ver las sesiones disponibles y luego elegir a la que te unirs. Hay tres rutinas importantes para esto:
mplay_session_find()busca todaslas sesiones que an aceptan jugadores y

devuelve el nmero de sesiones encontradas. mplay_session_name(numb)devuelve el nombre de la sesin nmero numb (0 es la primer sesin). Esta rutina puede ser llamada slo despus de haber llamado a la anterior. mplay_session_join(numb,playername)con esta rutina te unes a la sesin nmero numb (0 es la primer sesin). playername es tu nombre como jutador. Indica si ha tenido xito. Hay una rutina ms que puede cambiar el modo de la sesin. Debe llamarse antes de crear una sesin:

mplay_session_mode(move) indica si se mueve la sesin de host a otra

computadora cuando el host actual cierre. move debe ser true o false (valor por defecto). Para checar el estado de la sesin actual puedes usar la siguiente funcin
mplay_session_status()devuelve el estado de la sesin actual. 0 = no hay

sesin, 1 = sesin creada, 2 = se uni a la sesin.

Un jugador puede detener una sesin empleando la siguiente rutina:


mplay_session_end()finaliza la sesin para este jugador.

37.3

Jugadores

Cada instancia del juego pque se una a un juego es un jugador. Como se indic antes, los jugadores tienen nombres. Hay tres rutinas referentes a los jugadores.
mplay_player_find()busca todos los jugadores en la sesin actual y devuelve

el nmero de jugadores encontrados. mplay_player_name(numb)devuelve el nombre del jugador nmero numb (0 es el primer jugador, el cual siempre eres t). Esta rutina puede slo ser llamada despus de haber llamado a la anterior. mplay_player_id(numb)devuelve el id nico del jugador nmero numb (0 es el primer jugador, el cual siempre eres t). Esta rutina puede llamarse slo despus de haber llamado la primera. Este id es usado al enviar y recibir mensajes de otros jugadores.

37.4

Shared data (datos compartidos)

La comunicacin mediante datos compartidos es probablemente la mejor forma de sincronizar el juego. Todo el proceso de comunicacin no es visible para ti. Hay un juego de 10000 valores que son comunes a todas las entidades del juego. Cada entidad puede establecer y ller valores. El Game Maker se asegura de que cada entidad vea los mismos valores. Un valor puede ser un nmero real o una cadena. Slo hay dos rutinas:
mplay_data_write(ind,val)escribe el valor val (cadena o real) en la

ubicacin ind (ind between 0 and 10000). mplay_data_read(ind)devuelve el valor en la ubicacin ind (ind entre 0 y 10000). Inicialmente todos los valores son 0. Para sincronizar la informacin en las diferentes mquinas puedes ya sea usar un modo garantizado (guaranteed mode) que asegura que el cambio llegue a la otra mquina (pero el cual es lento) o un modo no garantizado (non-guaranteed mode). Para cambiar esto usa la siguiente rutina:
mplay_data_mode(guar) indica si se usa o no transmisin garantizada para los

datos compartidos. guar debe ser true (valor por defecto) o false.

37.5

Mensajes

El segundo mecanismo de comunicacin que el Game Maker soporta es el envio y la recepcin de mensajes. Un jugador puede enviar mensajes a un jugador o a todos los jugadores. Los jugadores pueden ver si han llegado mensajes y llevar a cabo las acciones adecuadas. Los mensajes pueden enviarse en modo garantizado en el que ests seguro de que llegarn (pero puede ser lento) o en modo no garantizado, el cual es ms rpido. Tenemos las siguientes rutinas de mensajes:
mplay_message_send(player,id,val)envia un mensaje al jugador player

(ya sea un identificador o un nombre; usa 0 para enviar el mensaje a todos los jugadores). id es un entero que funciona como identificador del mensaje y val es el valor (ya sea un nmero real o una cadena). El mensaje es enviado en modo no garantizado. mplay_message_send_guaranteed(player,id,val) envia un mensaje al jugador player (ya sea un identificador o un nombre; usa 0 para enviar el mensaje a todos los jugadores). id es un entero que funciona como identificador del mensaje y val es el valor (ya sea un nmero real o una cadena). Este es un envio garantizado. mplay_message_receive(player) recibe el siguiente mensaje de la cola de mensajes que lleg del jugador player (identificador o nombre). Usa 0 para indicar mensajes de cualquier jugador. La rutina indica si de hecho hubo un nuevo mensaje. Si es as, puedes emplear las siguientes rutinas para obtener su contenido:

mplay_message_id() Devuelve el identificador del ltimo mensaje recibido. mplay_message_value() Devuelve el valor del ltimo mensaje recibido. mplay_message_player() Devuelve el jugador que envi el ltimo mensaje

recibido.

mplay_message_name() Devuelve el nombre del jugador que envi el ltimo

mensaje recibido.

mplay_message_count(player) Devuelve el nmero de mensajes restantes

en la cola de espera del jugador player (usa 0 para contar todos los mensajes). mplay_message_clear(player) Elimina todos los mensajes en la cola de espera del jugador player (usa 0 para eliminar todos los mensajes). Debemos hacer algunas observaciones. Primero que nada, si quieres enviar un mensaje slo a un usuario en particular, necesitars conocer el id del jugador. Como se indic antes puedes obtener este id con la funcin mplay_player_id(). Este identificador del jugador tambin es empleado al recibir mensajes de un jugador en particular. Alternativamente, puedes dar el nombre del jugador como cadena. Si varios jugadores tienen el mismo nombre, el mensaje slo llegar al primero. En segundo lugar, podras preguntarte porqu cada mensaje tiene un entero identificador. La razn es que esto ayuda a tu aplicacin a enviar diferentes tipos de mensajes. El receptor puede checar el tipo de mensaje usando el id y llevar a cabo las acciones apropiadas. (Como no est garantizado que los mensajes lleguen, el enviar el id y el valor en mensajes diferentes causara serios problemas).

Captulo 38 GML: Usando DLLs


En aquellos casos en los que la funcionalidad del GML no cubre lo que deseas, puedes extender las posibilidades empleando plug-ins. Un plug-in consiste en un archivo DLL (Dynamic Link Library Biblioteca de enlace dinmico). En este archivo DLL puedes definir unciones. Tales funciones pueden ser programadas en cualquier lenguaje que soporte la creacin de DLLs (p. ej. Delphi, Visual C++, etc.). Aunque necesitars de cierta habilidad en programacin para hacerlo. Las funciones plug-in deben tener un formato especfico. Pueden tener entre 0 y 12 argumentos, cada uno de los cuales puede ser un nmero real (double en C) o una cadena (string) terminada en un carcter nulo. (Para ms de 4 argumentos, slo existe soporte para argumentos reales por el momento). Estas funciones deben devolver ya sea un valor real o una cadena terminada en carcter nulo. En Delphi puedes crear una DLL haciendo clic en New del men File y luego seleccionando DLL. Aqu tienes un ejemplo de una DLL que podras emplear con el Game Maker, escrita en Delphi. (Nota: este es cdigo de Delphi, no GML!)
library MyDLL; uses SysUtils, Classes; function MyMin(x,y:real):real; cdecl; begin if x<y then Result := x else Result := y; end; var res : array[0..1024] of char; function DoubleString(str:PChar):PChar; cdecl; begin StrCopy(res,str); StrCat(res,str); Result := res; end; exports MyMin, DoubleString; begin end.

Esta DLL define dos funciones: MyMin toma dos argumentos reales y devuelve el de menor valor, y DoubleString que duplica una cadena. Recuerda que debes ser cuidadoso con el manejo de la memoria. Esta es la razn por la que declar la cadena resultante como global. Tambin nota el uso de la llamada cdecl por convecin. Puedes emplear las convenciones de llamada cdecl o stdcall. Una vez que crees la DLL en Delphi tendrs el archivo MyDLL.DLL. Este archivo debe ser colocado en la carpeta de tu juego. (O en cualquier otro lugar donde Windows pueda encontrarlo). Tambin puedes usar un recurso data file para almacenar la DLL dentro del juego.

Para hacer uso de esta DLL en el Game Maker primero necesitas especificar las funciones externas que deseas emplear y qu tipo de argumentos necesitan. Para ello tenemos la siguiente funcin en el GML:
external_define(dll,name,calltype,restype,argnumb,arg1type,a rg2type, ) Define una funcin externa. dll es el nombre del archivo dll. name es el nombre de las funciones. calltype es la convencin de llamada empleada. Usa dll_cdecl o dll_stdcall. restype es el tipo del resultado. Usa ty_real o ty_string. argnumb es el nmero de argumentos (0-12).

Despus, para cada argumento debes especificar su tipo. Para ello usa nuevamente ty_real o ty_string. Cuando hay ms de 4 argumentos todos ellos deben ser de tipo ty_real. Esta funcin devuelve el id de la funcin externa que debe emplearse para llamarla. En el ejemplo de arriba, al inicio del juego usaras el siguiente cdigo GML:
{ global.mmm = external_define('MYDLL.DLL','MyMin',dll_cdecl, ty_real,2,ty_real,ty_real); global.ddd = external_define('MYDLL.DLL','DoubleString',dll_cdecl, ty_string,1,ty_string); }

Ahora en el momento que neceisties llamar a las funciones, usas la siguiente funcin:
external_call(id,arg1,arg2,) Llama a a la funcin externa con el id y

los argumentos dados. Necesitas proporcionar el nmero correcto de argumentos del tipo correcto (real o string). La funcin devuelve el resultado de la funcin externa. As, por ejemplo, escribiras:
{ aaa = external_call(global.mmm,x,y); sss = external_call(global.ddd,'Hello'); }

Ahora te preguntars cmo hacer una funcin en una DLL que haga algo en el juego. Por ejemplo, podras querer una DLL que agregue instancias de objetos a tu juego. La forma ms fcil es dejar que la funcin DLL devuelva una cadena que contenga una pieza de cdigo GML. Esta cadena que contiene una pieza de GML puede ser ejecutada usando la funcin del GML
execute_string(str) Ejecuta la pieza de cdigo en la cadena str.

Alternativamente puedes dejar que la DLL cree un archivo con un script que puede ser ejecutado (esta funcin tambin puede ser empleada para luego modificar el comportamiento del juego).

execute_file(fname) Ejecuta el cdigo en el archivo fname.

Ahora puedes llamar una funcin externa y ejecutar la cadena resultante, por ejemplo:
{ ccc = external_call(global.ddd,x,y); execute_string(ccc); }

En algunos casos especiales pudieras necesitar el handle de ventana (identificador de Windows) de la ventana principal del juego. Este puede obtenerse con la siguiente funcin y luego ser pasado a la DLL:
window_handle() Devuelve el handle de ventana de la ventana principal.

Nota: las DLLs no pueden ser empleadas en modo seguro. El empleo de DLLs externas es una funcin extremadamente poderosa. Pero por favor haz uso de ellas slo si sabes lo que ests haciendo.

También podría gustarte