Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Lenguaje GML PDF
Lenguaje GML PDF
ms flexibilidad y control que las acciones estndar. Nos referiremos a este lenguaje como el GML (de Game Maker
Language). Hay 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. Tercero, en el room creation code. Y 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 describiremos 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. Mantente seguro que todos los recursos tengan nombres
diferentes, 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.
La estructura bsica del GML se trata con detalle en los siguientes captulos:
Un programa.
Un programa consiste de un sistema de instrucciones, llamados sentencias. Un programa debe comenzar con el smbolo
{ y terminar con el smbolo } . Las sentencias deben separarse con el smbolo ';'. La estructura global de todo
programa es:
{
<sentencia >;
<sentencia >;
...
}
Hay un nmero de diferentes tipos de sentencias, de las cuales vamos a ver ms abajo.
Variables
Como en cualquier lenguaje de programacin, el GML contiene variables. Las variables son las posiciones de memoria
que guardan la informacin. Las variables pueden almacenar valores reales o cadenas de texto. Las variables no
necesitan ser declaradas como en otros lenguajes. 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 e 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
Asignaciones
Una asignacin pasa el valor de una expresin a una variable. Una asignacin tiene la siguiente forma:
<variable> = <expresin>;
Una expresin puede ser un simple valor pero tambin puede ser ms complicada. Adems de asignar un valor a una
variable, tambin se le puede sumar usando +=, restar usando -=, multiplicarla usando *=, dividirla usando /=, o
Expresiones
Las expresiones pueden ser nmeros reales (p. Ej. 3.4), nmeros hexadecimales, comenzando con el signo $ (p. Ej.
$00FFAA), cadenas entre comillas simples o dobles (p. Ej. hola o hola) u otras ms complicadas. Para las
&&, ||: funciones Booleanas (&& para la funcin and, || para la funcin)
<, <=, ==, !=, >, >=: comparaciones, el resultado es true (1) o false (0)
| & ^: operadores de bit (| = bitwise or, & = bitwise and, ^ = bitwise xor)
<< >>: operadores de bit (<< = shift left, > > = shift right)
+, -: adicin, sustraccin
Nota que el valor x div y es el valor de x/y redondeado en la direccin de cero al nmero entero ms cercano. El
operador mod devuelve el resto obtenido dividiendo sus operandos. En otras palabras, x mod y = x (x
div y) * y. Tambin, los operadores de bit existen:
!: 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
Ejemplo
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.
{
if (global.hacer)
{
// hacer cualquier cosa
global.hacer = false;
}
}
A veces quieres variables que solo estn dentro del actual piece of code o de un script. De esta manera evitas perder
memoria y ests seguro que no hay ningn conflicto con los nombres. Esto es tambin ms rpido que usar variables
globales. Para hacer esto debes declarar las variables en el comienzo del cdigo, usando la palabra var. Esta
declaracin se ve as:
{
var xx,yy;
xx = x+10;
yy = y+10;
instance_create(xx,yy,pelota);
}
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.
pelota.speed = 0;
Esto cambiar la velocidad de todas las instancias del objeto pelota. Hay ciertos objetos especiales.
other.sprite_index = sprite5;
all.speed = 0;
global.message = 'Un 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
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 mayores o iguales a 100000. Puedes emplear estos
nmeros como la parte a la izquierda del punto. Pero ten cuidado, el punto ser interpretado como el punto decimal en
el nmero. Para evitarlo, colcalo entre parntesis. As por ejemplo, asumiendo que el id de la pelota es 100032,
puedes escribir:
(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 mejor. 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 vlido:
{
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 otros programas.
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 ndices
negativos. El sistema coloca un lmite de 32000 para cada ndice 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;
}
Sentencia If
o
if (<expresin>) <sentencia> else <sentencia >
La sentencia tambin puede ser un bloque. La expresin se evaluar. Si el valor (redondeado) 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
if (<expresin>)
{
<Sentencia >
}
else
{
<Sentencia >
}
Ejemplo
{
if (x<200) {x += 4} else {x -= 4};
}
Sentencia Repeat
Ejemplo
{
repeat (5) instance_create(random(400),random(400),pelota);
}
Sentencia While
ciclos while. Puedes fcilmente hacer que se repitan eternamente, en cuyo caso el juego se bloquear y ya no
Ejemplo
El siguiente programa trata de colocar el objeto actual en una posicin libre (esto es casi lo mismo que la accin para
{
while (!place_free(x,y))
{
x = random(room_width);
y = random(room_height);
}
}
Sentencia Do
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 (esto es lo mismo que mover un objeto en
{
do
{
x = random(room_width);
y = random(room_height);
}
until (place_free(x,y))
}
Sentencia For
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
Puede sonar complicado. Debes interpretarlo de la manera siguiente. La primera sentencia inicializa el ciclo for. La
Ejemplo
El siguiente programa inicializa un array llamada lista de longitud 10 con los valores 1-10.
{
for (i=0; i<=9; i+=1) lista[i] = i+1;
}
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>: <statement1>; ... ; break;
case <expresin2>: <statement2>; ... ; break;
...
default: <statement>; ...
}
Funciona as: 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
Ejemplo
El siguiente programa lleva a cabo una accin segn la tecla que se presione.
switch (keyboard_key)
{
case vk_left:
case vk_numpad4:
x -= 4; break;
case vk_right:
case vk_numpad6:
x += 4; break;
}
Sentencia Break
break
Si se emplea en un ciclo for, while, repeat, en una sentencia switch o with, finaliza el ciclo o sentencia. Si es empleada
Sentencia Continue
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.
Sentencia Exit
exit
Simplemente termina la ejecucin del programa/script actual. (No termina la ejecucin del juego! Para ello necesitas la
Una funcin tiene la siguiente estructura: nombre de la funcin, seguido por uno o varios argumentos entre parntesis,
<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 usado como una funcin.
Nota que para una funcin sin argumentos an se necesitan los parntesis. Algunas funciones devuelven valores y
Nota que es imposible usar una funcin como el lado izquierda de una asignacin. Por ejemplo, no puedes escribir
(instance_nearest(x,y,obj)).speed = 0.
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, , argument15. Por lo que puede haber como
mximo 16 argumentos. (Nota: cuando se llama un script desde una accin, slo se pueden especificar los primeros 5
Los scripts tambin pueden devolver un valor, por lo que pueden ser empleados en expresiones. Para ello debes
return <expresin>
Ejemplo
{
return (argument0*argument0);
}
Para llamar un script desde una pieza de cdigo, solo hazlo como cuando se hacen las llamadas a funciones. Esto es,
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 pxeles
hacia abajo. Pudieras pensar que eso se logra con el siguiente cdigo
pelota.y = pelota.y + 8;
Pero no es correcto. 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
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
<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
with (pelota) y += 8;
Si deseas ejecutar mltiples declaraciones, colcalas entre corchetes. Por ejemplo, para mover todas las pelotas a una
with (pelota)
{
x = random(room_width);
y = random(room_height);
}
Nota que, dentro de las sentencias, la instancia indicada se ha vuelto la instancia self. Entonces, 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
Si una bomba explota y tu quieres destruir todas las instancias cercanas a ella puedes usar
with (all)
{
if (distance_to_object(other) < 50) instance_destroy();
}
Comentarios
Puedes agregar comentarios a tus programas. Todo en una lnea despus de // no se ejecuta. Puedes hacer tambin
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
Haciendo clculos
Game Maker contiene un gran nmero de funciones para realizar determinadas tareas. Aqu tienes una lista completa
de estas funciones.
Constantes
true equivale a 1.
false equivale a 0.
pi equivale a 3.1415...
Estas son las funciones disponibles para trabajar con nmeros reales:
max(val1,val2,val3,...) Devuelve el mayor de los valores. La funcin soporta 16 argumentos. Deben ser
todos nmeros reales o cadenas de texto.
lengthdir_x(len,dir) Devuelve la componente horizontal (x) del vector determinado por la longitud y
direccin indicadas.
lengthdir_y(len,dir) Devuelve la componente vertical (y) del vector determinado por la longitud y
direccin indicadas.
Estas son las funciones disponibles para trabajar con cadenas de texto:
chr(val) Devuelve una cadena con el carcter al que hace referencia el cdigo asci VAL.
ord(str) Devuelve el cdigo asci del primer carcter de la cadena de texto STR.
real(str) Convierte una cadena de texto en un nmero real. STR puede contener signos negativos, puntos
string(val) Convierte el nmero real en una cadena de texto utilizando el formato estndar (sin decimales
cuando se trata de un nmero entero y un mximo de dos dgitos decimales en cualquier otro caso).
string_format(val,tot,dec) Convierte VAL en una cadena de texto utilizando nuestro propio formato:
TOT indica el mximo de dgitos y DEC el nmero de dgitos decimales.
string_delete(str,index,count) Devuelve una copia de la cadena STR con una parte borrada, que
empieza en INDEX y de una longitud definida por COUNT.
string_letters(str) Devuelve una cadena de texto que solo contiene las letras de la cadena STR.
string_digits(str) Devuelve una cadena que solo contiene los nmeros de la cadena STR.
string_lettersdigits(str) Devuelve una cadena que solo contiene los nmeros y las letras de la
cadena STR.
Game Maker dispone de varias funciones para trabajar con fechas y horas. La fecha y la hora se almacenan como un
nmero real. La parte entera es el nmero de das que han pasado desde 12/30/1899 y parte decimal de este valor es
la fraccin de un da de 24 horas que ha transcurrido hasta el momento. Estas son las funciones disponibles:
date_inc_month(date,amount) Devuelve una nueva fecha N meses despus de la fecha indicada. N debe
ser un nmero entero.
date_inc_day(date,amount) Devuelve una nueva fecha N das despus de la fecha indicada. N debe ser
un nmero entero.
date_inc_hour(date,amount) Devuelve una nueva fecha N horas despus de la fecha indicada. N debe
date_month_span(date1,date2) Devuelve el nmero de meses que hay entre las dos fechas. Reporta
los meses incompletos como una fraccin.
date_week_span(date1,date2) Devuelve el nmero de semanas que hay entre las dos fechas. Reporta
las semanas incompletas como una fraccin.
date_day_span(date1,date2) Devuelve el nmero de das que hay entre las dos fechas. Reporta los das
incompletos como una fraccin.
date_hour_span(date1,date2) Devuelve el nmero de horas que hay entre las dos fechas. Reporta las
horas incompletas como una fraccin.
date_minute_span(date1,date2) Devuelve el nmero de minutos que hay entre las dos fechas. Reporta
los minutos incompletos como una fraccin.
date_second_span(date1,date2) Devuelve el nmero de segundos que hay entre las dos fechas.
Reporta los segundos incompletos como una fraccin.
date_date_of(date) Devuelve la parte de la fecha del valor fecha-hora indicado, estableciendo la hora a 0.
date_time_of(date) Devuelve la hora del valor fecha-hora indicado, estableciendo la fecha a 0.
date_datetime_string(date) Devuelve una cadena indicando la fecha y hora definidos, en el formato
predeterminado para el sistema.
Game play
Hay una gran cantidad de variables y funciones que puedes emplear para definir el game play (jugabilidad). Estas en
Movindose
Obviamente, un aspecto importante de los juegos es el movimiento de las instancias de los objetos. Cada instancia
tiene dos variables internas x e 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 e y. Es lo que debes hacer si deseas movimientos
ms complicados. Este cdigo normalmente se coloca en el evento step del objeto.
Si el objeto se mueve con velocidad y direccin constantes, hay una manera ms fcil de lograrlo. Cada instancia tiene
una velocidad horizontal (hspeed) y vertical (vspeed). Ambas se indican en pxeles 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
Para concluir, cada instancia tiene las siguientes variables y funciones referentes a su posicin y movimiento:
x Su posicin x.
y Su posicin y.
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 toma en cuenta las instancias no slidas.
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, al igual que la accin correspondiente.
move_bounce_all(adv) Rebotar contra todas las instancias, en lugar de slo 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 colisin 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.
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.
Paths
En Game Maker puedes definir caminos o trayectorias (paths) y ordenar a las instancias que los sigan. Aunque puedes
usar las acciones para esto, existen funciones que te dan ms flexibilidad:
path (una velocidad negativa indica que la instancia se mover al revs sobre el path). endaction indica que
debera ocurrir cuando la instancia llegue al final del camino. Puedes usar los siguientes valores para esto:
0 : parase
1: continuar desde la posicin inicial del path (s el path no est cerrado saltamos a la posicin inicial)
El argumento absolute debe ser true o false. Cuando es true se usan las coordenadas absolutas del path. Cuando
es false el path es relativo a la posicin actual de la instancia. Para ser ms precisos, si la velocidad es positiva el
punto inicial del path se colocar en la posicin actual de la instancia y se seguir desde ah. Cuando la velocidad es
negativa, el punto final del path se colocar en la posicin de la instancia y el path se seguir al revs desde ah.
path_positionprevious Posicin previa en el path. Esto se puede usar en eventos de colisin para colocar
la instancia en la posicin anterior antes de una colisin.
path_speed Velocidad (en pxels por paso) con la que la instancia sigue el path. Con una velocidad negativa el
path se recorre en sentido inverso.
path_orientation Orientacin (antihoraria) en la que se realiza el path. 0 es la orientacin normal del path.
path_scale Escala del path. Aumntala para hacer el path ms grande. 1 es el valor normal del path.
path_endaction La accin que se debe ejecutar al finalizar el path. Puedes indicar los valores explicados ms
arriba.
La planificacin del movimiento te ayuda a mover una instancia de un punto a otro esquivando otras instancias que
pudiera encontrarse por el camino (por ejempo, paredes). Resulta imposible dar funciones generales que funcionen en
cualquier situacin. As mismo, las operaciones necesarias para calcular un camino libre de colisiones consumen
bastantes recursos, as que debes usar estas funciones con criterio. Ten todo esto en cuenta cuando uses las siguientes
funciones.
Game Maker dispone de diferentes formas de planificar el movimiento. La ms simple consiste en hacer que una
instancia de un paso hacia la posicin final, intentando ir en lnea recta pero tomando otra direccin si esto ltimo
resulta imposible. Estas funciones deben usarse en el evento step de la instancia y se corresponden a las acciones ya
comentadas:
direccin para tratar de esquivar el objeto, movindose alrededor de l. Puede que no siempre se consiga llegar a la
meta, pero la funcin siempre intentar acercar lo ms posible a la instancia. Devuelve true si se llega a la meta.
primero la instancia intenta moverse en lnea recta hacia la meta. Para ello, mira un nmero de pasos adelante para ver
si hay algn obstculo. Este nmero de pasos corresponde al valor ahead (por defecto 3). Reduciendo este valor la
instancia comenzar a cambiar su direccin ms tarde si encuentra un obstculo. Aumentndolo cambiar antes de
direccin. Si detectamos una colisin, la funcin mira a la derecha y a la izquierda para encontrar un camino libre. Esto
se realiza en pasos de tamao rotstep (por defecto 10). Reducindolo conseguimos que la instancia tenga ms
posibilidades para moverse pero la funcin ser ms lenta. El parmetro maxrot (por defecto 30) indica cunto
puede cambiar como mximo la direccin en un paso. As que aunque pueda moverse en lnea recta hacia la meta no lo
har si debe girar ms de lo indicado por este parmetro. Aumentndolo conseguimos que la instancia pueda girar ms
en cada paso, haciendo que sea ms fcil encontrar un camino aunque ste ser menos uniforme. Disminuyendo su
valor el camino ser ms suave pero la instancia realizar giros ms largos, haciendo que a veces no pueda llegar
exactamente a la meta. Cuando la instancia no se puede mover en ninguna direccin el comportamiento depender del
valor de onspot. Si onspot es true la instancia rotar en su posicin la cantidad indicada por maxrot. Si es
false se parar (esto es til para coches, por ejemplo, pero reduce las posibilidades de encontrar un camino hacia la
meta).
Observa que el acercamiento potencial slo usa informacin local. As que slo encontrar un camino si la informacin
es suficiente para determinar la direccin correcta. Por ejemplo, normalmente no podr encontrar el camino para
escapar de un laberinto.
El segundo tipo de funciones calcula un camino libre colisiones. Una vez que el camino se ha calculado puedes
asignrselo a la instancia para que se mueva hacia la meta como si fuera un path normal que t hubieras creado. El
clculo del camino tarda un poco pero una vez hecho la ejecucin del path es muy rpida. Por supuesto, esto es vlido
si la situacin no cambia (por ejemplo, si los obstculos se mueven). Entonces necesitars volver a calcular el path. De
nuevo, estas funciones pueden fallar en algunas circunstancias. Estas funciones slo estn disponibles en la
anteriores.
path. Si no consigue encontrar un camino, la funcin devolver un path hasta la posicin donde la instancia qued
bloqueada.
stepsize e intentando evitar colisionar con los obstculos. Utiliza pasos potenciales como la funcin
mp_potential_step() y los parmetros se pueden configurar con mp_potential_settings(). El
path indicado debe existir con anterioridad a la llamada de la funcin y ser sobreescrito por el nuevo path (consulta el
captulo sobre cmo crear y destruir paths). La funcin devolver si se ha encontrado un camino. Para evitar que la
funcin contine calculando para siempre debes especificar un factor mayor que 1. La funcin se detendr y
devolver un mensaje de error si no puede encontrar un camino que sea ms corto que la distancia del origen a la
meta multiplicada por factor. Un factor de 4 es normalmente suficiente pero si crees que la instancia tendr un
camino largo puedes aumentarlo. Si la funcin falla se crea el camino en direccin a la meta pero la instancia no
llegar la meta.
Las dems funciones usan un mecanismo mucho ms complejo basado en rejillas (un algoritmo A*). Tiene ms sexito a
la hora de encontrar caminos y hacerlos ms cortos, pero requiere ms trabajo por tu parte. Adems, tambin puede
fallar en algunas ocasiones. El funcionamiento es como sigue: primero situamos una rejilla sobre la parte del cuarto
afectada. Puedes usar si quieres usar una rejilla fina (ms lento) o ms espaciada. Despus, determinamos las celdas
de la rejilla ocupadas por objetos relevantes (usando colisin precisa o la caja de contorno) y marcamos estas celdas
como prohibidas. As que una celda estar prohibida si parte de un obstculo la est ocupando. Finalmente
especificamos la posicin inicial y final, que deben estar en celdas libres de la rejilla y la funcin calcula el camino ms
corto entre ellas. El camino ir de centro a centro de las celdas libres. As que las celdas deben ser lo suficientemente
grandes como para que la instancia entre totalmente dentro de ellas. Ahora puedes asignar el path a una instancia y
Debes determinar la zona del cuarto sobre la que situar la rejilla y el tamao de las celdas con la mayor precisin
posible. Tambin debes decidir qu objetos deben tomarse en cuenta y si es necesaria la colisin precisa o no. Todos
En particular, el tamao de las celdas es crucial. Recuerda que las celdas deben lo suficientemente grandes como para
que la instancia que se mueve entre totalmente dentro de ellas (ten cuidado con la posicin del origen de la instancia y
recuerda que puedes mover el path para hacer que el centro del objeto coincida con el centro de la celda). Por otro
lado, cuanto menores sean las celdas ms caminos diferentes podrs encontrar. Si haces las celdas demasiado grandes
puede que unos pocos objetos ocupen todas las celdas cerrando todos los caminos posibles.
mismo tiempo. left y top indican la posicin de la esquina superior izquierda de la rejilla y hcells y
vcells indican el nmero de celdas horizontales y verticales respectivamente. Finalmente, cellwidth y
cellheight indican la anchura y altura de las celdas.
mp_grid_destroy(id) Destruye la rejilla indicada y libera la memoria usada. No olvides llamar a esta funcin
cuando no necesites usar ms la rejilla.
mp_grid_add_instances(id,obj,prec) Marca todas las celdas que intersectan una instancia del
objeto indicado como prohibidas. Tambin puedes especificar una id de una instancia concreta, o la palabra clave all
para indicar todas las instancias. prec indica si hay que usar colisin precisa (slo funcionar si en el sprite de la
instancia est activada la misma opcin).
nuevo path (consulta el captulo sobre cmo crear y destruir paths). xstart e ystart indican el comienzo del
path y xgoal e ygoal las coordenadas de la meta. allowdiag indica si se permiten movimientos diagonales
entre celdas o slo horizontales y verticales. La funcin devuelve si consigui calcular un path (observa que el path es
mp_grid_draw(id) Esta funcin dibuja la rejilla marcando las celdas libres y prohibidas (muy til para buscar
errores).
Deteccin de colisiones
Al planificar movimientos o decidir ciertas acciones es importante comprobar si ocurren colisiones con otras instancias
en otras posiciones. Las funciones siguientes se utilizan para esto. Todas ellas tienen 3 argumentos en comn: el
argumento obj puede ser un objeto, la palabra clave all, o la id de una instancia. El argumento prec indica si se
debe usar colisin precisa o la caja de contorno de la instancia (la colisin precisa slo funciona si el sprite de la
instancia tiene activada la misma opcin). El argumento notme indica si no se debe tener en cuenta a la instancia que
llama a la funcin. Todas estas funciones devuelven la id de una de las instancias con las que se detecta colisin. Si no
rectngulo (slido) con las esquinas indicadas e instancias del objeto obj. Por ejemplo, puedes usar esta funcin para
ver si un rea est libre de obstculos.
circunferencia (slido) con centro (xc,yc) y radio r e instancias del objeto obj. Puedes usar esta funcin para ver si
un objeto est cerca de una posicin.
elipse (slida) con las esquinas indicadas e instancias del objeto obj.
collision_line(x1,y1,x2,y2,obj,prec,notme) Comprueba si hay una colisin entre la lnea
que va de (x1,y1) a (x2,y2) e instancias del objeto obj. Esta funcin es muy poderosa. Puedes usarla para
comprobar si una instancia puede ver a otra chequeando si entre ellas hay una pared
Instancias
Las unidades bsicas del juego son las instancias. Durante el juego, puedes cambiar varios aspectos de estas
instancias. Tambin puedes crear o destruir instancias. Adems de las variables de movimiento y las de dibujo cada
object_index* ndice del objeto del cual sta es una instancia. No se puede cambiar.
id* La id nica de la instancia (>= 100000) (Al definir cuartos la id de la instancia bajo el puntero del ratn es
indicada). No se puede cambiar.
mask_index ndice de l sprite usado como mscara para las colisiones. Si indicas -1 la mscara ser igual al sprite
de la instancia.
slo hay una instancia de un objeto puedes acceder a ella usando el nombre del objeto pero normalmente necesitas
conocer la id de la instancia. Este identificador nico se puede usar en construcciones with y para identificar la
Observa que la asignacin de las instancias al instance_id[] cambia en cada step, as que debes actualizar este
valor. Por ejemplo: imagina que cada unidad en tu juego tiene un poder y quieres encontrar la ms poderosa de todas.
{
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 bucle maxid contendr la id de la instancia ms podersa (No destruyas instancias durante un bucle como
instance_find(obj,n) Devuelve la id de la instancia n+1 de tipo obj. obj puede ser un objeto o la
palabra clave all. Si no existe se devuelve el objeto especial noone. Recuerda que el orden de las instancias
cambia en cada step as que no puedes usar valores de steps anteriores.
instance_exists(obj) Devuelve si existe alguna instancia del objeto obj. obj puede ser un objeto, la id
de una instancia o la palabra clave all.
instance_number(obj) Devuelve el nmero de instancias de tipo obj. obj puede ser un objeto o la
palabra clave all.
instance_position(x,y,obj) Devuelve la id de la instancia de tipo obj en la posicin (x,y). Cuando hay
varias instancias en esa posicin se devuelve la id de la prtimera. 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 la id de la instancia de tipo obj que est ms cercana en ese
momento a (x,y). obj puede ser un objeto o la palabra clave all.
instance_furthest(x,y,obj) Devuelve la id de la instancia de tipo obj que est ms lejana en ese
momento a (x,y). obj puede ser un objeto o la palabra clave all.
instance_place(x,y,obj) Devuelve la id de la instancia de tipo obj encontrada cuando la instancia actual
se coloca en la posicin (x,y). obj puede ser un objeto o la palabra clave all. Si no existe se devuelve el objeto
especial noone.
position_destroy(x,y) Destruye toda las instancias cuyo sprite pasa por el punto (x,y).
position_change(x,y,obj,perf) Cambia todas las instancias en la posicin indicada a otras del tipo
obj. perf indica si se deben ejecutar los eventos de destruccin y creacin.
Desactivando instancias
Cuando creas un cuarto muy grande, por ejemplo en juegos de plataformas, con una vista (view) muy pequea,
muchas instancias se quedan fuera de la vista. Aunque no sean visibles, estas instancias siguen ejecutando sus
eventos. Tambin, al efectuar chequeos de colisin son tomadas en cuenta. Esto puede hacer que el juego se ralentice.
Para remediar esto, Game Maker contiene unas funciones para desactivar o activar instancias. Pero antes de usarlas
Cuando desactivas instancias es como si las eliminaras del juego. No son visibles, no ejecutan sus eventos,as que
para todas las funciones y acciones estas instancias ya no existen y no son tomadas en cuenta. As consigues que el
juego sea ms rpido. Pero ten cuidado, ya que esto puede generar errores en tu juego. Por ejemplo, al eliminar todas
las instancias de un objeto, las instancias que estn desactivadas no sern eliminadas! As, una llave que recoja el
jugador no podr abrir una puerta que est desactivada, por ejemplo.
El error ms crucial que puedes hacer es el de desactivar la instancia que se encarga de activar las dems instancias.
Para evitar esto algunas funciones permiten especificar si la instancia que desactiva a las dems debe ser desactivada o
no.
dentro de la regin indicada). Si inside es igual a false las instancias completamente fuera de la regin son
desactivadas. Si notme es true la instancia actual no es desactivada (normalmente es lo que se desea).
instance_activate_all() Activa todas las instancias del cuarto.
instance_activate_object(obj) Activa todas las instancias en el cuarto del objeto especificado.
Tambin puedes indicar all para activar todas las instancias o la id de una instancia concreta para activarla.
instance_activate_region(left,top,width,height,inside) Activa las instancias dentro
de la regin especificada. Si inside es false las instancias fuera de la regin son activadas.
Por ejemplo, para desactivar todas las instancias fuera de la vista y activar las que estn dentro podemos poner este
{
instance_activate_all();
instance_deactivate_region(view_xview[0],view_yview[0],
view_wview[0],view_hview[0],false,true);
}
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 comprobarse usando la variable 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
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:
Como debes saber, cada instancia tiene 12 diferentes alarmas que puedes configurar. Para cambiar los valores (u
alarm[0..11] Valor de la alarma indicada. (Nota: las alarmas solo se actualizan cuando el evento de alarma
para el objeto contiene acciones!)
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_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, por ejemplo 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,
Rooms
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();
}
}
room ndice del cuarto actual; puede cambiarse para ir a un cuarto diferente, pero mejor usa las rutinas listadas
abajo.
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).
Ten en cuenta que slo los datos bsicos del juego son guardados. Por ejemplo, si guardas cuando una cancin est
sonando, al cargar el juego la cancin no sonar desde ese momento. Los recursos editados tampoco son guardados, ni
Score
Otro aspecto importante de muchos juegos es el score (marcador), 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 se 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 del marcador, de las vidas o de la energa. Para juegos ms complicados mejor
Generando eventos
Como sabes, el Game Maker est 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 destruida. 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 11. 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_mouse_wheel_up
ev_mouse_wheel_down
ev_global_left_button
ev_global_right_button
ev_global_middle_button
ev_global_left_press
ev_global_right_press
ev_global_middle_press
ev_global_left_release
ev_global_right_release
ev_global_middle_release
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
ev_user8
ev_user9
ev_user10
ev_user11
ev_user12
ev_user13
ev_user14
ev_user15
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 funciona 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
event_user(numb) En los eventos other tambin puedes definir 16 eventos definidos por el usuario. Estos son
ejecutados solo si llamas esta funcin. Numb debe tener valores de 0 a 11.
event_inherited() Ejecuta el evento heredado. Esto slo funciona si la instancia tiene un objeto padre.
Puedes obtener informacin sobre el evento actualmente ejecutado usando las siguientes variables de slo lectura:
Aqu puedes ver algunas variables y funciones que se refieren a los errores.
Las siguientes funciones te permiten saber si ciertas variables existen, darles un valor o leerlo. En todas ellas el nombre
{
if variable_global_exists('ammunition')
global.ammunition += 1
else
global.ammunition = 0
}
Tambin puees usar estas funciones para pasar variables a los scripts usando referencias, utilizando el nombre de las
computacin. -2 y -1 son valores por debajo de lo normal, as que otros procesos tendrn prioridad sobre el juego. 0 es
el valor normal. +1 y +2 son valores de alta prioridad, que pueden hacer que el juego se ejecute ms suavemente y a
mayor velocidad. Otros procesos tendrn menos tiempo de computacin. +3 indica ejecucin en tiempo real: todo el
tiempo de computacin se pone en disposicin del juego. Esto puede crear problemas con otras aplicaciones que se
estn ejecutando en el ordenador. Adems, los eventos de teclado o pinchar en el botn para cerrar la ventana pueden
dejar de ser atendidos por Windows. As que slo debes usar este valor si realmente necesitas todo el procesamiento
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 chequear la posicin del ratn o si alguno de sus botones es presionado. Normalmente esto se
chequea en el evento step de algn objeto controlador y llevas a cabo las acciones adecuadas.
El teclado
Para interaccin con el teclado (keyboard) las siguientes funciones y variables existen:
keyboard_lastkey Cdigo de la ltima tecla presionada. Mira ms las constantes para los cdigos de tecla.
Puedes cambiarlo, p. ej, ponerlo a 0 si tu lo manipulaste.
keyboard_key Cdigo de tecla de la tecla presionada actualmente (mira mas abajo; 0 si no se presiona ninguna)
keyboard_lastchar ltimo carcter presionado (como string)
keyboard_string Cadena de caracteres de los ltimos 1024 caracteres tipeados. Esta cadena solo contendr
caracteres imprimibles en la pantalla. Tambin responde a la tecla de retroceso borrando el ltimo carcter.
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
Para chequear si una tecla o botn del ratn en particular han sido presionados puedes emplear las siguientes
ms. En este caso puedes emplear los cdigos vk_lshift, vk_lcontrol, vk_lalt, vk_rshift, vk_rcontrol y vk_ralt para
Las siguientes rutinas puedes ser usadas para manipular el estado del teclado:
keyboard_get_numlock()Indica si BloqNum est activada.
keyboard_set_numlock(on) Activa (on=true) o desactiva (on=false)
BloqNum.
keyboard_check_direct:
Por ejemplo, asumiendo que tienes un objeto que el usuario puede controlar con las teclas del cursor puedes colocar el
{
if (keyboard_check(vk_left)) x -= 4;
if (keyboard_check(vk_right)) x += 4;
if (keyboard_check(vk_up)) y -= 4;
if (keyboard_check(vk_down)) y += 4;
}
Claro, esto es mucho ms fcil si simplemente lo ponemos en los eventos del teclado.
keyboard_clear(key) Limpia el estado de la tecla mencionada en key. Esto significa que no generar
eventos de teclado hasta que se vuelva a presionar.
El ratn
Para chequear si un botn particular del ratn se presion puedes usar estas funciones. Esto es muy til cuando
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).
mouse_check_button_pressed(numb) Indica si el botn del ratn fue presionado desde el ultimo step.
mouse_check_button_released(numb) Indica si el botn del ratn se solt desde el ltimo step.
mouse_clear(button) limpia el estado del botn del Mouse. Esto significa que no se generarn mas eventos
del ratn hasta que se vuelva a presionar otra vez.
El 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.
view devuelve 1.
Una parte importante de un juego son los grficos. Game Maker normalmente toma el control de casi todo y en juegos
sencillos no hay necesidad de preocuparse. Pero a veces necesitas tomar mayor control sobre ellos. Para algunos
aspectos hay acciones, pero mediante cdigo puedes controlar muchos ms aspectos. Este captulo muestra todas las
variables y funciones disponibles para esto y da ms informacin sobre lo que est sucediendo realmente.
Imgenes y sprites
Cada objeto tiene un sprite asociado. Puede ser una imagen simple o compuesta por varias subimgenes. Para cada
instancia del objeto, el programa dibuja la imagen correspondiente en la pantalla, con su origen (definido en las
propiedades de sprite) en la posicin (x,y) de la instancia. Cuando hay varias subimgenes, sta se reproduce a travs
de las subimgenes para crear un efecto de animacin. Hay varias variables que afectan en el modo en que se dibuja la
imagen. Estas pueden sert utilizadas para cambiar los efectos. Cada instancia posee las siguientes variables:
visible : Si visible es cierto (1) la imagen se dibuja, en caso contrario no se dibuja. Las instancias invisibles aun
son activas y crean eventos de colisin; Simplemente no puedes verlas. Definir la visibilidad como falso es til para por
ejemplo objetos controladores (hazlos tambin no slidos para evitar eventos de colisin con ellos) o palancas ocultas.
sprite_index Este es el ndice del sprite actual para la instancia. Puedes cambiarlo para asignar un sprite
diferente a la instancia. Como valor puedes usar los nombres de los diferentes sprites que definas . Cambiando el
sprite_width* Indica el ancho del sprite. Este valor no puede ser cambiado, pero puedes utilizarlo.
sprite_height* Indica el alto del sprite. Este valor no puede ser cambiado, pero puedes utilizarlo.
sprite_xoffset* Indica el offset horizontal del sprite, como esta definido en las propiedades del sprite. Este
valor no puede ser cambiado, pero puedes utilizarlo.
sprite_yoffset* Indica el offset horizontal del sprite, como esta definido en las propiedades del sprite. Este
valor no puede ser cambiado, pero puedes utilizarlo.
image_number* El numero de subimgenes del sprite actual de la instancia (no puede ser cambiado).
image_index Cuando la imagen tiene varias subimgenes, el programa las recorre cclicamente. Esta variable
indica la subimagen dibujada actualmente (estn numeradas desde 0). Puedes cambiar la imagen actual cambiando
esta variable. EL programa continuar reproduciendo el ciclo de subimgenes, pero comenzando desde el nuevo ndice.
(El valor puede ser fraccional. En este caso, se redondea siempre hacia abajo para obtener el ndice de la subimagen
dibujada.
image_speed La velocidad con que se reproduce el ciclo de subimgenes. Un valor de 1 indica que en cada paso
se muestra la siguiente subimagen . Valores menores, reducirn la velocidad de visualizacin de la animacin,
dibujando la misma subimagen varias veces. Valores mayores harn que se salten subimgenes para aumentar la
velocidad de la animacin. A veces quieres que una subimagen en particular sea visible y no quieres que el programa
muestre todas las dems subimgenes. Puedes conseguir esto definiendo la velocidad igual a 0 y eligiendo la
subimagen correcta. Por ejemplo, asumamos que tenemos un objeto que puede rotar y has creado un sprite que tiene
varias subimgenes para las diferentes orientaciones (en sentido contrario a las agujas del reloj) Puedes introducir el
{
image_index = direction * image_number/360;
image_speed = 0;
}
depth Normalmente las imgenes son dibujadas en el orden en que se crean las instancias. Puedes cambiar este
orden cambiando la profundidad de la imagen. El valor por defecto es 0, hasta que le introduzcas un valor diferente en
las propiedades del objeto. Cuanto mayor es el valor ms al fondo se dibujar la instancia. (Tambin puedes utilizar
valores negativos.) Las instancias con mayor profundidad permanecern debajo de las instancias con menor
profundidad. Definiendo la profundidad garantizamos que las instancias son dibujadas en el orden que queremos. (Ej. El
avin sobre la nube). Las instancias de fondo tendrn una alta profundidad (valor positivo) y las imgenes frontales
image_xscale Un valor de escala para hacer mayores o menores las imgenes. Un valor de 1 indica el tamao
normal. Debes separar la escala horizontal xscale y la vertical yscale. Cambiando la escala tambin cambian el ancho y
el alto de la imagen e influye en los eventos de collisin, como podras esperar. Cambiar la escala puede ser utilizado
para dar un efecto 3-D. Puedes utilizar un valor de -1 para invertir horizontalmente la imagen.
image_yscale Escala vertical yscale. 1 no modifica el tamao. Puedes utilizar un valor de -1 para invertir
verticalmente la imagen.
image_angle El ngulo con que se rota la imagen. Se especifica en grados en sentido contrario a las agujas del
reloj. Un valor de 0 indica que no hay rotacin. Esta variable solo puede modificarse en la versin registrada!
image_alpha El valor de transparencia (alpha) que se aplica al dibujar la imagen. Un valor de 1 es la opacidad
normal; un valor de 0 es totalmente transparente.
image_blend Teido de color que se aplica al dibujar la imagen. Un valor de color blanco (c_white) es el que se
utiliza por defecto. Cuando especificas un color diferente, la imagen se tie de dicho color. Esto puede ser utilizado para
colorear el personaje en tiempo de ejecucin. Esta variable solo puede modificarse en la versin registrada!
bbox_left* Lado izquierdo de la caja de contorno utilizada por la imagen de la instancia (Se toma en cuenta el
escalado).
Fondos
Cada room (cuarto) puede tener hasta 8 fondos. As mismo, tambin puede tener un color de fondo. Todos los aspecto
de estos fondos se pueden cambiar con cdigo usando las siguientes variables (observa que algunas son vectores con
background_foreground[0..7] Indica si el fondo est en primer plano (se dibujar encima de todo lo
dems, tapando todo lo que quede por debajo).
background_yscale[0..7] Factor de escalado vertical del fondo: un nmero entre 0 y 1 har la imagen
ms pequea y un nmero mayor que 1 la har ms grande. (Debe ser un valor positivo)
background_hspeed[0..7] Velocidad horizontal de scrolling del fondo, en pxeles por step. El scrolling es el
movimiento del fondo, por lo tanto esto se refiere al movimiento horizontal del fondo.
background_vspeed[0..7] Velocidad vertical de scrolling del fondo, en pxeles por step. El scrolling es el
movimiento del fondo, por lo tanto esto se refiere al movimiento vertical del fondo.
background_blend[0..7] Color de teido usado al dibujar el fondo. El valor por defecto es c_white. Esta
variable slo se puede usar en la versin registrada!
transparentes).
Dibujando sprites y fondos
Normalmente los objetos tienen un sprite asociado que se dibuja en la pantalla. Pero tambin puedes usar el evento
draw. para dibujar otras cosas. Esta seccin y las dos siguientes te darn informacin sobre este aspecto. Primero de
todo, hay un grupo de funciones que sirven para dibujar sprites y fondos de distintas maneras. Estas funciones te dan
un gran control sobre la apariencia grfica del juego y te permiten hacer cosas como dibujar slo un trozo de un fondo,
rotar un sprite...
con ndice sprite de forma que llene la regin con esquina superior-izquierda en (x,y), anchura w y altura h.
draw_sprite_tiled(sprite,subimg,x,y) Dibuja el sprite repitindolo horizontal y verticalmente de
forma que llene toda la pantalla. (x,y) es la posicin donde se dibuja una de las copias del sprite.
left y top (coordenadas de la esquina superior-izquierda) y width y height (anchura y altura del trozo que
queremos dibujar).
draw_background(back,x,y) Dibuja el fondo en la posicin (x,y), sin teirlo de ningn color y sin
transparencia.
Las funciones siguientes son versiones extendidas de las funciones anteriores. Estas funciones slo estn
draw_sprite_ext(sprite,subimg,x,y,xscale,yscale,rot,color,alpha) Dibuja el
sprite escalado con factores xscale (horizontal) e yscale (vertical) y rotado rot grados en sentido
antihorario. color indica el color con el que queremos teir el sprite (usa el color blanco c_white si no quieres teir
el sprite de ningn color) y alpha indica el factor de transparencia. Un valor igual a 0 hace la imagen totalmente
transparente y un valor igual a 1 la hace totalmente opaca. Con valores intermedios conseguirs que la imagen sea
parcialmente transparente. Con esta funcin se pueden crear efectos muy espectaculares como explosiones semi-
transparentes.
draw_sprite_part_ext(sprite,subimg,left,top,width,height,x,y,xscale,ys
cale,color,alpha) Dibuja la parte indicada del sprite con factores de escala, color de teido y factor de
transparencia.
draw_sprite_general(sprite,subimg,left,top,width,height,x,y,xscale,ysc
ale,rot,c1,c2,c3,c4,alpha) La funcin ms general para dibujar sprites. Dibuja la parte indicada de la
subimagen subimg (-1 = subimagen actual) del sprite con ndice sprite situando su esquina superior-izquierda en la
posicin (x,y) y con factores de escala, ngulo de rotacin, un color de teido para cada una de las 4 esquinas del
escalado, rotado, teido del color especificado (usa c_white si no quieres teirlo) y con factor de transparencia
alpha (0-1).
draw_background_stretched_ext(back,x,y,w,h,color,alpha) Dibuja el fondo escalado
de forma que ocupe la regin indicada con color de teido y factor de transparencia.
draw_background_part_ext(back,left,top,width,height,x,y,xscale,yscale,
color,alpha) Dibuja la parte indicada del fondo situando su esquina superior-izquierda en la posicin (x,y) con
factores de escala, color de teido y factor de transparencia.
draw_background_general(back,left,top,width,height,x,y,xscale,yscale,r
ot,c1,c2,c3,c4,alpha) La funcin ms general para dibujar fondos. Dibuja la parte indicada del fondo
situando su esquina superior-izquierda en la posicin (x,y) con factores de escala, ngulo de rotacin, un color de
teido para cada una de las cuatro esquinas (en el orden arriba-izquierda, arriba-derecha, abajo-derecha y abajo-
izquierda) y un factor de transparencia. Observa que el sprite se rotar sobre su esquina superior-izquierda del trozo
Dibujando formas
Game Maker dispone de una amplia coleccin de funciones para dibujar diferentes formas. Tambin hay otras funciones
para dibujar texto (consulta el captulo siguiente). Estas funciones de dibujo slo se pueden usar en el evento draw ya
que no tienen sentido si se colocan en otro evento. Debes tener en cuenta que las colisiones entre las instancias se
determinan segn sus sprites y sus mscaras de colisin y no segn lo que cada instancia dibuja en la pantalla. Las
draw_arrow(x1,y1,x2,y2,size) Dibuja una flecha desde (x1,y1) hasta (x2,y2). size indica el tamao
de la flecha en pxeles.
draw_healthbar(x1,y1,x2,y2,amount,backcol,mincol,maxcol,direction,show
back,showborder) Con esta funcin puedes dibujar una barra de vida (o una barra que indique cualquier otra
cosa como poder, magia,). Los parmetros x1, y1, x2 e y2 indican el rea total de la barra. amount indica el
porcentaje de la barra que debe estar relleno (debe estar entre 0 y 100). backcol es el color de fondo de la barra.
mincol y maxcol indican el color cuando el porcentaje de llenado (parmetro amount) es 0 y 100
respectivamente. Para un porcentaje intermedio el color se interpola entre estos dos. As puedes crear fcilmente una
barra que vaya de verde a rojo, por ejemplo. direction es la direccin en la que la barra se dibuja: 0 significa que
la barra est fijada a la izquierda, 1 a la derecha, 2 arriba y 3 abajo. Finalmente, showback indica si debe mostrarse
una caja de fondo y showborder si la caja de fondo y la barra deben tener un borde negro.
Muchas de las funciones anteriores utilizan los colores y transparencia generales de dibujo que pueden ser cambiados
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
Sin embargo, tambin puedes usar las funciones siguientes para crear tus propios colores:
screen_save(fname) Salva una imagen bmp de la pantalla en el archive especificado. til para crear
screenshots.
Fuentes y texto
A veces necesitas dibujar texto. Para ello, primero debes indicar la fuente que quieres usar. Las fuentes se pueden
definir creando un recurso de fuente (directamente en Game Maker o usando las funciones de modificacin de
recursos). Para dibujar texto disponemos de varias funciones distintas. En todas ellas debes indicar el texto a ser
dibujado y la posicin del mismo. Adems, existen dos funciones para definir la alineacin del texto en horizontal y
draw_set_font(font) Indica la fuente que debe usarse para dibujar texto. Puedes indicar el valor -1 para
usar la fuente por defecto (Arial 12).
draw_set_halign(halign) Indica la alineacin horizontal del texto. Debes indicar uno de los siguientes
valores:
fa_left izquierda
fa_center centrada
fa_right derecha
draw_set_valign(valign) Indica la alineacin vertical del texto. Debes indicar uno de los siguientes
valores:
fa_top arriba
fa_middle centrada
fa_bottom abajo
como caracteres de salto de lnea. De esta forma puedes dibujar textos de varias lneas (Usa \# para dibujar el smbolo
#).
string_width(string) Anchura que el texto indicado ocupara si se dibujara con la fuente actual usando la
funcin draw_text(). Puedes usar esta funcin para posicionar los grficos con precisin.
string_height(string) Altura que el texto indicado ocupara si se dibujara con la fuente actual usando la
funcin draw_text(). Puedes usar esta funcin para posicionar los grficos con precisin.
string_width_ext(string,sep,w) Anchura que el texto indicado ocupara si se dibujara con la fuente
actual usando la funcin draw_text_ext(). Puedes usar esta funcin para posicionar los grficos con precisin.
string_height_ext(string,sep,w) Altura que el texto indicado ocupara si se dibujara con la fuente
actual usando la funcin draw_text_ext(). Puedes usar esta funcin para posicionar los grficos con precisin.
Las siguientes funciones te permiten dibujar texto escalado o rotado e incluso aplicarle gradientes de color. Estas
En los captulos anteriores hemos descrito las funciones bsicas de dibujo. En este captulo veremos funciones ms
avanzadas que te otorgan muchas ms posibilidades para crear los grficos de tus juegos. Primero, hay unas funciones
que sirven para dibujar formas coloreadas con gradientes o efectos de difuminado. Despus veremos las funciones que
sirven para dibujar polgonos bsicos y por ltimo veremos la forma de dibujar polgonos texturizados.
Las siguientes funciones son versiones extendidas de las funciones de dibujo bsicas. Todas ellas admiten parmetros
para el color, por lo que ninguna de estas funciones usar el color general de dibujo.
e inferior-izquierdo respectivamente. outline indica si slo debe dibujarse el contorno del rectngulo (true) o si
ste debe estar relleno (false).
draw_triangle_color(x1,y1,x2,y2,x3,y3,col1,col2,col3,outline) Dibuja un
tringulo. Los tres colores son los colores en los vrtices del tringulo (el color se interpola en las dems zonas entre
estos tres colores). outline indica si slo debe dibujarse el contorno del tringulo (true) o si ste debe estar relleno
(false).
Dibujando superficies
Esta funcionalidad slo est disponible en la versin registrada de Game Maker
En algunas situaciones puede que no quieras dibujar directamente en la pantalla sino en un lienzo que ms tarde
puedas usar para dibujar otras cosas. Por ejemplo, puedes querer que el usuario dibuje en la pantalla. En vez de dejar
que el usuario dibuje directamente en la pantalla (lo que no funcionara, ya que la pantalla se refresca en cada step)
puedes hacer que dibuje en un lienzo a parte y copiar este lienzo a la pantalla en cada paso. Tambin podras querer
usar una textura que cambie con el tiempo, crear un efecto de transiciones entre cuartos, efectos de iluminacin
Las superficies hacen posibles cosas como stas. Las superficies son muy sencillas de usar: primero creas una
superficie indicando su tamao. Luego indicas que vas a dibujar sobre la superficie. Desde este momento, todas las
funciones de dibujo se aplicarn a la superficie. Cuando termines de dibujar, indicas que ya no vas a dibujar ms en la
superficie. Ya tienes lista la superficie, ahora puedes dibujarla directamente en la pantalla, usarla como
texturaConsulta el final del captulo para conocer algunos detalles con los que debes tener cuidado al trabajar con
superficies.
surface_create(w,h) Crea una superficie con la anchura y altura indicadas. La funcin devuelve la id de la
superficie que debe ser usada en las dems funciones. Observa que la superficie no se limpia (es decir, que no se
pinta toda ella de un mismo color). Para esto, debes indicar que vas a dibujar en la superficie y llamar a la funcin
surface_reset_target() Vuelve a fijar la pantalla como objetivo de dibujo. Es decir, las funciones de
dibujo que se llamen a partir de ahora funcionarn normalmente No olvides llamar a esta funcin cuando termines de
surface_getpixel(id,x,y) Devuelve el color del pxel en la posicin (x,y) de la superficie. Esta funcin no
es muy rpida as que sala con moderacin.
surface_save(id,fname) Guarda una imagen bmp de la superficie, creando para ello el archivo con el
nombre indicado. Se puede usar para crear screenshots, por ejemplo.
surface_save_part(id,fname,x,y,w,h) Igual que la funcin anterior, pero esta vez slo se copiar
la parte de la superficie que indiques.
draw_surface_tiled(id,x,y) Dibuja la superficie en la posicin (x,y) y la repite una y otra vez para que
ocupe todo el cuarto.
draw_surface_part_ext(id,left,top,width,height,x,y,xscale,yscale,color
,alpha) Dibuja la parte indicada de la superficie en la posicin (x,y) pero con factores de escala, transparencia y
color.
draw_surface_general(id,left,top,width,height,x,y,xscale,yscale,rot,c1
,c2,c3,c4,alpha) La funcin ms general de dibujo. Dibuja la parte indicada de la superficie con su origen en
la posicin (x,y), con factores de escala, transparencia y rotada rot grados en sentido antihorario. Adems debes
indicar 4 colores para cada una de las esquinas de la superficie en este orden: esquina superior izquierda, esquina
Observa que no hay funciones para copiar parte de la pantalla a una superficie. Esto es imposible debido a la diferencia
de formato entre la pantalla y las superficies. Si necesitaras usar esto puedes indicar la superficie como objetivo de
dibujo y dibujar todo el room. Luego usando las funciones para copiar superficies puedes copiar partes de ella a la
pantalla.
Tambin puedes crear sprites y fondos de superficies. Esto se explica con ms detalle en la seccin de modificacin de
recursos.
Nunca debes cambiar el objetivo de dibujo mientras dibujas ests dibujando sobre la pantalla. Es decir, nunca
Las superficies no funcionan correctamente en modo 3D. Puedes usarlas mientras no ests en modo 3D
(llamando a la funcin d3d_end() antes de usarlas) pero una vez que empieces a usar el modo 3D de nuevo
Por motivos de velocidad, las superficies se mantienen en la memoria de video constantemente. Como
resultado de esto, podras perder las superficies al cambiar la resolucin de la pantalla o cuando salte el
salvapantallas.
Tiles
Como ya debes saber, puedes aadir tiles a los cuartos. Una tile es una parte de un fondo. En realidad, una tile es
simplemente una imagen visible: no reaccionan ante eventos y no generan colisiones. Como resultado de esto, las tiles
funcionan mucho ms rpido que los objetos. As pues, todo lo que no sufra colisiones o no reaccione ante eventos
funcionar mucho mejor si lo haces con tiles. Incluso a veces es mejor utilizar un tile para mostrar los grficos y poner
por debajo un objeto invisible que se encargue de las colisiones. Para definir un tile necesitas un fondo. Sobre este
fondo indicas la esquina superior (top) izquierda (left), la anchura (width) y la altura (height) de un rectngulo. La
parte del fondo que queda dentro de este rectngulo pasa a ser una tile.
Puedes aadir tiles al disear el room, pero tambin puedes hacerlo mientras el juego se ejecuta. Puedes cambiar su
posicin, escalarlas o hacerlas transparentes. Una tile tiene las propiedades siguientes:
Para cambiar las propiedades de una tile debes conocer su id. Cuando creas tiles desde el editor de rooms la id se
muestra en la barra inferior de informacin. Pero tambin existen funciones para conocer la id de una tile en una
posicin particular.
funciones.
Las funciones siguientes sirven para manipular las propiedades de las tiles:
Las funciones siguientes manejan capas de tiles, es decir, grupos de tiles que tienen la misma profundidad:
El display
El display es todo el rea del monitor. Tiene varias caractersticas como el tamao (tpicamente 1024x768
1280x1024), la profundidad de color (que es el nmero de bits que se utilizan para representar 1 pxel) y suele ser de
16 bits (color de alta densidad) 32 bits (color verdadero) y la frecuencia de refresco, que es el nmero de veces por
segundo que se refresca el display, es decir, cuntas veces por segundo se vuelven a dibujar los pxeles en la pantalla
(tpicamente entre 60 y 120). Estos parmetros se pueden cambiar desde las propiedades de la pantalla en Windows.
Pero para algunos juegos, sobre todo los que se ejecuten en pantalla completa, es importante poder controlar estos
aspectos. Todos ellos se pueden inicializar desde la pestaa Game Settings. Para cambiar estos parmetros durante el
juego Game Maker dispone de un grupo de funciones que veremos a continuacin. Debes tener en cuenta que al
cambiar estos parmetros el sistema necesitar un poco de tiempo para volver a ajustarlo todo. Las funciones para
mismo valor para lograr animaciones fluidas de 60 frames por segundo. La funcin devuelve true si los cambios se
no quieras cambiar utiliza -1. La funcin devuelve true si los cambios se aplicaron con xito y false en caso contrario.
permitidos. La funcin no aplica los valores al display, slo chequea si son vlidos. Para los valores que no quieras
cambiar usa el valor -1. La funcin devuelve true si los cambios se pueden aplicar y false en caso contrario.
display_reset() Resetea las caractersticas del display a los originales, es decir, a los que estaban presentes
cuando se inici el programa.
A veces es til poder conocer la posicin del puntero en el display o poder cambiarla. Para ello se usan las funciones
siguientes:
La ventana
El juego se ejecuta en una ventana. Esta ventana tiene varias propiedades como si tiene borde, si ocupa toda la
pantalla...Normalmente estos valores se fijan desde la opcin Game Settings. Pero tambin puedes cambiarlos
room en lugar de dejar que Game Maker lo haga automticamente. El ttulo de la ventana slo es visible cuando sta
cr_default
cr_none
cr_arrow
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 ejemplo, para hacer que no se vea el cursor o puntero usa window_set_cursor(cr_none).
para que ocupe toda la ventana o una parte concreta. Si usamos el valor 1 el cuarto no ser escalado. Si usamos el
valor 0 el cuarto se escalar para ocupar toda la ventana. Si usas un valor negativo el cuarto ser escalado al mximo
valor dentro de la ventana que le permita seguir conservando su relacin de aspecto entre altura y anchura. El segundo
parmetro, adaptwindow, indica si el tamao de la ventana debe adaptarse al cuarto si ste, una vez escalado, no
entra por completo dentro de la misma. Esto slo suele ser til cuando el primer parmetro (el que indica el escalado
La ventana tiene una posicin en la pantalla y un tamao. Cuando hablamos de posicin y tamao siempre nos
referimos a la ventana sin los bordes. Puedes cambiar estos valores aunque raramente querrs utilizarlo desde el
juego. Normalmente, se determinan automticamente o el jugador escoge los que le interesan. Las funciones
siguientes te permiten cambiar estos aspectos de las ventanas. Observa que estas funciones slo funcionarn si la
ventana no est a pantalla completa. Si la ventana est a pantalla completa los cambios no se aplicarn hasta que la
l.
window_set_rectangle(x,y,w,h) Indica la nueva posicin y medidas de la ventana (es como usar las
dos funciones anteriores a la vez).
automticamente.
En algunas ocasiones puede que quieras conocer la posicin del ratn respecto a la ventana (normalmente se usa la
posicin del ratn respecto a un cuarto o a una vista). Las siguientes funciones sirven para esto:
Vistas
Como ya deberas saber puedes definir hasta 8 vistas diferentes al disear un cuarto. Una vista se define por su rea en
el cuarto y por su puerto o viewport en la pantalla (la regin de dibujo dentro de la ventana). Usando vistas puedes
mostrar diferentes partes del cuarto en diferentes lugares de la pantalla. Adems, puedes asegurar que un objeto
Puedes controlar las vistas con cdigo. Puedes hacerlas visibles o invisibles, cambiar su posicin o tamao dentro de la
regin de dibujo o en el cuarto (lo cual es muy til cuando no indicas ningn objeto que deba ser seguido por la vista).
Puedes cambiar el tamao de los bordes horizontal y vertical alrededor del objeto a ser seguido. Si el objeto que
quieres que sea seguido cambia a otro tipo de objeto durante el juego (por ejemplo, si acumula mucha experiencia y
evoluciona en un personaje ms poderoso) puede que las vistas siguientes no lo sigan correctamente. Para solucionar
esto, puedes indicar este cdigo en el evento de creacin de todos los objetos del personaje (en este ejemplo se
{
view_object[0] = object_index;
}
Las siguientes variables actan sobre las propiedades de las vistas. Todas, excepto las dos primeras, son vectores con
8 elementos: el primer elemento (0) indica la primera vista y el ltimo elemento (7) la ltima.
Observa que el tamao de la imagen en la pantalla se calcula a partir de las vistas visible al comienzo del cuarto. Si
cambias las vistas durante el juego puede que ya no entren correctamente en la pantalla. Para solucionar esto, puedes
ella. La ventana siempre se adaptar si usas escalado fijo (Consulta la funcin window_set_region_scale() en el
captulo La ventana).
A veces necesitars conocer la posicin del ratn. Normalmente puedes hacer esto con las variables mouse_x y
mouse_y. Cuando hay muchas vistas, estas variables dan la posicin del ratn respecto a la vista en la que el ratn se
encuentra. Pero puede ser que en alguna ocasin necesites conocer la posicin del ratn respecto a una vista concreta,
incluso cuando el ratn se encuentre fuera de esa vista. Para hacer esto, puedes usar las siguientes funciones:
window_views_mouse_set(x,y) Indica la posicin del ratn respecto a la primera vista que es visible.
Transiciones
Al moverse de una room a otra puedes seleccionar una transicin. Tambin puedes seleccionar la transicin que se
utilizar en el frame siguiente sin tener que cambiar de cuarto. Para esto usamos la variable transition_kind.
Asignndole un valor entre 1 y 13 se usar la transicin correspondiente. Si usamos un valor igual a 0 significa que no
se aplicar ninguna transicin. La transicin slo se aplicar la prxima vez que se dibuje un frame.
Observa que es muy sencillo crear tus propias transiciones. Por ejemplo, para crear un efecto de oscurecimiento puedes
dibujar un rectngulo negro que tape toda la pantalla y hacer que su factor de transparencia vaya aumentando poco a
poco. O puedes cambiar la posicin y el tamao de una vista para mover el cuarto fuera de la zona visible. Utilizando
Redibujando la pantalla
Normalmente al final de cada paso del juego (step) el cuarto se dibuja en la pantalla. Pero en algunas ocasiones puede
que quieras dibujar el cuarto en otro momento. Esto ocurre cuando tu programa toma el control, por ejemplo: antes de
que el programa se congele durante un largo perodo es recomendable dibujar el cuarto. O cuando el juego muestra un
mensaje y espera a que el jugador presione un tecla para continuar es necesario dibujar el cuarto en medio de esta
existe una imagen donde se dibuja todo. Esta imagen no es visible en la pantalla. Slo al final de un paso del juego,
cuando se ha dibujado todo, la imagen de la pantalla se reemplaza por esta imagen interna (esta tcnica se conoce
como double buffering). La primera funcin scrren_redraw() dibuja la imagen interna y luego refresca la imagen de
la pantalla. La segunda funcin screen_refresh() slo refresca la imagen de la pantalla, pero no actualiza la imagen
interna.
Ahora deberas entender por qu no puedes usar las acciones o funciones de dibujo en otros eventos a parte de los
eventos de dibujo. Si lo haces as, dibujaras elementos en la imagen interna pero no en la pantalla. Cuando se ejecuta
el evento draw, primero se dibuja el fondo del cuarto, tapando y borrando todo lo que habas dibujado en la imagen
interna. Pero cuando usas screen_refresh() despus de dibujar algo, la imagen se volver visible en la pantalla. Por
ejemplo, podemos crear un trozo de cdigo que dibuje un texto en la pantalla, llame a la funcin de refresco y espere a
{
draw_text(screen_width/2,100,'Pulsa cualquier tecla para
continuar');
screen_refresh();
keyboard_wait();
}
Observa que al dibujar en un evento distinto del evento draw slo puedes dibujar en la imagen interna, nunca en una
vista! As que las coordenadas que usas sern las mismas que si no hubiera vistas. Ten cuidado al usar esta tcnica:
asegrate de que has entendido bien como funciona y ten en cuenta que el refresco de la pantalla tarda un poco de
tiempo.
Cuando ests dibujando el propio cuarto puede ser til no dejar que se dibuje automticamente. Por ejemplo, puedes
querer que el cuarto slo se dibuje cada 5 pasos. Para ello puedes usar la funcin siguiente:
Finalmente, hay una funcin que te permite sincronizar el dibujo con la frecuencia de refresco del monitor:
Tambin puedes obligar a que el programa espere hasta la prxima sincronizacin vertical:
screen_wait_vsync() Espera hasta la siguiente sincronizacin vertical del monitor.
Msica y sonido
Actualmente, el sonido juega un papel crucial en los videojuegos de computadora. Estos deben ser agregados al juego
en forma de recursos de sonido, pero asegrate de que los nombres que uses sean nombres de variable vlidos.
Como ya habrs ledo, puedes indicar cuatro diferentes tipos de sonido: normal, msica de fondo, 3D, y sonidos que
Los sonidos normales son usados para efectos de sonido y por lo general, son archivos WAV. Puedes reproducir muchos
del tipo NORMAL a la vez (incluso puedes reproducir mltiples instancias del mismo sonido a la vez) y se caracterizan
El sonido de fondo comnmente consiste en archivos MIDI pero algunas veces tambin pueden usarse WAV y a estos
tambin se les puede aplicar efectos de sonido. La nica diferencia que tienen con los sonidos NORMALES, es que los de
fondo solo pueden reproducirse uno a la vez. Si reproduces un sonido, el que previamente se haba estado
reproduciendo es parado.
El uso y caractersticas del sonido 3D son descritos ms adelante, en el subcaptulo Sonidos 3D. Son sonidos mono
(WAV o MIDI).
Finalmente, si quieres usar otro tipo de sonido, en partculas mp3, estos no pueden ser reproducidos por DirectX. En su
lugar, el reproductor multimedia normal debe ser usado para esto, lo cual lo hace mucho ms limitado, ya que solo
puedes reproducir un sonido a la vez, no se le pueden aplicar efectos (ni siquiera cambio de volumen) y el tiempo (p.e.
los sonidos rebobinados son de calidad pobre). Tambin puede haber retardos en reproducirlos. Se recomienda
altamente no usar este tipo de media, ya que hay algunas computadoras que probablemente no estn capacitadas para
reproducirlos).
Puedes encontrar informacin sobre las funciones de audio en las secciones siguientes:
Existen cinco funciones bsicas relacionadas con sonido: 2 para reproducir un sonido, una para ver si un sonido se est
reproduciendo, y dos ms para parar el sonido. La mayora necesita el ndice del sonido como argumento. El nombre
del sonido representa su ndice, pero tambin puedes almacenar el ndice en una variable, y usarla como argumento.
sound_play(index) Reproduce el sonido indicado una vez. Si el sonido es msica de fondo, la actual es
parada.
sound_stop(index) Para el sonido indicado. Si hay varios sonidos con este ndice reproducindose
simultneamente, todos son parados.
Despus de llamar la funcin de reproducir un sonido, no llega a los altavoces inmediatamente, lo que quiere decir que
mientras esto no suceda, esta funcin devolver false. Parecido es si cuando el sonido es parado y lo escuchas por un
Es posible usar efectos de sonido. en lo particular puedes cambiar el volumen y pan (si el sonido viene del altavoz
izquierdo o derecho). En estos casos el volumen solamente puede ser reducido. Estas funciones no trabajan con
para entradas).
corresponden a un tempo ms rpido, menores a un tempo ms lento. Debe oscilar entre 0.01 y 100.
A dems de los archivos MIDI y WAV (y mp3) existe un cuarto tipo de archivo que puede ser reproducido: archivos
direct music. Tienen la extensin .sgt. Dichos archivos frecuentemente se refieren a otros archivos describiendo p.e.
banda o gnero. Para encontrar estos archivos, el sistema de sonido debe saber donde se localizan. Con este propsito,
puedes usar las siguientes funciones para estableces el directorio de bsqueda de archivos. NOTA: Debes agregar los
Efectos de sonido
Los efectos de sonido pueden ser usados para cambiar la manera en que los sonidos normales y msica de fondo,
suena. Ten en cuenta que los efectos de sonidos solo aplican en archivos WAV y MIDI, no a los mp3. Esta seccin
describe las funciones que existen para usar y cambiar efectos de sonido. Ten tambin en cuenta que para poder usar
estas funciones necesitas una buena comprensin de cmo el sonido y los sintetizadores trabajan. No se han agregado
explicaciones de los diferentes parmetros que se dan. Busca en la web o en libros para ms informacin.
Para aplicar un efecto de sonido a un sonido en particular, puedes indicarlo cuando definas el sonido como recurso o
se_none
se_chorus
se_echo
se_flanger
se_gargle
se_reverb
se_compressor
se_equalizer
Puedes establecer una combinacin de efectos, sumando los valores. Entonces, por ejemplo, puedes usar:
sound_effect_set(snd,se_echo+se_reverb);
para obtener una combinacin de los efectos echo y reverb.
Todos los efectos tienen distintas configuraciones, una vez que el efecto ha sido aplicado en un sonido. El orden en esto
es crucial. Primero aplicas el efecto al sonido y despus estableces sus parmetros. Una vez que reapliques los efectos
al sonido, la configuracin se borra y necesitas establecerla de nuevo. Ntese que todos los parmetros deben oscilar
en un rango en particular, segn se indique a continuacin. Las siguientes funciones existen para cambiar la
*Al final de cada parmetro, entre parntesis est el rango que se necesita usar p.e. (0 a 100,pred.50)
pred.=predeterminado
sound_effect_chorus(snd,wetdry,depth,feedback,frequency,wave,delay,pha
se) Establece los parmetros para el efecto de chorus al sonido indicado. Los siguientes parmetros son requeridos:
WETDRY Radio de la seal wet (procesada) a la seal dry (no procesada).(0 a 100,pred.50)
DEPTH Porcentaje con el cual el tiempo de espera es modulado por el oscilador de baja frecuencia, en cientos por punto
de porcentaje. (0 a 100,pred.25)
FEEDBACK Porcentaje de seal de salida para respaldar la entrada del sonido. (-99 a 100,pred.0)
DELAY Tiempo (nmero) en milisegundos que la entrada debe esperar antes de ser reproducida de nuevo (0 a
20,pred.0)
WETDRY Radio de la seal wet (procesada) a la seal dry (no procesada).(0 a 100,pred.50)
FEEDBACK .Porcentaje de seal de salida para respaldar la entrada del sonido. (-99 a 100,pred.0)
PANDELAY. Indica si el LEFTDELAY y RIGHTDELAY deben intercambiarse con cada echo que sucede.(0 y 1,pred.0)
sound_effect_flanger(snd,wetdry,depth,feedback,frequency,wave,delay,ph
ase) Establece los parmetros para el efecto de flanger al sonido indicado. Los siguientes parmetros son requeridos:
WETDRY Radio de la seal wet (procesada) a la seal dry (no procesada).(0 a 100,pred.50)
DEPTH Porcentaje con el cual el tiempo de espera es modulado por el oscilador de baja frecuencia, en cientos por punto
de porcentaje. (0 a 100,pred.25)
FEEDBACK Porcentaje de seal de salida para respaldar la entrada del sonido. (-99 a 100,pred.0)
DELAY Tiempo (nmero) en milisegundos que la entrada debe esperar antes de ser reproducida de nuevo (0 a
20,pred.0)
sound_effect_compressor(snd,gain,attack,release,threshold,ratio,delay)
Establece los parmetros para el efecto de compressor al sonido indicado. Los siguientes parmetros son requeridos:
RELEASE Velocidad a la que la entrada es parada despus de que la entrada llegue debajo del umbral.(50 a
3000,pred.50)
RATIO Radio de frecuencia (0.001 a 0.999,pred.0.001)
DELAY Tiempo (nmero) en milisegundos que la entrada debe esperar antes de ser reproducida de nuevo (0 a
20,pred.0)
Sonido 3D
Sonido 3D se refiera al sonido que tiene una posicin (y velocidad) con respecto al oyente. A pesar de que es ms
prominente usarlo en juegos 3D, tambin puede ser efectivamente aplicado en juegos 2D. La idea es que el sonido
tenga una posicin en el espacio. En todas las funciones, se asume que el oyente est en una posicin (0,0,0). El
sistema calcula como el receptor estara oyendo el sonido, y lo adapta acorde a esto. Este efecto es especialmente
bueno cuando tienes un buen equipo de sonido. De cualquier manera, esto tambin funciona en altavoces pequeos.
Adems de una posicin, el sonido tambin puede tener una velocidad. Esto lleva al muy conocido efecto Doppler, que
estn correctamente modelado. Finalmente el sonido puede tener una orientacin y, una vez ms, el sonido es
Game Maker cuenta con la modalidad de sonido 3D, a travs de las funciones que se indican abajo, pero solo funcionan
con recursos de sonido que fueron indicados como 3D. (La desventaja es que los sonidos 3D son mono, no estreo).
a la posicin del oyente en el espacio. Valores en el eje x incrementan de izquierda a derecha, en el eje y de arriba
hacia abajo, y en el eje z de cerca a lejos. Estos valores son medidos en metros. El volumen con el que el sonido se
debe or depende en esta medida, de la misma manera a como ocurre en el mundo real.
indicado en el espacio. Por favor note que estableciendo la velocidad no significa que la posicin cambie. La velocidad
es usada slo para calcular efectos doppler. Entonces, si quieres mover un sonido debes cambiar tu mismo la posicin
del sonido.
cual el sonido est en su mxima amplitud, y la distancia mxima a la cual el sonido ya no se debe oir. Entonces,
cuando la distancia oscila entre 0 y la mxima distancia, el sonido esta en su mxima amplitud. Cuando se oscile entre
la distancia mnima y la mxima, la amplitud decrece lentamente hasta que la distancia mxima es alcanzada, o el
sonido ya no es audible. Por predeterminado (default), la distancia mnima es 1 metro y la mxima 1 billn de metros.
sound_3d_set_sound_cone(snd,x,y,z,anglein,angleout,voloutside
Normalmente el sonido tiene la misma amplitud, a una distancia dada, en todas las direcciones. Puedes establecer un
cono de sonido para cambiar esto y dirigir el sonido. x,y,z especifican la direccin del cono. ANGLEIN especifica el
ngulo interior. Si el oyente esta dentro de este ngulo, puede escuchar el sonido en su volumen normal. ANGLEOUT
especifica el ngulo exterior. Cuando el oyente esta afuera de este ngulo, el volumen es indicado con VOLOUTSIDE.
Para ser precisos, VOLOUTSIDE es un nmero negativo que indica el nmero de cientos de decibeles que deben ser
sustrados del volumen interior. Entre el ngulo interior y exterior, el volumen decrece gradualmente.
Msica desde el CD
Existen tambin funciones para tratar con la reproduccin de msica desde un CD:
cd_init()Debe llamarse antes de usar las otras funciones, as como cuando se cambia un CD (o simplemente de
tiempo a tiempo).
cd_stop()Deja de reproducir.
cd_pause().Pausa la reproduccin.
cd_resume().Continua la reproduccin.
cd_set_position(pos). Establece la posicin en el CD, en milisegundos.
cd_set_track_position(pos). Establece la posicin de la pista actual en milisegundos.
cd_open_door()Abre la caja del Reproductor de CDs.
MCI_command(str) Esta funcin enva el comando al sistema multimedia de Windows usando el Media Control
Interface (MCI, Interfaz de Control de Medios). Devuelve la cadena de texto de resultado. Puedes usar esta funcin
para controlar cualquier tipo de hardware multimedia. Para ms informacin sobre este comando, consulta la ayuda de
Windows. Por ejemplo, MCI_command('play cdaudio from 1') pone a sonar el cd (despus de
inicializalo correctamente). Esta funcin es slo para uso avanzado.
imgenes, etc...para mostrar mensajes y preguntas al jugador, y mostrar la tabla de mayores puntajes.
Ventanas
Muchos juegos tienen ventanas, las cuales pueden mostrar un video, una imagen o algn texto. Frecuentemente son
usadas al principio del juego (como intro), al principio de un nivel, o al final del juego (p.e. los crditos). En Game
Maker, dichas ventanas con texto, imgenes o video pueden mostrarse en cualquier momento del juego, y mientras
versin independiente del juego (stand-alone), no debes olvidar incluir este archive ah. full indica si se debe mostrar
en pantalla completa. BACKCOL es el color de fondo, y DELAY es el retardo en segundos antes de volver al juego
(aunque el jugador siempre tendr la posibilidad de volver al juego manualmente, haciendo clic con el Mouse)
show_image(fname,full,delay) Muestra una ventana con una imagen. fname es el nombre del archivo
de imagen (nicamente .bmp, .jpg y .wmf), pero debes poner los archivos en el directorio del juego tu mismo. FULL
indica si deseas mostrarlo en pantalla completa. DELAY es el retardo en segundos antes de volver al juego.
show_video(fname,full,loop) Muestra una ventana de video. FNAME es el nombre del archivo de video
(.avi,.mpg), pero debes poner este archivo en el directorio del juego tu mismo. FULL indica si deseas mostrarlo en
Existen otras funciones para mostrar mensajes, preguntas, un men con opciones, o un cuadro de dilogo en el cual el
usado como acceso directo a ese botn (p.e. &Acepto, si se presiona A se simula la presin del botn). Esta funcin
show_question(str) Muestra una pregunta; devuelve true cuando el usuario elige yes y de otra manera,
false.
message_background(back) Establece la imagen de fondo par a los cuadros de dilogo para cualquiera de
las funciones arriba. BACK debe ser uno de los archivos definidos en el juego. Si BACK es parcialmente transparente,
message_alpha(alpha) Establece la traslucidez de los cuadros de dilogo para cualquiera de las funciones
anteriores. ALPHA debe oscilar entre 0 (completamente traslcido) y 1 (completamente opaco) (solo para WIN2000 o
superior).
message_button(spr) Establece el sprite usado para los botones en los cuadros de dilogo. SPR debe ser un
sprite consistiendo de 3 imgenes, la primera indica el botn cuando no esta presionado y el mouse est alejado, el
Segundo indica el botn cuando el mouse est sobre el pero no presionado, y el tercero cuando del botn es
presionado.
los cuadros de dilogo. STYLE indica el estilo de fuente. (0=normal, 1=negrita, 2=cursiva, 3=negrita y cursiva).
message_mouse_color(col) Establece el color de la fuente para los botones en los cuadros de dilogo
cuando el mouse est sobre ellos.
message_input_color(col) Establece el color para el fondo del campo de entrada en los cuadros de
dilogo.
message_caption(show,str) Establece el ttulo del cuadro de dilogo. SHOW indica si se debera mostrar
mensaje.
show_menu(str,def) Muestra un men pop-up. STR indica el texto del men. Este consiste en diferentes
opciones del men con una barra vertical entre ellas. Por ejemplo, str = menu0|menu1|menu2. Cuando la primera
opcin es seleccionada, se devuelve un 0, para la segunda un 1, etc. Cuando ninguna opcin es seleccionada, el valor
con un ';'(punto y coma) entre ellas. '*' (asterisco) significa cualquier string. Por ejemplo: Mapa de
show_error(str,abort) Muestra un mensaje de error estndar (y/o escribe el error al archivo de registros).
ABORT indica si el juego debera cerrarse (true-abortar, false-ignorar).
Tablas de rcords
Una ventana pop-up especial es la lista de MEJORES PUNTAJES que se mantiene para cada juego. Las siguientes
cuando no hay nadie en un lugar en particular. ESCAPE es el string en el inferior indicando que se debe presionar la
tecla ESC. Puedes usar esto en particular cuando tu juego usa un idioma diferente.
highscore_show_ext(numb,back,border,col1,col2,name,size) Muestra la tabla de
hightscores con diferentes opciones (tambin puede lograrse usando las funciones anteriores). NUMB es el nuevo
puntaje. Si el puntaje es suficientemente bueno para ser agregado a la lista, el jugador puede introducir un nombre.
Usa -1 para mostrar simplemente la lista actual. BACK es la imagen de fondo a usar, BORDER indica si se debe mostrar
o no el borde. COL1 es el color para la nueva entrada, COL2 para las dems entradas. NAME es el nombre de la fuente
highscore_value(place) Devuelve el puntaje de la persona en el lugar PLACE(1-10). Esto puede ser usado
para dibujar tu propia lista de puntajes.
Recursos
En Game Maker puedes especificar varios tipos de recursos, como sprites, sonidos, fondos, objetos, etc. En este
captulo encontrars un nmero de opciones que actan sobre estos recursos, para modificarlos u obtener informacin
Sprites
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_bbox_mode(ind) Devuelve el modo usado para la caja de controno del sprite (0=automatic,
1=full image, 2=manual).
sprite_get_precise(ind) Devuelve si el sprite con el ndice dado utiliza la colisin precisa (precise
collision checking).
Sonidos
Los sonidos usan muchos recursos y algunos sistemas slo pueden guardar y hacer sonar un nmero limitado de ellos.
Si haces un juego muy grande, deberas llevar un control sobre los sonidos que se cargan en la memoria de audio en
cada momento. Podras desactivar la opcin Preload para asegurarte de que los sonidos no se carga hasta que van a
ser usados (aunque este mtodo puede originar cierto retraso la primera vez que se escuche el sonido). Adems, los
sonidos no se eliminan de la memoria cuando ya no van a ser utilizados. Para controlar esto puedes usar las siguientes
funciones:
Fondos
Paths
path_get_y(ind,pos) Devuelve la coordenada y en la posicin pos del path (pos debe estar comprendida
entre 0 y 1).
path_get_speed(ind,pos) Devuelve la velocidad en la posicin pos del path (pos debe estar comprendida
entre 0 y 1).
Scripts
Time lines
Objetos
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 parent del objeto ind1.
Rooms
Observa que como las habitaciones cambian durante el juego hay otras rutinas para obtener informacin de la
habitacin actual
Es posible crear nuevos recursos durante el juego. Tambin se pueden cambiar recursos existentes. Las posibilidades
se muestran en este captulo. Pero se debe tener cuidado: la modificacin de recursos fcilmente puede llevar a
errores en los juegos!!! Al modificar recursos, se deben seguir las siguientes reglas:
No cambies recursos que estn siendo utilizados. Esto provocar errores! Por ejemplo, no cambies un sprite
Cuando guardas/salvas el juego mientras se est ejecutando, los recursos agregados y modificados NO son
guardados con el juego. Por lo que, si ms tarde se carga el juego, los recursos modificados podran no estar
disponibles. En general, cuando se manipulan recursos ya no se puede hacer uso del sistema interno de
Cuando reinicias un juego mientras est en ejecucin, los recursos modificados no son reestablecidos a su
forma original. En general, cuando se manipulan recursos ya no se puede hacer uso de la accin o de la
La creacin de recursos durante la ejecucin del juego (en particular los sprites y fondos) fcilmente
consume gran cantidad de memoria. Se debe ser extremadamente cuidadoso con esto. Por ejemplo, si se
tiene un un sprite 128x128 con 32 cuadros de animacin y decides crear 36 copias rotadas estars usando
36x32x128x128x4 = 36 MB de memoria!
Se deben eliminar los recursos que ya no son utilizados. De otra forma pronto se ocupara toda la memoria
del sistema.
En general, no se deben modificar recursos durante el juego. Es mejor crear y cambiar los recursos al inicio del juego o
Sprites
sprite_set_precise(ind,mode) Establece si el sprite con ndice ind usa chequeo de colisin precisa
(true o false).
Las siguientes funciones pueden utilizarse para crear nuevos sprites y para eliminarlos.
sprite_duplicate(ind) Crea una copia del sprite con ndice ind. Devuelve el ndice del nuevo sprite.
sprite_assign(ind,spr) Asigna el sprite spr al al sprite con ndice ind. Es decir, crea una copia del sprite.
De esta manera fcilmente puedes asignar un sprite existente a p. ej. un nuevo sprite.
sprite_merge(ind1,ind2) Fusiona las imagines del sprite ind2 en el sprite ind1, agregndolas al final de
este ultimo. Si los tamaos no corresponden los sprites son encogidos. No se elimina el sprite ind2!
sprite_add(fname,imgnumb,precise,transparent,smooth,preload,xorig,yori
g) Agrega a los recursos sprites la imagen del archivo fname. Solo se pueden agregar imgenes bmp, jpg y gif.
Cuando se trata de un bmp o jpg la imagen puede ser una tira que contenga las subimgenes del sprite una junto a la
otra. Se usa imgnumb para indicar el nmero de subimgenes (1 para una sola). Este argumento no es empleado
con imgenes gif (animadas); se emplea el nmero de imgenes del archivo gif. precise indica si se usar chequeo
de colisin precisa. transparent indica si la imagen es parcialmente transparente. smooth indica si se alisarn
los bordes. preload indica si se precargar la imagen en la memoria de texturas. xorig y yorig indican la
posicin de origen en el sprite. La funcin devuelve el ndice del nuevo sprite. Si ocurre algn error devuelve -1.
sprite_replace(ind,fname,imgnumb,precise,transparent,smooth,preload,xo
rig,yorig) Lo mismo que la anterior pero en este caso se reemplaza al sprite con ndice ind. El valor devuelvo
sprite_create_from_screen(x,y,w,h,precise,transparent,smooth,preload,x
orig,yorig) Crea un nuevo sprite copiando de un rea indicada de la pantalla. Esto permite crear cualquier
sprite que se desee. Se dibuja la imagen en pantalla empleando las funciones de dibujado y luego se crea un sprite con
ella. (Si no se hace dentro del evento drawing an se puede hacer de manera que no sea visible si no se refresca la
pantalla). Los dems parmetros son similares a los indicados en las anteriores funciones. La funcin devuelve el ndice
del sprite. Pero se poner algo de cuidado aqu. Aunque se habla de la pantalla, de hecho, lo que importa es el rea en
donde se dibuja. No importa el hecho de que haya una ventana en pantalla y que la imagen pudiera estar escalada en
esta ventana.
del sprite con ndice ind. x, y, w y h indican las dimensiones del rea en pantalla (coordenadas x, y, ancho y alto).
ndice ind usando los valores de luminosidad (hue) del sprite spr. Esta accin no se puede deshacer.
Sonidos
Las siguientes rutinas pueden ser utilizadas para crear nuevos sonidos y para eliminarlos.
archive de sonido. kind indica el tipo de sonido (0=normal, 1=de fondo, 2=3D, 3=mmplayer), preload indica si el
sonido debiera ser almacenado inmediatamente en la memoria de audio (true o false). La funcin devuelve el ndice del
nuevo sonido, que puede utilizarse para reproducirlo. (O devolver -1 si ocurriera algn error, p. ej. que el archivo no
existiera).
crea un nuevo sonido sino que se sustituye el que tenga ndice index, liberando el anterior sonido. El valor devuelto por
sound_delete(index) Elimina el sonido index, liberando toda la memoria asociada con l. Ya no es posible
recuperarlo
Fondos
Las siguientes rutinas pueden ser empleadas para crear nuevas imgenes de fondo y para eliminarlas.
background_duplicate(ind) Crea un duplicado del fondo con el ndice ind. Devuelve el ndice del nuevo
background_assign(ind,back) Asigna el fondo back al fondo ind. Esto es, crea una copia del fondo.
precargar la imagen en la memoria de texturas. La funcin devuelve el ndice del nuevo fondo, el cual se puede usar
para dibujarlo o para asignarlo a la variable background_index[0] para hacerlo visible en la habitacin actual. Devuelve
anterior pero en este caso el fondo con ndice ind es reemplazado. La funcin devuelve un valor indicando si tuvo xito
h=alto) con el color col. Devuelve el ndice del nuevo fondo, -1 si ocurre algn error.
indicado (w=ancho, h=alto) coloreado con un gradiente. col1 y col2 indican los dos colores. kind es un nmero entre 0
y 5 que indica el tipo de gradiente: 0=horizontal, 1=vertical, 2=rectngulo, 3=elipse, 4=doble horizontal, 5=doble
vertical. Esta funcin devuelve el ndice del nuevo fondo, -1 si ocurre algn error.
background_create_from_screen(x,y,w,h,transparent,smooth,preload) Crea un
fondo copiando un rea indicada de la pantalla (x, y=coordenadas esquina superior izquierda, w=ancho, h=alto). Esta
funcin permite crear cualquier fondo que se desee. Se dibuja la imagen en pantalla usando las funciones de dibujo y a
continuacin se crea un nuevo fondo de ella. (Si no se hace esto en el evento drawing incluso se puede lograr que no
sea visible en pantalla si no se refresca). Los otros parmetros son similares a los de las anteriores funciones. La
funcin devuelve el ndice del nuevo fondo. Se requiere algo de cuidado aqu. Aunque se habla de la pantalla, lo que
importa es la regin en la que se dibuja. No importa el hecho de que haya una ventana en pantalla y que la imagen en
del fondo con ndice ind usando los valores hue del fondo back. Esta accin no puede deshacerse.
Fuentes
Es posible crear, reemplazar y eliminar fuentes durante el juego usando las siguientes funciones. (No se debe
reemplazar una fuente que est configurada como la actual o en su caso se debe reestablecer la fuente despus del
cambio).
Se indica el tamao (size), si es negrita (bold), cursiva (italic) y el primer y ultimo caracteres que deben ser creados
(first y last).
creada de un sprite. El sprite debe contener una subimagen para cada carcter. first indica el ndice del primer carcter
en el sprite. Por ejemplo, se puede usar ord('0') si el sprite solo contiene los dgitos. prop indica si la fuente es
proporcional. En una fuente proporcional, para cada carcter el ancho de la caja de colisin es utilizado como el ancho
del mismo. Finalmente, sep indica la distancia que debe separar a los caracteres horizontalmente. Un valor tpico
nueva fuente, indicando el nombre (name), tamao (size) si es negrita (bold) o cursive (italic) y el primer y ltimo
Paths
Es posible crear trayectorias y agregar puntos a las mismas. Sin embargo, nunca debe modificarse una trayectoria que
est siendo usada por alguna instancia. Se pueden provocar resultados inesperados. Se tienen las siguientes funciones:
(0=straight, 1=smooth).
path_set_closed(ind,closed) Establece si la trayectoria ind debe ser cerrada (true) o abierta (false).
path_assign(ind,path) Asigna la trayectoria path a la trayectoria ind. Por tanto, crea una copia de la
trayectoria. De esta manera se puede fcilmente configurar una trayectoria existente a p. Ej. otra trayectoria nueva.
con factor de velocidad speed. Se debe recordar que un factor de 100 corresponde a la velocidad actual. Valores
path_clear_points(ind) Limpia todos los puntos de la trayectoria ind, volvindola una trayectoria vaca.
path_rotate(ind,angle) Rota angle grados la trayectoria ind en contra de las manecillas del reloj
(alrededor de su centro).
path_scale(ind,xscale,yscale) Escala la trayectoria ind con los factores indicados (con respecto a su
centro).
Scripts
No se pueden modificar los scripts durante la ejecucin del juego. Los scripts son una parte de la lgica del juego. La
modificacin de los mismos llevara a una autoreescritura de cdigo que muy fcilmente llevara a errores. Hay otras
formas de hacer algo parecido. Si realmente se necesita ejecutar una pieza de cdigo no conocida en tiempo de diseo
(p. ej. Desde un archivo) se pueden hacer uso de las siguientes funciones:
En ocasiones se quiere almacenar en una variable el ndice de un script para luego ejecutarlo. Para ello se puede utilizar
la siguiente funcin
script_execute(scr,arg0,arg1,...) Ejecuta el script con ndice scr con los argumentos indicados.
Time lines
Las siguientes rutinas permiten la creacin y modificacin de las time lines. No se deben alterar las lneas de tiempo
timeline_delete(ind) Elimina la lnea de tiempo con ndice ind. Debe asegurarse que ninguna instancia
instante step. codestr contiene el cdigo para las acciones. Si el step no existe se crea. Por lo que pueden agregarse
timeline_moment_clear(ind,step) Se puede utilizar esta funcin para borrar todas las acciones de
Objetos
Tambin los objetos pueden ser manipulados y creados en tiempo de ejecucin. NUNCA se debe cambiar o eliminar un
objeto del cual existan instancias. Esto puede provocar efectos inesperados ya que ciertas propiedades son
object_set_sprite(ind,spr) Establece el sprite para el objeto con ndice ind. El valor -1 remueve del
object_set_visible(ind,vis) Establece si las instancias creadas del objeto ind deben ser visibles por
object_set_mask(ind,spr) Establece el sprite para la mscara del objeto con ndice ind. Para que la
object_set_parent(ind,obj) Establece el padre (obj) para el objeto ind. Si se usa -1 se indica que el
objeto ind no tiene padre. El cambiar el objeto padre cambia el comportamiento de las instancias del objeto.
Las siguientes rutinas son tiles para crear objetos mientras el juego se ejecuta. Como con todas las rutinas de
modificacin de recursos, se debe ser muy cuidadoso para que no se creen nuevos objetos todo el tiempo.
object_add() Agrega un nuevo objeto. Devuelve el ndice del mismo. Despus se puede utilizar este ndice en
las rutinas anteriores para configurar ciertas propiedades del objeto y luego se puede utilizar el ndice para crear
object_delete(ind) Elimina el objeto con ndice ind. Se debe asegurar de que no existan instancias de este
se deben definir eventos para dicho objeto. Solo se pueden agregar acciones de cdigo. Se debe indicar el objeto (ind),
el tipo de evento (evtype), el nmero de evento (evnumb, se pueden usar las constantes indicadas antes para la
funcin event_perform()). Por ultimo se proporciona la cadena de cdigo que debe ejecutarse (codestr). Se pueden
La creacin de objetos es en particular muy til cuando se estn diseando scripts o bibliotecas de acciones. Por
ejemplo, un script de inicializacin puede crear un objeto para mostrar un texto y otro script puede agregar un objeto
con un texto en particular. De esta forma se tiene un mecanismo simple para desplegar mensajes sin la necesidad de
Rooms
La manipulacin de habitaciones en tiempo de ejecucin es algo muy riesgoso. Se debe tomar en cuenta que las
habitaciones cambian todo el tiempo debido a lo que ocurre dentro del juego. Esto normalmente solo ocurre para la
habitacin en turno y hay muchas rutinas descritas en anteriores secciones para manipular las instancias, los fondos y
los tiles en la habitacin actual. Pero los cambios en la habitacin active se mantendrn si dicha habitacin es
persistente. Entonces, nunca se debieran manipular elementos de la habitacin en turno o de cualquier otra habitacin
que sea persistente y que ya haya sido visitada antes. Tales cambios en general no sern percibidos pero en ocasiones
podran ocasionar errores inesperados. Debido al hecho de que las habitaciones estn enlazadas de manera complicada
room_set_code(ind,str) Configura el cdigo de inicializacin (str) para la habitacin con ndice ind.
con ndice ind si no cuenta con una imagen de fondo. col indica el color y show indica si el color debe mostrarse o no.
room_set_background(ind,bind,vis,fore,back,x,y,htiled,vtiled,hspeed,vs
peed,alpha) Establece el fondo con ndice bind (0-7) como fondo para la habitacin con ndice ind. vis indica si el
fondo ser visible y fore si se trata de un fondo de primer plano. back es el ndice de la imagen de fondo. x, y indican la
posicin de la imagen y htiled y vtiled indican si la imagen debe dividirse en tiles. hspeed y vspeed indican la velocidad
con la que el fondo se mueve y alpha indica un valor de transparencia alfa (1 = slido y ms rpido).
room_set_view(ind,vind,vis,xview,yview,wview,hview,xport,yport,wport,h
port,hborder,vborder,hspeed,vspeed,obj) Establece la vista con ndice vind (0-7) para la
habitacin con ndice ind. vis indica si la vista es visible. xview, yview, wview y hview indican la posicin de la vista en
la habitacin. xport, yport, wport y hport indican la posicin en pantalla. Cuando la vista debe seguir a un objeto
hborder y vborder indican el borde mnimo visible que debe mantenerse alrededor del objeto. hspeed y vspeed indican
la mxima velocidad con la que la vista puede moverse. obj es el ndice del objeto o el ndice de la instancia.
ndice ind.
room_add() Agrega una nueva habitacin. Devuelve el ndice de la misma. Se debe notar que la habitacin no
formar parte del orden de habitaciones. Por lo que la nueva habitacin no cuenta con habitaciones previa ni siguiente.
room_duplicate(ind) Agrega una copia de la habitacin con ndice ind. Devuelve el ndice de la nueva
habitacin.
room_assign(ind,room) Asigna la habitacin room al ndice ind. Por tanto, esta funcin crea una copia de la
habitacin.
room_instance_add(ind,x,y,obj) Agrega a la habitacin ind una nueva instancia del objeto obj,
height indican la parte del fondo que forma al tile. x, y es la posicin del tile en la habitacin y depth es la profundidad
del tile.
room_tile_add_ext(ind,back,left,top,width,height,x,y,depth,xscale,
yscale,alpha) Lo mismo que la anterior rutina pero tambin se puede especificar un factor de escalado en las
direcciones x e y, y una transparencia alpha para el tile.
En juegos ms avanzados probablemente querrs leer datos de un archivo que has 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). En algunas
situaciones puede ser que necesites ejecutar programas externos, o crear nuevos archivos con datos del juego.
Puedes encontrar toda la informacin sobre estos temas en las secciones siguientes:
Archivos
Es til utilizar archivos externos en juegos. Por ejemplo, podras hacer un archivo que describe qu ciertas cosas deben
suceder en qu momento. Tambin puedes querer salvar la informacin para la prxima vez que se ejecute el juego.
Las funciones siguientes sirven para leer y escribir datos en archivos de texto:
file_text_open_read(fname) Abre el archivo fname para lectura. La funcin devuelve la id del archivo
que debes utilizar en el resto de funciones. Puedes abrir hasta un mximo de 32 archivos simultneamente. No olvides
Para manipular archivos del sistema puedes utilizar las siguientes funciones:
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 comodines (*), 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
constantes
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 constantes indicadas anteriormente.
Las siguientes funciones sirven para cambiar los nombres de archivos. Observa que estas funciones no afectan a los
archivos en s, si no al nombre:
filename_name(fname) Devuelve el nombre del archivo fname, con la extensin pero sin la ruta.
filename_path(fname) Devuelve la ruta al archivo indicado, incluyendo la ltima barra de separacin.
filename_dir(fname) Devuelve el directorio del archivo, que normalmente suele ser igual que la ruta pero
sin la ltima barra de separacin.
En algunas situaciones puede que quieras leer datos de archivos binarios. Para ello dispones de las siguientes rutinas
de bajo nivel:
utilizarse en las dems funciones. Puedes abrir hasta un mximo de 32 archivos simultneamente, pero no olvides
file_bin_seek(fileid,pos) Mueve la posicin en el archivo a la posicin indicada por pos. Para aadir
contenido al final de un archivo, usa el valor file_bin_size(fileid) para el parmetro pos.
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.
game_id* Identificador nico para el juego. Puedes usarlo si necesitas un nombre nico de archivo.
working_directory* Carpeta de trabajo del juego. (No incluye la diagonal invertida final).
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 comandos al
juego que estn ejecutando (para por ejemplo activar trucos o modos especiales). Para obtener estos argumentos
parameter_count() Devuelve el nmero de parmetros de la lnea de comandos (nota que el nombre del
programa es uno de ellos).
parameter_string(n) Devuelve los parmetros n de la lnea de comandos. El primer parmetro tiene ndice 0
y es el nombre del programa.
Por ltimo, puedes leer el valor de las variables de entorno con la siguiente funcin:
Registro
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
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).
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
el grupo HKEY_CURRENT_USER. Pero si quieres puedes cambiar este grupo raz de trabajo. Por ejemplo, para obtener
path = registry_read_string_ext('\Environment','TEMP');
Las siguientes funciones existen para moverte por el registro con libertad:
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).
Para pasar ciertos parmetros a un programa es corriente utilizar los archivos INI. Los archivos INI contienen secciones
[Form]
Arriba=100
Izquierda=100
Titulo=El mejor juego de la historia
[Game]
MaxScore=12324
Este archivo contiene dos secciones: la primera llamada Form y la segunda llamada Game. Primera seccin contiene 3
parejas de valores. Las dos primeras tienen un valor real mientras que la tercera es una cadena de texto. Los archivos
INI son muy fciles de crear y editar. En Game Maker puedes utilizar las siguientes funciones para esto:
ini_open(name) Abre el archivo de INI con el nombre dado El archivo INI se debe almacenar en la misma
carpeta que el juego!
default.
Ejecucin de programas
Game Maker tambin tiene la posibilidad de iniciar programas externos. Hay dos funciones disponibles para esto:
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
execute_program(prog,arg,wait) Ejecuta el programa prog con los argumentos arg. wait indica si se
debe esperar a que termine la aplicacin.
Ambas funciones no funcionarn si el jugador activa el modo seguro en sus preferencias. Puedes comprobar esto
Estructuras de datos
En los juegos normalmente necesitas guardar informacin. Por ejemplo, necesitas guardar listas de tems que lleva un
personaje o nombres de lugares que necesita visitar. Puedes usar arrays para esto. Pero si necesitas hacer operaciones
ms complicadas, como ordenar los datos o buscar un tem determinado, necesitas escribir grandes trozos de cdigo en
Para remediar esto, Game Maker dispone de un nmero de funciones de estructuras de datos. Hasta el momento hay 6
tipos de estructuras de datos diferentes: stacks (pilas), queues (colas), lists (listas), maps (mapas), priority queues
(colas de prioridad) y grids (rejillas). Cada uno de estos tipos est preparado para un uso particular.
Todas las estructuras de datos funcionan generalmente de la misma manera. Creas una estructura de datos con una
funcin que devuelve la id de esa estructura y luego usas esa id para hacer diferentes operaciones. Cuando has
terminado, puedes destruir la estructura para ahorrar espacio. Puedes usar tantas estructuras a la vez como desees y
Observa que las estructuras de datos no se guardan cuando guardas el juego usando las funciones o acciones
Al comparar valores, por ejemplo al ordenar una lista, Game Maker debe decidir cundo dos valores son iguales. Al usar
cadenas de texto y valores enteros esto es evidente, pero para valores reales, debido a errores de redondeo, nmeros
iguales pueden convertirse en diferentes. Por ejemplo, (5/3)*3 no ser igual a 5. Para evitar esto, puedes especificar la
precisin que deseas usar. Cuando la diferencia entre dos nmeros es menor que esta precisin, los dos nmeros se
consideran iguales. Por defecto se utiliza una precisin de 0.0000001.Puedes cambiar este valor con las funciones
siguientes:
ds_set_precision(prec) Especifica la precisin usada en comparaciones.
Esta precisin se utiliza en las estructuras de datos pero no en el resto de comparaciones en GML!
Pilas
Una pila es una estructura LIFO (ltimo en entrar, primero en salir). Puedes empujar (push) valores en la pila o
quitarlos tirando de ellos (pop). El ltimo valor que se empuj en la lista es el primero al que se accede al tirar de la
lista. Es como si vas poniendo un libro encima de otro: cuando quieras coger un libro, el ltimo que pusiste estar
encima de todos los dems y ser el que cojas. Las pilas se utilizan para gestionar interrupciones o cuando se usan
funciones recursivas:
ds_stack_create() Crea una nueva pila. La funcin devuelve un nmero entero con la id de la pila para usarla
en las diferentes funciones. Puedes crear varias pilas.
ds_stack_destroy(id) Destruye la pila, liberando la memoria usada. No olvides usar esta funcin cuando
ya no necesites la pila.
ds_stack_clear(id) Limpia la pila, borrando todos los valores que contiene pero no la destruye.
ds_stack_size(id) Devuelve el nmero de valores en la pila.
ds_stack_empty(id) Devuelve true si la pila est vaca. Es lo mismo que chequear si el nmero de valores en
la pila es cero.
ds_stack_top(id) Devuelve el valor al principio de la pila (el primero que se introdujo) pero no lo elimina.
Colas
Una cola es parecido a una pila, pero funciona como una estructura FIFO (primero en entrar, primero en salir). El
primer valor que se mete en la cola es el primero en salir, como una cola en una tienda. El primer cliente en llegar ser
el primero en ser atendido y los dems tendrn que esperar su turno en orden. Para trabajar con colas existen las
funciones siguientes (observa que las 5 primeras son equivalentes a las funciones de las pilas: todas las estructuras de
ds_queue_create()Crea una nueva cola. La funcin devuelve un nmero entero con la id de la cola para
usarla en las diferentes funciones. Puedes crear varias colas.
ds_queue_destroy(id) Destruye la cola, liberando la memoria usada. No olvides usar esta funcin cuando
ya no necesites la cola.
ds_queue_clear(id)Limpia la cola, borrando todos los valores que contiene pero no la destruye.
ds_queue_size(id) Devuelve el nmero de valores en la cola.
ds_queue_empty(id) Devuelve true si la cola est vaca. Es lo mismo que chequear si el nmero de valores
en la cola es cero.
ds_queue_enqueue(id,val) Introduce el valor en la cola.
ds_queue_head(id) Devuelve el valor al principio de la cola, esto es, el primero que se introdujo, pero no lo
elimina de la cola.
Listas
Una lista guarda una coleccin de valore en un orden determinado. Puedes aadir valores a la lista a la posicin que
desees. Por eso, puedes acceder acceder a los valores usando un ndice de su posicin en la lista. Tambin puedes
ordenar los elementos de forma ascendente o descendente. Las listas se pueden usar para muchas cosas, por ejemplo,
para guardar valores que cambian. Las listas se han programado usando arrays, pero al estar definidas en cdigo
ds_list_create()Crea una nueva lista. La funcin devuelve un nmero entero con la id de la lista para usarla
en las diferentes funciones. Puedes crear varias listas.
ds_list_destroy(id) Destruye la lista, liberando la memoria usada. No olvides usar esta funcin cuando ya
no necesites la lista.
ds_list_clear(id) Limpia la lista, borrando todos los valores que contiene pero no la destruye.
Mapas
En algunas ocasiones necesitas guardar pares de valores consistentes de una llave (key) y un valor. Por ejemplo, un
personaje puede llevar varios tems diferentes y puede tener un nmero diferente de cada uno. En este caso, el tem
ser la llave y la cantidad ser el valor. Los mapas manejan estas parejas de valores, ordenndolos por la llave. Puedes
aadir valores al mapa y buscar uno concreto usando las llaves. Como las llaves tambin estn ordenadas, puedes
encontrar los valores correspondientes a la llave siguiente o anterior. A veces es til usar un mapa para guardar llaves
sin ningn valor asignado. En este caso puedes asignarles a todas las llaves el valor 0.
ds_map_create()Crea un nuevo mapa. La funcin devuelve un nmero entero con la id del mapa para usarla en
las diferentes funciones. Puedes crear varios mapas.
ds_map_destroy(id) Destruye el mapa, liberando la memoria usada. No olvides usar esta funcin cuando ya
no necesites el mapa.
ds_map_clear(id)Limpia el mapa, borrando todos las parejas llave-valor que contiene pero no lo destruye.
ds_map_size(id) Devuelve el nmero de parejas llave-valor en el mapa.
ds_map_empty(id) Devuelve true si el mapa est vaca. Es lo mismo que chequear si el nmero de valores en
el mapa es cero.
Colas de prioridad
En una cola de prioridad a cada valor se le asigna una prioridad. As puedes buscar los valores con mayor o menor
ds_ priority _create()Crea una nueva cola. La funcin devuelve un nmero entero con la id de la cola
para usarla en las diferentes funciones. Puedes crear varias colas.
ds_ priority _destroy(id) Destruye la cola, liberando la memoria usada. No olvides usar esta funcin
cuando ya no necesites la cola.
ds_ priority _clear(id)Limpia la cola, borrando todos los valores que contiene pero no la destruye.
ds_ priority _size(id) Devuelve el nmero de valores en la cola.
ds_ priority _empty(id) Devuelve true si la cola est vaca. Es lo mismo que chequear si el nmero de
valores en la cola es cero.
Rejillas
Una rejilla es simplemente un vector (o arreglo) bidimensional. Una rejilla tiene un entero con su altura y anchura. Esta
estructura te permite acceder a los valores indicando el valor de la celda deseada (el primer valor en las direcciones x e
y es 0). Pero tambin puedes dar valores por regiones, aadirlos y encontrar los valores mximo, mnimo o medio de
una regin. Esta estructura es til para representar por ejemplo un campo de juego. Aunque todo lo que hace esta
estructura se puede conseguir usando vectores, las operaciones por regiones son mucho ms rpidas.
ds_grid_destroy(id) Destruye la rejilla, liberando la memoria usada. No olvides usar esta funcin cuando ya
no necesites la rejilla.
ds_grid_multiply(id,x,y,val) Multiplica la celda por el valor. Slo se puede usar con nmeros.
ds_grid_set_region(id,x1,y1,x2,y2,val) Todas las celdas de la regin especificada toman el
valor especificado.
Creando partculas
Los sistemas de partculas se emplean para crear efectos especiales. Las partculas son pequeos elementos (ya sean
representados por un pequeo sprite, un pxel o una pequea forma). Tales partculas se mueven de acuerdo a reglas
predefinidas y pueden cambiar su color mientras se mueven. Muchas partculas juntas pueden crear p. Ej. Fuegos
es sencillo de utilizar por lo que mejor lee cuidadosamente esta seccin antes de probarlo. Los sistemas de partculas
tienen muchos parmetros y no siempre es fcil entender cmo crear los efectos que se desean. Si lo encuentras
demasiado difcil, Game Maker tambin dispone de un sistema de efectos para crear explosiones, humo, lluvia e incluso
fuegos artificiales.
Primero que nada hay tipos de partculas. Un tipo de partcula define una clase de partculas en especfico. Tales tipos
pueden tener muchos parmetros que describen la forma, el tamao, color y movimiento de las partculas.
Despus tenemos los sistemas de partculas. Puede haber diferentes sistemas de partculas en un juego. Un sistema de
partculas puede tener partculas de diferentes tipos. Un sistema de partculas cuenta con emisores que crean las
partculas, ya sea continuamente o en estallidos. Tambin puede contar con atractores que atraen las partculas.
Finalmente, puede tambin tener destructores que destruirn las partculas. Una vez que se ha creado una partcula en
Efectos simples
La forma ms sencilla de crear partculas es usando el mecanismo de efectos. Los efectos se crean usando partculas,
pero t no tienes que preocuparte de eso. Simplemente eliges el tipo de efecto, la posicin donde debe crearse, su
ef_explosion
ef_ring
ef_ellipse
ef_firework
ef_smoke
ef_smokeup
ef_star
ef_spark
ef_flare
ef_cloud
ef_rain
ef_snow
Algunos slo necesitars crearlos una vez (como la explosin) mientras que otros debers crearlos en cada step (como
el humo o la lluvia). Observa que los efectos de nieve y lluvia siempre se crean en la parte superior de la pantalla as
Aunque esto pueda sonar limitado, se pueden conseguir efectos muy espectaculares. Por ejemplo, creando una
pequea nube de humo rojo debajo de una nave espacial en cada step se consigue una cola de fuego. Las dos
posicin especificada. size es el tamao del efecto segn la convencin siguiente: 0 = pequeo, 1 = mediano, 2 =
grande. color indica el color del efecto. El efecto se crea por debajo de la instancia con una profundidad (depth) igual a
100000.
Tipos de partculas
Tipos de partculas
Un tipo de particular define la forma, color y movimiento de una clase de partculas. Slo necesitas definir un tipo de
partcula una vez durante el juego, una vez hecho esto puede ser usado por cualquier sistema de partculas. Los tipos
de partculas tienen un gran nmero de caractersticas que pueden ser cambiadas para alterar su apariencia o
part_type_create() Crea un Nuevo tipo de particular. Devuelve el ndice del tipo. Este ndice debe usarse
en todas las llamadas a las funciones siguientes para configurar las propiedades del tipo de partcula, por lo que es
part_type_destroy(ind) Destruye el tipo de particular ind. Llama a esta funcin cuando ya no se necesite
tus partculas pero debes saber que adems hay 15 tipos de sprites ya definidos. Estos sprites son todos de tamao
64x64 y poseen valores de transparencia que los hacen fundirse de manera excelente con el fondo. Estos sprites se
pt_shape_pixel (pixel)
pt_shape_disk (disco)
pt_shape_square (cuadrado)
pt_shape_line (lnea)
pt_shape_star (estrella)
pt_shape_circle (crculo)
pt_shape_ring (anillo)
pt_shape_sphere (esfera)
pt_shape_flare (brillo)
pt_shape_spark (chispa)
pt_shape_explosion (explosin)
pt_shape_cloud (nube)
pt_shape_smoke (humo)
pt_shape_snow (nieve)
particular ind. Con la opcin animate puedes indicar si el sprite debe ser animado. Con stretch indicas si la animacin
debe repetirse durante el tiempo de vida de la partcula. Y con random indicas si se escoge una subimagen aleatoria
Una vez que hayas seeccionado el sprite para el tipo de partcula puedes elegir el tamao de ste. Un tamao de 1
significa el tamao normal del sprite. Un tipo de partcula se puede definir para que todas las partculas tengan el
mismo tamao o para que tengan tamaos distintos. Tambin puedes especificar un rango de tamaos, si el tamao
debe variar durante la vida de la partcula y si puede alternarse al crecer o disminuir, creando un efecto de tintineo.
part_type_size(ind,size_min,size_max,size_incr,size_wiggle) Establece los
parmetros de tamao para el tipo de partcula. Debes indicar el tamao inicial, el tamao final, la cantidad que debe
crecer en cada step (usa un valor negativo para que disminuya) y el tintineo (El valor por defecto es 1 y el tamao no
cambia).
Las partculas tambin tienen una orientacin que se indica en grados en sentido antihorario. Al igual que el tamao, la
orientacin puede crecer, disminuir y puede ser la misma para todas las partculas o diferente para cada una.
part_type_orientation(ind,ang_min,ang_max,ang_incr,ang_wiggle,ang_rela
tive) Aplica la orientacin al tipo de partcula. Debes indicar la orientacin inicial, final, el incremento o decremento
en cada step, si la orientacin tintinea y si los valores son relativos al movimiento actual (1) o absolutos (0). Por
ejemplo, si ponemos todos los valores a 0 menos ang_relative, que lo ponemos a 1, la orientacin de la partcula
Color y blending
Las partculas tendrn un color. Hay diferentes maneras de especificar un color para una partcula. La ms simple es
especificar solamente un color. Pero tambin puedes especificar dos tres colores que se interpolarn a lo largo de la
vida de la partcula. Por ejemplo, una partcula puede crearse siendo blanca y poco a poco irse convirtiendo en negra.
Otra posibilidad es indicar que el color de cada partcula debe ser diferente y elegido de un rango de colores
especificado.
El color por defecto es blanco. Cuando usas un sprite con sus propios colores esto es lo que normalmente quieres y no
medio y final .
part_type_color_mix(ind,color1,color2) El color ser seleccionado de una mezcla aleatoria de
especificar que cada partcula tendr un color fijo pero escogido de un rango de colores que especificas en modo rgb.
Adems del color, tambin puedes especificar un valor de transparencia. As puedes conseguir que las partculas
Normalmente las partculas se mezclan con el fondo igual que los sprites. Pero tambin es posible usar additive
blending, controlando as la forma en que se mezclan. Esto resulta un efecto muy bueno para explosiones.
part_type_blend(ind,additive) Indica si se debe utilizar additive blending (1) or normal blending (0)
Vida y muerte
Las partculas viven durante un tiempo limitado, despus, desaparecen. La vida de las partculas se mide en steps.
Puedes indicar su vida, o un rango para cada tipo de partculas. Adems, las partculas pueden crear otras partculas en
cada step o cuando mueren. Vigila que el nmero de partculas total no sea demasiado elevado.
deben ser generadas en cada step para el tipo indicado de particula. Si usas un nmero negativo para step_number,
deben ser generadas cuando una particular del tipo indicado llega al final de su ciclo de vida. Puedes usar valores
negativos al igual que en la funcin anterior. La partcula slo crear otras partculas al llegar al final de su vida y no
part_type_speed(ind,speed_min,speed_max,speed_incr,speed_wiggle) Establece
las propiedades de velocidad para el tipo de partcula. (Todos los valores son 0 por defecto). Especificas un valor
mnimo y mximo para la partcula y cuando sta sea creada se escoger un valor aleatorio entre ellos. Puedes
especificar un valor negativo en speed_incr para hacer que la partcula se frene (aunque nunca llegar a tener
velocidad negativa).
propiedades de direccin para el tipo de partcula, en grados antihorarios (0-360). (Todos los valores son 0 por
defecto).
Las partculas tienen vida en sistemas de partculas. Por lo que para tener partculas en tu juego necesitas crear uno o
ms sistemas de partculas. Puede haber muchos tipos diferentes de sistemas de partculas. Por ejemplo, si tu juego
tiene varias pelotas y cada pelota debiera tener una cola de partculas, lo ms probable es que cada pelota tenga su
sistema de partculas. La manera ms fcil para manejar los sistemas de partculas es crear uno y luego crear
partculas en l, usando los tipos partculas que especificaste antes. Pero, como veremos a continuacin, los sistemas
de partculas pueden contener emisores que automticamente producen partculas, atractores que las atraen y
Una vez que las partculas se aaden a un sistema son dibujadas y actualizadas en cada step automticamente. Para
definir si las partculas se deben dibujar delante o detrs de las dems instancias, los sistemas de partculas poseen una
profundidad.
Los sistemas de partculas no se eliminarn aunque reinicies el juego, para eliminarlos debes usar la funcin adecuada.
part_system_create() Crea un nuevo sistema de partculas. Devuelve el ndice del sistema creado. Este
ndice debe emplearse en las llamadas a las funciones siguientes para configurar las propiedades del sistema de
partculas.
part_system_destroy(ind) Destruye el sistema de partculas ind. Llama a esta funcin si ya no hars uso
part_system_clear(ind) Devuelve el sistema ind a sus valores por defecto, removiendo todas las
partculas. Cuando oldtonew es true las partculas ms viejas son dibujadas primero y las nuevas se dibujan sobre ellas
(valor por defecto). De otra forma las partculas ms recientes son dibujadas primero. Esto puede resultar en varios
efectos diferentes.
querer que esto sea as. Las siguientes funciones te permiten controlar estos aspectos:
part_system_update(ind) Esta funcin actualiza el sistema y permite a los emisores crear partculas.
Puedes llamar a esta funcin cuando no uses actualizacin automtica, o para acelerar un poco el sistema al inicio.
automtica. Debes llamar a esta funcin desde el evento draw de algn objeto.
number partculas del tipo ind en la posicin (x,y) dentro del sistema con el color indicado. Esto es til cuando el tipo de
Emisores
Los emisores crean partculas. Pueden crear un flujo continuo de partculas o pueden lanzar un cierto nmero de
partculas usando la funcin adecuada. Un sistema de partculas puede tener un nmero arbitrario de emisores. Un
xmin, xmax, ymin, ymax indican la extensin de la regin en la cual se generan las partculas.
shape indica la forma de la regin. Puede tener uno de los siguientes valores:
o ps_shape_rectangle
o ps_shape_ellipse
o ps_shape_diamond
o ps_shape_line
distribution indica la distribucin usada para general las partculas. Puede tener uno de los
siguientes valores:
o ps_distr_linear indica una distribucin lineal, esto es que en toda la regin se tiene la
number indica el nmero de partculas generadas en cada step. Si es menor que 0, en cada step se
generar una particular con una probabilidad de 1/number. Por ejemplo con un valor de 5 se generar una
Las siguientes funciones permiten establecer los emisores y permitirles crear partculas. Nota que cada una de ellas
part_emitter_create(ps) Crea un nuevo emisor en el sistema de partculas ps. Devuelve el ndice del
emisor. Este ndice debe usarse en todas las llamadas a las funciones siguientes para configurar las propiedades del
emisor.
part_emitter_region(ps,ind,xmin,xmax,ymin,ymax,shape,distribution)
Establece la regin y distribucin del emisor.
partculas de tipo partype desde el emisor ind en cada step. Si indicas un nmero menor a 0 en cada step una
particular sera generada con una probabilidad de 1/number. Por ejemplo con un valor de 5 se crear en promedio
Atractores
Adems de los emisores, un sistema de partculas tambin puede contener atractores. Un atractor atrae a las partculas
(o las aleja). Un sistema de partculas puede tener mltiples atractores. Aunque se te recomienda solo usar unos pocos
porque alentarn el procesamiento de las partculas. Un atractor tiene las siguientes propiedades:
force indican la fuerza de atraccin del atractor. El cmo acte la fuerza sobre las partculas depende de
dist indica la mxima distancia a la cual el atractor tiene efecto. Solo las partculas con una distancia al
fuerza es 0 mientras que en la posicin del atractor la fuerza tiene el valor force indicado.
additive indica si la fuerza se suma a la velocidad y direccin en cada step (true) o si solo se aplica a la
posicin de la particular (false). Cuando es true la particular acelerar hacia el atractor mientras que cuando
Las siguientes funciones definen atractores. Nota que todas necesitan como primer argumento el ndice del sistema de
part_attractor_create(ps) Crea un nuevo atractor en el sistema de partculas ps. Devuelve el ndice del
atractor. Este ndice debe emplearse en la llamada a las funciones siguientes para configurar las propiedades del
atractor.
part_attractor_destroy(ps,ind) Destruye el atractor ind dentro del sistema de partculas ps. Llama
part_attractor_destroy_all(ps) Destruye todos los atractores que hayan sido creados en el sistema
de partculas ps.
partculas ps.
part_attractor_clear(ps,ind) Devuelve los valores del atractor a sus valores por defecto.
Destructores
Los destructores destruyen las partculas cuando aparecen dentro de su regin. Un sistema de partculas puede tener
xmin, xmax, ymin, ymax indican la extensin de la regin en la cual se destruyen las partculas.
shape indica la forma de la regin. Puede tener uno de los valores siguientes:
o ps_shape_rectangle
o ps_shape_ellipse
o ps_shape_diamond
Las funciones siguientes configuran las propiedades de los destructores. Nota que cada una de ellas necesita como
del destructor. Este ndice debe usarse en las llamadas a las funciones siguientes para configurar las propiedades del
destructor.
Llama a esta funcin cuando ya no hagas uso del destructor para ahorrar espacio.
partculas ps.
destructor.
Deflectores
Los deflectores desvan a las partculas cuando aparecen dentro de su regin. Un sistema de partculas puede tener un
xmin, xmax, ymin, ymax indican la extensin de la regin en la cual las partculas son desviadas.
kind indica el tipo de deflector. Puede tener uno de los siguientes valores:
paredes horizontales
friction la cantidad de friccin como resultado de un impacto con el deflector. Entre mayor sea este
Se tienen las siguientes funciones para configurar las propiedades del deflector. Nota que todas necesitan como primer
del deflector. Este ndice debe emplearse en las llamadas a las funciones siguientes para configurar las propiedades del
deflector.
part_deflector_destroy(ps,ind) Destruye el deflector ind del sistema de partculas ps. Llama a esta
part_deflector_destroy_all(ps) Destruye todos los deflectores que hayan sido creados en el sistema
de partculas ps.
partculas ps.
part_deflector_clear(ps,ind) Devuelve el deflector a sus valores por defecto.
Cambiadores
Los cambiadores cambian ciertas partculas cuando aparecen dentro de su regin. Un sistema de partculas puede tener
xmin, xmax, ymin, ymax indican la extensin de la regin en la cual las partculas son
cambiadas.
shape indica la forma de la regin. Puede tener uno de los valores siguientes:
o ps_shape_rectangle
o ps_shape_ellipse
o ps_shape_diamond
parttype1 indica el tipo de partcula a ser cambiado.
kind indica el tipo del cambiador. Puede tener uno de los siguientes valores:
color y forma
Las siguientes funciones permiten establecer las propiedades del cambiador. Nota que cada una de ellas necesita como
part_changer_create(ps) Crea un nuevo cambiador en el sistema de partculas ps. Devuelve el ndice del
cambiador. Este ndice debe usarse en las llamadas a las funciones siguientes para configurar las propiedades del
cambiador.
part_changer_destroy_all(ps) Destruye todos los cambiadores que hayan sido creados en el sistema
de partculas ps.
part_changer_clear(ps,ind) Devuelve las propiedades del cambiador a sus valores por defecto.
part_changer_region(ps,ind,xmin,xmax,ymin,ymax,shape) Establece la regin para el
cambiador.
Aqu tienes un ejemplo de un sistema de partculas que crea unos fuegos artificiales. Hace uso de dos tipos de
partculas: uno que forma el cohete y otro que forma los fuegos artificiales en si. El cohete genera las partculas de los
fuegos artificiales cuando se destruye. Tambin tenemos un emisor en el sistema de partculas que emite regularmente
partculas del cohete desde la parte baja de la pantalla. Para hacer que esto funcione necesitas un objeto. En su evento
de creacin colocamos el siguiente cdigo que crea los tipos de partculas, un sistema de partculas y el emisor:
{
// Crear el sistema de partculas
ps = part_system_create();
// El cohete
pt2 = part_type_create();
part_type_shape(pt2,pt_shape_sphere);
part_type_size(pt2,0.2,0.2,0,0);
part_type_speed(pt2,10,14,0,0);
part_type_direction(pt2,80,100,0,0);
part_type_color2(pt2,c_white,c_gray);
part_type_life(pt2,30,60);
part_type_gravity(pt2,0.2,270);
part_type_death(pt2,150,pt1); /* Crear el fuego artificial al
morir*/
// Crear el emisor
em = part_emitter_create(ps);
part_emitter_region(ps,em,100,540,480,490,ps_shape_rectangle,ps_distr_
linear);
part_emitter_stream(ps,em,pt2,-4); // Crear 1 cada 4 steps
}
Listo! Asegrate de que el sistema de partculas (y tal vez los tipos de partculas) se destruyen al cambiar de room o el
Juegos multijugador
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.
Configurando la conexin
Para que dos computadoras se comuniquen necesitarn cierto 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 cadena 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:
se necesita la direccin para unirse a una sesin (ve a continuacin). En una red local no se necesitan direcciones.
(p. Ej. '0201234567'). Slo se necesita el nmero telefnico al unirse a una sesin (ve a continuacin).
indica el nmero de bits de parada (0 = 1 bit, 1 = 1.5 bit, 2 = 2 bits). parity indica la paridad (0=ninguna, 1=impar,
2=par, 3=mark). Y flow indica el tipo de control de flujo (0=ninguna, 1=xon/xoff, 2=rts, 3=dtr, 4=rts and dtr). La
funcin devuelve si la conexin se efectu con xito. Una llamada tpica a esta funcin es
mplay_init_serial(1,57600,0,0,4). Si especificas 0 al primer argumento se abre un dilogo para que el usuario pueda
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
Cuando empleas una conexin TCP/IP tal vez quieras decirle a la persona con la que deseas jugar cul es la direccin ip
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, Game Maker hace esto por ti. Lo nico que debes saber es que cuando
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.
Si quieres iniciar un nuevo juego multijugador necesitas crear una nueva sesin. Para esto puedes emplear la siguiente
rutina:
jugadores permitidos para este juego (usa 0 para un nmero arbitrario de jugadores). playname es tu nombre como
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
mplay_session_find() Busca todas las sesiones que an aceptan jugadores y devuelve el nmero de
sesiones encontradas.
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).
Jugadores
Cada instancia del juego que se una a una sesin es un jugador. Como se indic antes, los jugadores tienen nombres.
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
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 leer valores. 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 entre 0 y
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
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.
Mensajes
El segundo mecanismo de comunicacin que el Game Maker soporta es el envo 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.
mensaje y val es el valor (ya sea un nmero real o una cadena). El mensaje es enviado en modo no garantizado. Si val
identificador del mensaje y val es el valor (ya sea un nmero real o una cadena). Este es un envo garantizado. Si val
hubo un nuevo mensaje. Si es as, puedes emplear las siguientes rutinas para obtener su contenido:
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, 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
Usando DLLs
En aquellos casos en los que la funcionalidad del GML no cubra tus objetivos, se pueden ampliar las posibilidades
usando plug-ins (agregados o complementos). Un plug-in consiste en un archivo DLL (Dynamic Link Library Biblioteca
de enlazado dinmico). En este archivo DLL se pueden definir funciones. Tales funciones pueden ser programadas en
cualquier lenguaje que soporte la creacin de DLLs (p. Ej. Delphi, C, C++, etc.). Aunque se necesita contar con ciertas
habilidades de programacin para poder hacerlo. Las funciones plug-in deben tener un formato especfico. Pueden tener
entre 0 y 11 argumentos, cada uno de los cuales puede ser un nmero real (double en C) o una cadena terminada en
un carcter nulo. (Para ms de 4 argumentos, slo se soporta argumentos reales). Estas funciones deben devolver ya
En Delphi se puede crear una DLL seleccionando New en el men File y luego eligiendo DLL. A continuacin tienes un
ejemplo de una DLL escrita en Delphi que puede ser empleada con Game Maker. (Esto es cdigo de Delphi no GML!)
library MyDLL;
begin
end.
Esta DLL define dos funciones: MyMin toma dos argumentos reales y devuelve el de menor valor, y DoubleString que
duplica una cadena. Cabe recordar que se debe 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 convencin de llamada cdecl. 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).
Para hacer uso de esta DLL en Game Maker primero necesitas especificar las funciones externas que deseas emplear y
external_define(dll,name,calltype,restype,argnumb,arg1type,arg2type,
) 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-11). 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
{
global.mmm = external_define('MYOWN.DLL','MyMin',dll_cdecl,
ty_real,2,ty_real,ty_real);
global.ddd = external_define('MYOWN.DLL','DoubleString',dll_cdecl,
ty_string,1,ty_string);
}
Ahora en el momento que necesites llamar a las funciones, usas la siguiente funcin:
Necesitas proporcionar el nmero correcto de argumentos del tipo correcto (real o string). La funcin devuelve el
{
aaa = external_call(global.mmm,x,y);
sss = external_call(global.ddd,'Hello');
}
external_free(dll) Libera la DLL con el nombre indicado. Esto es particularmente necesario si el juego
debiera remover la DLL. Mientras la DLL no haya sido liberada, no puede ser removida. Lo mejor es realizar esto p. Ej.
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
Alternativamente puedes dejar que la DLL cree un archivo con un script que puede ser ejecutado (esta funcin tambin
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:
El empleo de DLLs externas es una funcin extremadamente poderosa. Pero por favor haz uso de ellas slo si sabes lo
Grficos 3D
Game Maker es un programa destinado para crear juegos en 2 dimensiones e isomtricos. Sin embargo existen algunas
funciones para crear grficos tridimensionales. Pero antes que inicies con esto hay un par de cosas que debes entender.
La funcionalidad 3D en Game Maker est limitada a la parte grfica. No hay ms soporte para otras
funciones 3D. Una vez que comiences a usar grficos 3D posiblemente tendrs problemas con otros aspectos
de Game Maker, como las vistas, orden de profundidad, etc. La funcionalidad es limitada y tiene baja
prioridad de ser extendida. As que no esperes soporte para objetos de modelos 3D, etc.
Cuando usas la funcionalidad 3D, son varias cosas las que ya no pueden ser usadas.
o Ya no podrs usar backgrounds ni foregrounds en tus rooms (La razn es que son usados como
mosaicos para llenar la imagen pero con proyecciones de perspectiva esto ya no funciona
correctamente).
o Ya no podrs usar la posicin del ratn. El ratn no ser transformado a las coordenadas 3D. An
puedes obtener la posicin del ratn en la pantalla (en la vista) pero tendrs que hacer clculos con
o La comprobacin de colisiones todava usa las posiciones 2-d de las instancias en el cuarto. As
que no hay deteccin de colisiones en 3D. En ocasiones an podrs usar esto (si utilizas el cuarto
como una representacin de un mundo plano (peje. para carreras o juegos FPS) pero en otras
Todas las funciones 3D son a travs de cdigo. Debes estar algo familiarizado con el lenguaje GML. Adems
debes entender bastante acerca de como funciona Game Maker de lo contrario te meters en dificultades.
Necesitas tener conocimiento bsico acerca de grficos 3D. En particular usar trminos como proyecciones
No hay modelado 3D en Game Maker. Adems que no planeo aadir soporte para cargar modelos 3D.
Es preciso que trabajes con cuidado para mantener una velocidad razonable. Adems, esto no est
Rumbo al modo 3D
Rumbo al modo 3D
Si deseas usar el modo 3D antes necesitas poner Game Maker en modo 3D. Despus puedes regresar al modo
Nota que todas las funciones relacionadas con 3D inician con d3d_.
Iniciar el modo 3D dar resultado a los siguientes cambios. Primero que nada hidden surface removal es
cambiado a encendido (usando un z-buffer de 16 bits). Esto significa que por cada pxel en la pantalla slo el
dibujado con el valor z menor (= al valor depth, profundidad) es mostrado. Si las instancias tienen la misma
profundidad es confuso lo que pasar y puedes obtener efectos feos. Asegrate que las instancias que pueden
En segundo lugar, la proyeccin ortogrfica es remplazada por una perspectiva. Esto significa lo siguiente.
proyeccin en perspectiva las instancias que poseen mayor profundidad parecern ms pequeas. Cuando la
profundidad es 0 al viejo tamao (a menos que cambies la proyeccin; velo mas adelante). El punto de vista
para la cmara es puesta a una distancia sobre el cuarto. (Esta distancia es igual al ancho del cuarto; la cual da
una proyeccin por defecto razonable.) Slo las instancias que estn frente la cmara son dibujadas. As que
no uses instancias con una profundidad menor a 0 (o al menos no menor que w donde w (width) es el ancho
En tercer lugar, la coordenada-y vertical es invertida. Mientras que la posicin (0,0) est en la esquina superior-
izquierda de la vista, en el modo 3D la posicin (0,0) est en la posicin inferior-izquierda, lo cual es normal
(false).
Dibujo fcil
Una vez que haz cambiado al modo 3D puedes usar Game Maker como sueles hacerlo (excepto por las
remarcas hechas al principio). Slo los objetos aparecern en diferentes tamaos basados en profundidad.
Incluso puedes usar vistas. Una funcin adicional puede ser usada. Si dibujas cierto nmero de cosas en una
pieza de cdigo quiz quieras cambiar el valor de profundidad entre las primitivas que dibujes. Para esto usa:
Nota que al momento en que una nueva instancia es dibujada la profundidad es devuelta al valor original de
esa instancia.
Dibujando polgonos en 3D
El problema de dibujar de la vieja manera es que un sprite o polgono siempre se encuentra en un plano-xy,
esto es, todas las esquinas tienen la misma profundidad. Para 3D verdadero debes ser capaz de tener vrtices a
(depth). As que debemos especificar coordenadas como (x,y,z). Para esto existe una versin especial de
propio color y valor alpha. Esto te permite crear primitivas con un suave cambio de color y valores
alfa.
dibuja.
Por ejemplo, para dibujar un tetraedro (pirmide de tres lados) situada en el plano z=0 con su punta en z =
Ahora que si quieres usar esto, lo ms posible es que slo vers un triangulo en la pantalla porque la punta del
tetraedro estar en frente del punto de vista. Aparte, usando slo un color, sera difcil de ver las diferentes
caras. Adelante veremos maneras de cambiar el punto de vista. Asignando colores lo cual puede hacerse como
Tambin puedes usar polgonos texturizados en 3D. Funciona de la misma manera como est descrito en las
funciones de dibujado avanzado en la documentacin. Pero en esta ocasin necesitas variantes 3D de las
funciones bsicas. De una cosa te debes dar cuenta. En una textura la posicin (0,0) es la esquina superior-
izquierda. Pero en ocasiones, cuando se usan proyecciones (como se indica adelante), la esquina inferior-
posicin (xtext,ytext) en la textura, mezclando con el color y valor alpha especificados anteriormente.
d3d_vertex_texture_color(x,y,z,xtex,ytex,col,alpha) Aade el
vrtice (x,y,z) a la primitiva con posicin (xtex,ytex) en la textura, mezclando con su propio color y
valor alpha.
dibuja.
As que, por ejemplo puedes usar el siguiente cdigo para dibujar una imagen de fondo que desaparece a la
distancia
{
var ttt;
ttt = background_get_texture(back);
d3d_primitive_begin_texture(pr_trianglefan,ttt);
d3d_vertex_texture(0,480,0,0,0);
d3d_vertex_texture(640,480,0,1,0);
d3d_vertex_texture(640,480,1000,1,1);
d3d_vertex_texture(0,480,1000,0,1);
d3d_primitive_end();
}
Un tringulo tiene una cara frontal y una trasera. La cara frontal est definida para ser el lado donde los
vrtices son definidos en orden contrario al reloj. Normalmente ambos lados son dibujados. Pero si haces una
forma cerrada esto es intil porque el lado trasero del tringulo nunca puede ser visto. En este caso puedes
encender backface culling. Esto salva cerca de la mitad la cantidad del tiempo dibujando pero te deja con la
culling (false).
Existen varias funciones para dibujar formas bsicas, como bloques y paredes. Nota que estas formas tambin
d3d_draw_block(x1,y1,z1,x2,y2,z2,texid,hrepeat,vrepeat) Dibuja
un bloque del color actual con las esquinas opuestas indicadas usando la textura indicada. Usa -1
para no usar una textura. hrepeat indica que tan seguido la textura debe ser repetida a travs
del borde horizontal de cada cara. vrepeat hace lo mismo con el borde vertical.
d3d_draw_cylinder(x1,y1,z1,x2,y2,z2,texid,hrepeat,vrepeat,ce
rrado,steps) Dibuja un cilindro vertical usando el color actual en la caja de colisin indicada
usando la textura indicada. Usa -1 para no usar una textura. hrepeat indica que tan seguido la
textura debe ser repetida a travs del borde horizontal de cada cara. vrepeat hace lo mismo con
el borde vertical. closed indica si se debe cerrar la tapa y fondo del cilindro. steps indica cuantos
una pared vertical en el color actual con las puntas dadas usando la textura indicada. Usa -1 para no
usar una textura. hrepeat indica que tan seguido la textura debe ser repetida a travs del borde
horizontal de cada cara. vrepeat hace lo mismo con el borde vertical.
d3d_draw_floor(x1,y1,z1,x2,y2,z2,texid,hrepeat,vrepeat) Dibuja
un piso (inclinado) en el color actual con las esquinas dadas usando la textura indicada. hrepeat
indica que tan seguido la textura debe ser repetida a travs del borde horizontal de cada cara.
{
var ttt;
ttt = background_get_texture(back);
d3d_draw_block(20,20,20,80,40,200,ttt,1,1);
d3d_draw_block(200,300,-10,240,340,100,ttt,1,1);
}
Viendo el mundo
Por defecto tu vista es a travs del eje-z negativo hacia el medio del cuarto. En ocasiones en juegos 3D deseas
poder cambiar la manera en que miras al mundo. Por ejemplo, en un juego de disparos en primera persona
probablemente deseas tener la cmara mirando desde una posicin un poco sobre el plano-xy a lo largo del
plano-xy. En trminos grficos ests estableciendo la proyeccin correcta. Para cambiar la manera en que
d3d_set_projection(xfrom,yfrom,zfrom,xto,yto,zto,xup,yup,zup
) Defines como mirar en el mundo. Especificas el punto desde dnde mirar, el punto a mirar y el
rumbo ascendente.
Esta funcin requiere alguna explicacin. Para establecer la proyeccin primero necesitas la posicin desde la
cual miras. Esto est indicado por los parmetros (xfrom,yfrom,zfrom). En seguida debes especificar la
direccin que miras. Esto se hace dando un segundo punto al cual mirar. Este es el punto (xto,yto,zto).
Finalmente, incluso puedes rotar la cmara alrededor de la lnea del punto de vista al punto observado. Para
especificar esto debemos tener un rumbo ascendente, esto es, la direccin ascendente en la cmara. Esto es
dado por los ltimos tres parmetros (xup,yup,zup). Permtanme dar un ejemplo. Para mirar a travs del plano-
{
d3d_set_projection(100,100,10,200,100,10,0,0,1);
}
As miras desde el punto (100,100) y 10 sobre el plano en direccin de (200,100). Los puntos del vector up es
la direccin-z que requiere. Para hacer esto ligeramente ms complicado, asumamos que tienes una instancia
en tu cuarto que especifica la posicin de la cmara. Esta tendr una posicin (x,y) actual y una direccin (y
quiz incluso una velocidad). Ahora puedes especificar esto como tu cmara usando el siguiente cdigo:
{
with (obj_camera)
d3d_set_projection(x,y,10,
x+cos(direction*pi/180),y-sin(direction*pi/180),10,
0,0,1);
}
Esto puede lucir algo complicado. Miramos desde la posicin de la cmara (x,y), 10 sobre el piso. Para
determinar un punto en la direccin correcta necesitamos hacer algo de aritmtica. Este punto est indicado por
Una observacin importante! Cuando Game Maker comienza a dibujar un cuarto este pondr el punto de vista
de regreso a la posicin por defecto. As que la primera cosa que necesitas hacer cuando dibuja la escena es
d3d_set_projection_ext(xfrom,yfrom,zfrom,xto,yto,zto,xup,yup
,zup,angle,aspect,znear,zfar) Una versin extendida de esta funcin en la cual
adems especificas el ngulo definiendo el campo de vista, el radio de aspecto entre el tamao
Los parmetros adicionales trabajan como sigue. Si especificaste la posicin de la cmara, el punto a mirar, y el
vector up, puedes todava cambiar qu tan unidos estn los lentes de la cmara. Esto es conocido como el
campo de vista. Un valor razonable es 45 grados y esto es el valor por defecto tomado. Pero puedes cambiar
esto si gustas. Despus puedes especificar la relacin de aspecto entre la proyeccin horizontal y vertical.
Normalmente quieres usar el mismo como la radio de aspecto del cuarto o la vista, p.ej. 640/480. Finalmente
puedes indicar los planos de recorte. Los objetos que son ms cercanos que znear a la cmara no son
dibujados. Similar para objetos ms lejos que zfar. Puede ser importante poner estos parmetros a valores
razonables porque ellos tambin influyen en la precisin de las comparaciones de z. Si usted hace el rango
demasiado grande la precisin empeora. Por defecto usamos 1 y 32000. znear debe ser ms grande que 0!
A veces necesitas temporalmente una proyeccin normal ortogrfica como la usada cuando no hay 3D. Por
ejemplo, cuando quieres dibujar alguna capa. Para esto puedes usar la funcin siguiente:
Un uso estndar para esto es dibujar una capa para p.ej. mostrar el puntaje u otros aspectos. Para hacer esto
ponemos una proyeccin ortogrfica. Tambin debemos desactivar hidden surface removal temporalmente
porque queremos que la informacin sea dibujada independientemente del valor de profundidad actual. El
{
draw_set_color(c_black);
d3d_set_projection_ortho(0,0,room_width,room_height,0);
d3d_set_hidden(false);
draw_text(10,10,'Score: ' + string(score));
d3d_set_hidden(true);
}
Transformaciones
Las transformaciones te permiten cambiar el lugar donde las cosas son dibujadas en el mundo. Por ejemplo, la
funcin para dibujar bloques slo puede dibujar bloques paralelos de eje. Por primera opcin una
transformacin de rotacin puedes crear bloques girados. Tambin los sprites siempre son dibujados paralelos
al plano-xy. Estableciendo una transformacin puedes cambiar esto. Hay dos tipos de funciones: las funciones
transformacin).
d3d_transform_set_rotation_axis(xa,ya,za,ngulo) Pone la
transformacin a una rotacin alrededor del eje indicado por el vector con la cantidad indicada.
vector indicado.
cantidades indicadas.
rotacin alrededor del eje indicado por el vector con la cantidad indicada.
Comprende que la rotacin y el escalamiento son con respecto al origen del mundo, no al respecto al objeto
que debe ser dibujado. Si el objeto no est en el origen este tambin se mover a un lugar diferente, que no es
lo que queremos. As para p.ej. hacer girar un objeto sobre su propio eje-x, primero debemos trasladar al
origen, despus hacerlo girar, y finalmente trasladarlo de regreso a su posicin. Esto es para qu son las
Los ejemplos siguientes podran explicar esto mejor. Asumiendo que tenemos un sprite spr que queremos
dibujar en la posicin (100,100,10). Podemos usar el cdigo siguiente para hacer esto
{
d3d_transform_set_translation(100,100,10);
draw_sprite(spr,0,0,0);
d3d_transform_set_identity();
}
Nota que porque usamos una transformacin ahora deberamos dibujar el sprite en la posicin (0,0). (Esto
asume que la instancia actual tiene una profundidad de 0! Si no estas seguro, primero pon la profundidad.) Si
usramos esto en nuestro tirador en primera persona no veramos el sprite. La razn es que es todava paralelo
al plano-xy. Queremos hacerlo girar ms de 90 grados a lo largo del eje-x (o el eje-y). Entonces tenemos que
aadir una rotacin. Recuerda el orden: primero debemos hacer girar el sprite y luego transformarlo. Entonces
{
d3d_transform_set_identity();
d3d_transform_add_rotation_x(90);
d3d_transform_add_translation(100,100,10);
draw_sprite(spr,0,0,0);
d3d_transform_set_identity();
}
En ocasiones quieres guardar temporalmente la transformacin actual, por ejemplo para aadir una
transformacin adicional y luego restaurar a la anterior (esto a menudo pasa dibujando modelos jerrquicos).
Para este fin puedes empujar la transformacin actual sobre un montn y luego sacarlo del montn para
hacerlo la transformacin actual de nuevo. Las funciones siguientes existen para esto:
Devuelve si hay espacio sobre el montn para empujarlo all (si olvidas sacar la transformacin en
quita del montn. Devuelve si haba tras una transformacin sobre el montn.
Niebla
La niebla puede ser usada en juegos de 3D para hacer que los objetos a la distancia luzcan borrosos o incluso
desaparecer. Esto ayuda en la creacin de la atmsfera y hace posible el no dibujar los objetos que estn a lo
empleo de niebla. color indica el color de la niebla. principio indica la distancia a la cual la niebla debe
comenzar. fin indica la distancia a la cual la niebla es mxima y nada puede ser visto ms all.
Iluminacin
Las escenas que dibujas con las funciones anteriores parecen bastante planas porque no hay luz alguna. El
color si las caras son iguales, independiente de su orientacin. Para crear escenas que luzcan ms realistas
debes permitir la iluminacin y poner las luces en los sitios correctos. La creacin de escenas correctamente
Usando la iluminacin, para cada vrtice de un polgono el color es determinado. Despus, el color de los
pxeles internos est basado en el color de estos vrtices. Hay dos modos que puede ser hecho: El polgono
entero consigue el mismo color, o el color suavemente es interpolado sobre el polgono. Por defecto smooth
Para usar la iluminacin obviamente tienes que definir luces. Dos diferentes luces existen: luces direccionales
(como el sol), y luces posicinales. La luz tiene un color. (Slo soportamos la luz difusa, no la reflexin
ind es el ndice de la luz (usa un pequeo nmero positivo). (dx,dy,dz) es la direccin de la luz. col es
el color de la luz (a menudo quieres usar c_white. Esta funcin no enciende la luz.
es el ndice de la luz (usa un pequeo nmero positivo). (x,y,z) es la posicin de la luz. rango indica
qu lejos brilla la luz. La intensidad de la luz se disminuir sobre este rango. col es el color de la luz.
ind.
La manera en que un objeto refleja la luz depende del ngulo entre la direccin de la luz y el normal de la
superficie, es decir el vector que seala lejos de la superficie. De ah, para crear objetos iluminados no slo
tienes que proporcionar la posicin de los vrtices, sino tambin sus normales. Para estas cuatro funciones
(x,y,z) a la primitiva, con vector normal (nx,ny,nz), y con su propio color y valor alpha.
d3d_vertex_normal_texture(x,y,z,nx,ny,nz,xtex,ytex) Aade el
vrtice (x,y) a la primitiva, con vector normal (nx,ny,nz), y con la posicin (xtex,ytex) en la textura,
d3d_vertex_normal_texture_color(x,y,z,nx,ny,nz,xtex,ytex,col
,alpha) Aade el vrtice (x,y) a la primitiva, con vector normal (nx,ny,nz), y con la posicin
Note que para las formas bsicas que puedes dibujar las normales automticamente son puestas
correctamente.
Creando modelos
Cuando necesitas dibujar modelos complejos es muy costoso llamar a todas las funciones diferentes una y otra vez en
cada step. Para evitarte esto, puedes crear modelos. Un modelo consiste de un nmero de primitivas y formas de
dibujo. Una vez que creas un modelo puedes dibujarlo en diferentes lugares y en diferenes posiciones con una simple
Antes de listar las funciones de modelos es importante resaltar un aspecto: el manejo de texturas. Como ya se ha
explicado antes, las texturas se toman de sprites y backgrounds. Los ndices de las texturas pueden ser diferentes en
cada momento, por lo que los modelos no contienen informacin sobre ellas. Slo cuando dibujas un modelo debes
especificar informacin sobre la textura. De esta forma, slo puedes usar una textura en cada modelo. Si necesitas usar
ms texturas puedes combinar varias (y tener mucho cuidado con las coordenadas de cada una) o usar mltiples
modelos. La ventaja de esto es que puedes dibujar sencillamente el mismo modelo con diferentes texturas.
Para crear, cargar, guardar y dibujar modelos se usan las siguientes funciones:
d3d_model_create() Crea un nuevo modelo y devuelve su ndice, que debe ser usado en las dems
funciones.
aplicar al modelo. Usa -1 para no usar texturas. Si quieres rotar o escalar el modelo usa las rutinas de transformacin
ya hemos visto en los captulos anteriores, slo que en lugar de especificar una textura ahora daremos el ndice del
modelo.
d3d_model_vertex_texture_color(ind,x,y,z,xtex,ytex,col,alpha) Aade el
(x,y,z) al modelo con el vector normal (nx,ny,nz) y sus propios valores de color y transparencia.
d3d_model_vertex_normal_texture(ind,x,y,z,nx,ny,nz,xtex,ytex) Aade el
vrtice (x,y,z) al modelo con el vector normal (nx,ny,nz) y coordenadas de textura (xtex, ytex).
d3d_model_vertex_normal_texture_color(ind,x,y,z,nx,ny,nz,xtex,ytex,col
,alpha) Aade el vrtice (x,y,z) al modelo con el vector normal (nx,ny,nz) con valores de color y textura.
Adems de primitivas tambin puedes aadir formas al modelo. Las funciones son anlogas a las ya vistas usando el
modelo.
d3d_model_cylinder(ind,x1,y1,z1,x2,y2,z2,hrepeat,vrepeat,closed,steps)
Aade un cilindro al modelo.
d3d_model_cone(ind,x1,y1,z1,x2,y2,z2,hrepeat,vrepeat,closed,steps) Aade
un cono al modelo.
elipsoide al modelo.
Crear script.
Lo primero antes de crear un script hay que entender que es un
script. Un script es un trozo de codigo que nos sirve por ejemplo para
acortar una accion que usaremos en varios objetos para no tener qu
ir todo el rato copiando y pegando el codigo y resumirlo en una sola
linea. Por ejemplo en tu script que se llama draw pones:
draw_sprite(pers,1,x,y) y cuando quieras aplicarlo en vez de poner
draw_sprite pones draw. En este ejemplo no nos sirve de mucho pero
mas adelante vereis como si influye.
Como una tabla de una lnea que espera valores.Esta puede contener
los valores que queramos solo que aqu la he hecho de 5 celdas para
ahorrar espacio. A los valores de la array podemos acceder de esta
manera:
Array[1]=7
Array[2]=672
Array[5]=1
7 672 1
Array[1]-=3
Array[3]=-4
4 -4 1
mediana=mean(numero[1],numero[2],numero[3],numero[4],numero
[5],numero[6],numero[7],numero[8],numero[9],numero[10])
draw_text(50,50,string(mediana))
[HP]
hp = 375
maxhp = 500
[nivel]
exp = 5075
nivel = 4
ini_open(fname);
Operaciones de escritura:
Operaciones de lectura:
ini_close();
Bucles
Hola a todos, hoy explicar los bucles.
Bucle do while.
Bucle for.
Sentencia repeat.
As, puede decirse que una FSM es un sistema que tiene varios
estados, pasa de uno a otro por unas transiciones y realiza una serie
de acciones. Por ejemplo, una bombilla puede tener dos estados:
encendida y apagada. Para pasar de un estado a otro (transicin),
hay que accionar un interruptor. Por ltimo, la bombilla puede
realizar acciones cuando se encuentre en un estado concreto. Por
ejemplo, si est encendida realizar la accin de iluminar una
habitacin.
Estados
Los estados son el ncleo de las FSMs. Una FSM puede tener tantos
estados como definamos, pero solamente podr estar en uno de ellos
a la vez. En el ejemplo anterior de la bombilla, sta puede estar
encendida o apagada, pero no puede estar encendida y apagada a la
vez. Es decir, los estados de la bombilla sern encendida y
apagada.
Transiciones
Las transiciones llevan a la FSM de un estado a otro. Para que ocurra
una transicin, deben cumplirse unas condiciones.
Ejemplo:
En nuestro RPG hay un minero que tiene 2 estados: buscar oro en la
mina y descansar. Cuando est buscando oro el minero se va
cansando. Al llegar a un nivel de fatiga, el minero pasar al estado de
descanso hasta que recupere las fuerzas. As, tenemos 2 condiciones:
Si ests cansado->Descansa
Si te has recuperado->Vuelve a buscar oro
Ejemplo:
El minero del ejemplo anterior tiene ahora 3 estados:
Buscar oro
Descansar
Comer
El paso de un estado a otro se define con esta tabla de transiciones:
Condicin\Estado actual Buscar oro Descansar Comer
Cansado Descansar X X
Recuperado X Buscar oro X
Hambriento Comer Comer X
Saciado X X Buscar oro
Ejemplo:
El minero puede realizar la accin encender linterna, si se
encuentra buscando oro en la mina y todo est muy oscuro. Es decir,
si se encuentra en el estado Buscar oro. Sin embargo esta accin no
tendr sentido si se encuentra en los estados Comer o Descansar.
Ejemplo:
Si el minero est en el estado Buscar oro realizar la accin Cavar
para cavar y buscar oro. Esta accin se realizar regularmente, o sea
que es una accin de estado.
Cuando el minero va a descansar, antes de tumbarse a dormir se
quita las botas para estar ms cmodo (accin Descalzarse).
Cuando est durmiendo ronca (accin Roncar) y cuando se despierta
se vuelve a poner las botas slo si va a volver a buscar ms oro
(accin Calzarse). Al despertarse, el minero siempre soltar un gran
bostezo (accin Bostezar). As:
La accin Descalzarse es una accin de entrada, ya que la
ejecutaremos siempre una vez al entrar en el estado Descansar.
La accin Roncares una accin de estado, ya que la
ejecutaremos repetidamente mientras estemos en el estado
Descansar.
La accin Calzarse es una accin de transicin, ya que slo la
ejecutaremos una vez si pasamos del estado Descansar al estado
Buscar oro.
La accin Bostezares una accin de salida, ya que la
ejecutaremos siempre una vez al salir del estado Descansar.
Estados globales
Nuestra FSM puede tener unos estados que sean capaces de
interrumpir los dems y ejecutarse inmediatamente. Normalmente
son estados que realizan una accin y luego vuelven al estado que se
estaba ejecutando.
Ejemplo:
Nuestro minero acaba de ganar un nuevo estado global: Ir al bao.
Este estado tiene prioridad absoluta, cuando el minero tenga ganas
de ir al bao (es decir, cuando se cumpla la condicin que lanza la
transicin a este estado, por ejemplo vejiga llena) dejar lo que
est haciendo e ir al bao de inmediato. Despus, volver a lo que
estaba haciendo, como si nada hubiera pasado.
Consideraciones finales
Las mquinas de estados finitos son muy utilizadas pese a ser un
sistema algo viejo. Las razones principales son las siguientes:
Son rpidas y fciles de implementar.
Son fciles de depurar para buscar errores
Usan poco tiempo de procesamiento, debido a su sencillez
Son intuitivas y faciles de comprender por la mente humana
Son flexibles, se pueden expandir facilmente y se acoplan muy bien
a otros mtodos (redes neuronales, algoritmos genticos...) para
crear sistemas hbridos
Los juegos profesionales utlizan FSMs en todo momento,
combinndolas adems con otros mtodos para tareas que requieran
un nivel de inteligencia ms desarrollado. Las FSMs se basan en
reglas simples (condiciones if), por ello se suele decir que el sistema
realmente no "piensa". Sin embargo, una FSM correctamente
desarrollada y detallada puede dar esa impresin. Su gran rapidez
hace que sean perfectas para tareas sencillas y repetitivas en las que
no se necesite un alto nivel de inteligencia, como por ejemplo buscar
caminos, realizar tareas repetitivas...Adems, para las tareas que
requieran inteligencia ms avanzada se pueden integrar
perfectamente con otros mtodos.
Un ejemplo clarsimo es el juego Los Sims, en el que prcticamente
todo el comportamiento de los personajes se ha programado con
FSMs.
Descripcin general
Vamos a hacer un juego de disparos visto desde arriba en el que el
jugador puede moverse por un mapa enorme buscando la salida
mientras se enfrenta a multitud de enemigos. Ser una especie de
Quake pero visto desde arriba.
Paredes
Creamos un objeto y lo llamamos objPared. Creamos un sprite que
ser un cuadrado de 32x32 de color negro y no transparente y se lo
asignamos a este objeto.
Jugador
El jugador ser una mquina de estados finitos. Hasta ahora
habamos visto cmo usar la arquitectura de las FSM en personajes
controlados por el ordenador. Sin embargo ahora vamos a usar una
FSM para un personaje controlado por el jugador. Recordad que las
FSM se rigen por condiciones que hacen que el personaje pase de un
estado a otro. Primero, debemos definir sus caractersticas.
execute_string(estado+"(1)");
image_angle = direction;//rotar el sprite (s?lo GM6)
switch argument0{
case 0://Entrar
//Aqu podemos hacer que el personaje grite, o crear una explosin...
tiempoMuerte = tiempoMuerteMax;
sprite_index = sprPlayerMuerto;
break;
case 1://Ejecutar
tiempoMuerte -= 1;
if (tiempoMuerte = 0){
if (vidas > 0){
vidas -= 1;
salud = saludMax;
estado = "Vivo";
execute_string(estado+"(0)");
}else game_end();
}
break;
case 2://Salir
break;
case 3://Transicin
break;
}
switch argument0{
case 0://Entrar
sprite_index = sprPlayerVivo;
break;
case 1://Ejecutar
if (salud <= 0){
estado = "Muerto";
execute_string(estado+"(0)");
exit;
}
scrAndar(keyboard_check(vk_up), keyboard_check(vk_down),
keyboard_check(vk_left), keyboard_check(vk_right), velocidad);
scrDisparar(keyboard_check(ord('C')));
break;
case 2://Salir
break;
case 3://Transicin
break;
}
if (izquierda) direction += 5;
else if (derecha) direction -= 5;
scrAndar(keyboard_check(ord('W')),
keyboard_check(ord('S')),keyboard_check(ord('A')),keyboard_check(
ord('D')), velocidad);
velocidad = 4;
//scrDisparar(disparar)
if (tiempoDisparo = 0){
if (argument0){
with (instance_create(x, y ,objBala)){
speed = 8;
direction = direction;
parent = id;
}
tiempoDisparo = tiempoDisparoMax;
}
}else tiempoDisparo -=1;
tiempoDisparoMax = 15;
tiempoDisparo = 0;
Listo, este script crea una bala que se mueve a una velocidad de 8
pxeles por step en la direccin en la que mire la instancia que llame
al script. Adems, le asignamos la id de la instancia a la variable
parent de la bala recin creada. Esto nos servir para poder sabe
luego quin ha disparado cada bala.
Ya hemos terminado con el jugador, ha sido sencillo, no? ;)
Balas
Lgicamente, para poder disparar necesitamos crear un objeto y
llamarlo objBala. Adems, creamos un sprite que ser un crculo rojo
de 5x5 y con el centro en (2,2). En este nuevo objeto, vamos al
Evento de Colisin con el objeto objPared y ponemos el siguiente
cdigo:
instance_destroy();
Enemigos (I)
Por fn hemos llegado al meollo del asunto: los enemigos. Como
siempre, empezamos definiendo sus estados:
Atacar: en este estado el enemigo se acercar al jugador hasta
una distancia en la que empezar a disparar. Si su salud es menor
que la mitad de la salud del personaje mandar un mensaje por radio
a la instancia ms cercana para que venga a ayudarle.
Huir: Si su salud es menor que la cuarta parte de la salud del
jugador intentar huir a un lugar seguro siempre que no est solo.
Patrullar: el enemigo simplemente ir caminando por el laberinto.
Ayudar: cuando reciba una petici?n de ayuda ir corriendo a
socorrer a su compaero en apuros.
EnemigoMuerto: en esta ocasin ser un estado global que
podr interrumpir todos los dems.
/*CARACTERISTICAS DE LA FSM*/
estado = "Patrullar";
estado_global = "";
mensaje = -1;
//scrJugadorVisible()
if (instance_exists(objPlayer)){
var target;
target = instance_nearest(x, y, objPlayer);
if ((collision_line(x, y, target.x, target.y, objPared, false, true) <
0)&& (abs(point_direction(x, y, target.x, target.y)-direction) <= 60))
return true;
else return false;
}else return false;
}
image_angle = direction;
switch argument0{
case 0://Entrar
break;
case 1://Ejecutar
if ((scrJugadorVisible())||(recibirBalazo)){
recibirBalazo = false;
direction = point_direction(x, y, objPlayer.x, objPlayer.y);
estado = "Atacar";
}else if (mensaje = 0){
estado = "Ayudar";
execute_string(estado+"(0)");
}else scrVagar();
break;
case 2://Salir
break;
case 3://Transicin
break;
}
//scrVagar()
if (place_meeting(x+2*velocidadNormal*cos(degtorad(direction)), y-
2*velocidadNormal*sin(degtorad(direction)), objPared)){
var i;
for (i=-1;i<=1;i+=2){
if
(!place_meeting(x+2*velocidadNormal*cos(degtorad(direction+i*90)
), y-2*velocidadNormal*sin(degtorad(direction+i*90)), objPared)){
direction += i*90;
break;
}else if (i = 1) direction += 180;
}
}
x += velocidadNormal*cos(degtorad(direction));
y -= velocidadNormal*sin(degtorad(direction));
other.salud -=1;
other.recibirBalazo = true;
instance_destroy();
switch argument0{
case 0://Entrar
break;
case 1://Ejecutar
if (!scrJugadorVisible()) estado = "Patrullar";
else if ((scrDebil(4))&&(scrSolo())){
estado = "Huir";
execute_string(estado+"(0)");
}else{
if (!scrAcercarse(objPlayer)) scrPelear();
if ((scrDebil(2))&&(scrSolo())) scrEnviarMensaje(scrNearestFriend());
}
break;
case 2://Salir
break;
case 3://Transicin
break;
//scrDebil(energia)
if (instance_exists(objPlayer)){
}
return false;
Navegacin
Creamos un objeto y lo llamamos objControlador. Este objeto se
encargar de calcular los caminos libres que seguirn los enemigos.
Su funcionamiento ser el siguiente: en un momento determinado un
enemigo le pedir que calcule un camino para ir de un lugar a otro.
Este objeto calcular el camino y lo devolver como una path
asociada a la instancia que le hizo la peticin. Ahora, la instancia slo
tiene que seguir ese path y llegar a su destino de forma segura. Para
realizar todo esto vamos a usar la versin de GM del famoso
algoritmo A*.
Con esto creamos una rejilla que divide el room en celdas del tamao
de los enemigos y marcamos las celdas ocupadas por una pared
como prohibidas.
Si ponis este cdigo en el Evento Draw de este objeto podris ver
la rejilla con las celdas marcadas, que coincidirn con donde habis
puesto las paredes:
mp_grid_draw(rejilla);
//scrAcercarse(objetivo)
if (instance_exists(argument0)){
}
return false;
giro *= -1;
esquiva = esquivaMax;
}else esquiva -= 1;
if
(place_meeting(x+2*velocidadNormal*cos(degtorad(direction+giro)),
y-2*velocidadNormal*sin(degtorad(direction+giro)),objPared))
esquiva = 0;
else{
x += velocidadNormal*cos(degtorad(direction+giro));
y -= velocidadNormal*sin(degtorad(direction+giro));
}
scrDisparar(true);
giro = 90;
tiempoGiroMax = 150;
tiempoGiro = tiempoGiroMax;
Enemigos (II)
El siguiente estado es Huir. En este estado el enemigo intentar huir
hasta la posicin del compaero ms cercano:
switch argument0{
case 0://Entrar
break;
case 1://Ejecutar
if (!scrAcercarse(scrNearestFriend())) estado = "Patrullar";
break;
case 2://Salir
break;
case 3://Transici?n
break;
Listo!
Ahora creamos el estado global EnemigoMuerto:
switch argument0
{
case 0://Entrar sprite_index = sprEnemyMuerto;
break;
case 1://Ejecutar
break;
case 2://Salir
break;
case 3://Transicin
break;
}
Sistema de mensajes
El sistema de mensajes estar controlado por el objeto
objControlador que ya habamos creado. En su Evento Create
definimos el sistema:
mensajes = ds_queue_create();
mensaje_id=0
mensaje_remitente=ds_map_create();
mensaje_destino=ds_map_create();
//scrEnviarMensaje(Destino)
var Id, Remitente, Destino;
Id = objControlador.mensaje_id;
Remitente = id;
Destino = argument0;
ds_queue_enqueue(objControlador.mensajes, Id);
//Aadir las caractersticas asociadas al mensaje a los mapas de
memoria
ds_map_add(objControlador.mensaje_remitente, Id, Remitente);
ds_map_add(objControlador.mensaje_destino, Id, Destino);
if !ds_queue_empty(mensajes){
var Id, Remitente, Destino;
Id = ds_queue_dequeue(mensajes);
Remitente = ds_map_find_value(mensaje_remitente,Id);
ds_map_delete(mensaje_remitente,Id);
Destino = ds_map_find_value(mensaje_destino,Id);
ds_map_delete(mensaje_destino,Id);
Destino.mensaje = 0;
Destino.remitente = Remitente;
}
scrRecibirMensaje();
switch argument0{
case 0://Entrar
mensaje = -1;
break;
case 1://Ejecutar
if (!scrAcercarse(remitente)){
remitente = 0;
estado = "Patrullar";
}
break;
case 2://Salir
break;
case 3://Transicin
break;
}
Creando un nivel
Lo nico que nos falta es crear un nivel y ponernos a jugar. Creamos
una room y en Creation code inicializamos el room, creando el
objeto controlador, el objeto del jugador, inicializando las
propiedades de la vista y rodeando el nivel de paredes:
var w, h;
w = sprite_get_width(sprPared);
h = sprite_get_height(sprPared);
instance_create(0, 0, objControlador);
var i;
for (i=0;i
instance_create(i, 0, objPared);
instance_create(i, room_height-h, objPared);
}
for (i=0;i
instance_create(0, i, objPared);
instance_create(room_width-w, i, objPared);
}
Conclusiones
Hemos creado un Quake sencillo en 2D basndonos en la arquitectura
de FSM. Hemos usado un montn de scripts, de forma que los
estados de las entidades que tenan ms o menos esta forma:
switch estado{
case 0:
break;
case 1:
if (condicion1){
estado = "NuevoEstado1";
}else if (condicion2){
estado = "NuevoEstado2";
}else{
//acciones
}
break;
}
Descripcin
La Central de Polica podr enviar diferentes tipos de mensajes:
"Atraco en el banco": un aviso que har que el polica deje lo
que est haciendo y vaya al banco a parar el atraco.
"Informacin sobre un criminal": con este mensaje el polica
recibir un aviso para ir a la comisara y recibir informacin sobre un
criminal, lo que le facilitar su captura. El Polica slo recibir este
mensaje si se encuentra patrullando.
Sistema de mensajes
Antes de definir el sistema de mensajera, hay que describir las
caractersticas que tendrn los mensajes en s:
Id: identificador del mensaje.
Remitente: quien lo enva (id de la instancia que enva el
mensaje).
Destino: a quin va dirigido (id de la instancia que recibir el
mensaje).
Tipo: tipo de mensaje (0=Aviso de atraco, 1=Recibir informacin,
2=Avisar de un delito").
Enviar mensajes
Con todo esto, ya podemos crear el script enviarMensaje que
servir para (quin lo dira? :P) enviar mensajes. Este script ser
ejecutado directamente por las instancias del polica y la central:
[code]
//enviarMensaje(Destino, Tipo)
var Id, Remitente, Destino, Tipo;
Id = obj_ControlMensajes.mensaje_id;
Remitente = id;
Destino = argument0;
Tipo = argument1;
var prioridad;
switch Tipo{//Calcular la prioridad del mensaje dependiendo del tipo
case 0:
prioridad = 3;
break;
case 1:
prioridad = 1;
break;
case 2:
prioridad = 2;
break;
}
/Aadir el mensaje a la cola de prioridad
ds_priority_add(obj_ControlMensajes.mensajes, Id, prioridad);
//Aadir las caracter?sticas asociadas al mensaje a los mapas de
memoria
ds_map_add(obj_ControlMensajes.mensaje_remitente, Id,
Remitente);
ds_map_add(obj_ControlMensajes.mensaje_destino, Id, Destino);
ds_map_add(obj_ControlMensajes.mensaje_tipo, Id, Tipo);
//Mostrar el mensaje
show_message("Mensaje
enviado:#"+obj_ControlMensajes.mensaje_texto[Tipo]);
[/code]
Observad que para enviar un mensaje slo necesitamos pasarle 2
argumentos al script: Destino y Tipo. Esto es debido a que el valor
de la Id del mensaje se coge de la variable
obj_ControlMensajes.mensaje_id y por tanto no hace falta pasrsela
como argumento al script ya que ste podr acceder a ella
directamente. Como slo har 1 nica instancia del objeto
obj_ControlMensajes no habr lugar a errores. A su vez, el
Remitente ser la id de la instancia que enva el mensaje, es decir,
la id de la instancia que ejecute el script enviar_mensaje(). Por lo
tanto, esta variable tambin ser accesible directamente desde el
script.
El siguiente paso ser (cmo no? :P) crear el sistema para recibir y
leer los mensajes.
if (estado_global != ""){
execute_string(estado_global+"(1)");
}else{
cansancio += 1;
if (cansancio >= cansancio_max){?
estado_global = "IrACasaYDormir";?
execute_string(estado_global+"(0)");?
}else{
if (mensaje=0){
estado = "IrAlBancoYDetenerAtraco";
execute_string(estado+"(0)");
mensaje = -1;
}
execute_string(estado+"(1)");
}
}
[/code]
El polica poda recibir 2 tipos de mensajes:
0: Atraco en el banco
1: Informacin sobre un criminal
La Central de polica
La Central de polica ser algo muy sencillo: bsicamente mandar
mensajes al polica aleatoriamente y enviar unidades cuando el
polica se lo pida.
Y el script Vigilar:
[code]
switch argument0{
case 0://Entrar
break;
case 1://Ejecutar
if (mensaje = 2){
estado = "EnviarUnidad";
mensaje = -1;
}else{
if (tiempo_envio>1){
tiempo_envio -= 1;
}else{
enviarMensaje(obj_policia,floor(random(2)));
tiempo_envio = 15+floor(random(15));
}
}
break;
case 2://Salir
break;
case 3://Transicin
break;
}
[/code]
Mejoras y ampliaciones
En el ejemplo que hemos creado los mensajes se envan y reciben
instant?neamente. Podis aadir mensajes con retardo, de forma que
el destinatario no los reciba inmediatamente sino que se guarden en
la cola durante un tiempo (sera una nueva caracterstica de los
mensajes y requerira de otro mapa de memoria). As podrais ver
cmo funciona el sistema cuando hay varios mensajes circulando a la
vez.
Crear varias instancias de los policas y hacer que se enven
mensajes entre ellos. Por ejemplo, hacer que pidan ayuda al polica
con mayor agresividad.
Ahora que ya tenemos un objeto controlador
(obj_ControlMensajes) del slo existir un instancia podemos
quitar el cdigo para salir del juego pulsando Escape del evento step
del polica y ponerlo en el evento step de este objeto.
Consideraciones finales
Los sistemas de mensajes son una caracter?sica muy importante en
los juegos. Seguramente no habais odo hablar antes de ellos, pero
seguro que os suenan si los llamo por su otro nombre: Eventos. As
es, los juegos profesionales utilizan este sistema para crear y
controlar los eventos del juego, como en GM. Cualquier objeto que
use el sistema de mensajes podr comunicarse con los dems. Con
unos ejemplos ver?is muy clara la importancia de esto:
Cuando un personaje intenta abrir una puerta, le manda un
mensaje a sta dicindole "Abrete!". La puerta recibe el mensaje y
puede abrirse o responder con otro mensaje diciendo que est
cerrada y que para abrirla necesita una llave.
Un jugador empuja una caja. La caja recibe el mensaje de que est
siendo empujada y debe moverse.
Una bala golpea a un enemigo. La bala manda un mensaje al
enemigo diciendo que debe morir y ste cambia su animacin, emite
un grito...
Un jugador de un equipo de ftbol avanza con el baln. Puede
mandar un mensaje a los delanteros para que se desmarquen, otro a
los defensas para que cubran su posicin y otro a un compaero para
avisarle de que le va a pasar el baln.
Planificacin
Antes de nada, hay que definir primero los estados de nuestro
polica:
BuscarYAtraparCriminales: en este estado el polica buscar
criminales. Si encuentra uno, intentar atraparlo.
EntregarCriminal: cuando detenga a un criminal, el polica lo
llevar a la comisara.
IrACasaYDormir: ir a casa cuando est cansado a echar un
sueecillo. Este ser un estado global, capaz de interrumpir
cualquier otro estado para ejecutarse.
IrAlBarYBeber: ir al bar a tomar unas merecidas copas.
Muy bien, ahora slo nos falta hacer que cada estado se ejecute. Para
ello, en el Evento Step ponemos lo siguiente:
[code]
if (estado_global != ""){
?execute_string(estado_global+"(1)");
}else{
?execute_string(estado+"(1)");
}
[/code]
Veremos este cdigo con ms detalle cuando creemos la lgica de los
estados, pero de modo genreal podemos decir que hace lo siguiente:
Si hay un estado global (if (estado_global != "")) se ejecuta. Si no,
ejecutamos el estado actual.
Para ello, tenemos que crear unos scripts con los nombres de los
estados. Dentro de estos scripts definiremos las acciones que
realizar cada uno.
Acciones
Como ya vimos en el tutorial bsico sobre FSMs, las acciones
dependen del estado actual. Tambin vimos que haba varios tipos de
acciones (de entrada, de salida, de transicin y de ejecucin). Por
ello, cada estado se comportar de forma diferente al entrar en l,
salir de l, pasar a otro estado o ejecutarse normalmente.
Creamos un script llamado BuscarYAtraparCriminales y ponemos
lo siguiente:
[code]
switch argument0{
case 0://Entrar
break;
case 1://Ejecutar
break;
case 2://Salir
break;
case 3://Transicin
break;
}
[/code]
Este script tendr 1 argumento, que controlar las acciones que se
ejecuten. As:
Si argument0 = 0 se ejecutarn las acciones de entrada.
Si argument0 = 1 se ejecutarn las acciones de ejecucin.
Si argument0 = 3 se ejecutarn las acciones de transicin.
En este estado no habr acciones de salida.
Describimos las acciones que se realizarn en el estado
BuscarYAtraparCriminales:
Al entrar en el estado el polica nos dir cuantas detenciones le
faltan por hacer para cubrir su cupo.
Al ejecutar el estado el polica intentar detener a los criminales.
Si lo consigue, los llevar a la comisara, si no, aumentar su
agresividad.
Al salir del estado el polica no har nada, es decir, no habr
acciones de salida.
En este estado no habr acciones de transicin.
Ahora que ya hemos definido las acciones, las metemos en el script:
[code]
switch argument0{
case 0://Entrar
show_message("Me faltan "+string(detenciones_max-
detenciones)+" detenciones");
break;
case 1://Ejecutar
agresividad_criminal = floor((random(10)));
if (agresividad >= agresividad_criminal){
show_message("He detenido a un criminal");
detenciones += 1;
//CAMBIAMOS DE ESTADO
estado = "EntregarCriminal";
execute_string(estado+"(0)");//Ejecutar las acciones de
entrada al nuevo estado
}else{
show_message("Se me ha escapado un criminal. El tenia
agresividad "+string(agresividad_criminal)+" y yo solo
"+string(agresividad));
agresividad += 1;
}
break;
case 2://Salir
break;
case 3://Transicin
break;
}
[/code]
Casi hemos terminado, slo nos queda hacer que el polica se vaya
cansando y que lance el estado global IrACasaYDormir cuando est
demasiado cansado. Volvemos al Evento Step y modificamos el
cdigo que tenamos:
[code]
/*SI MANTENEMOS PULSADO ESCAPE SALIMOS DEL JUEGO*/
if (keyboard_check(vk_escape)){
game_end();
}
if (estado_global != ""){
execute_string(estado_global+"(1)");
}else{
cansancio += 1;
if (cansancio >= cansancio_max){
estado_global = "IrACasaYDormir";
execute_string(estado_global+"(0)");
}else{
execute_string(estado+"(1)");
}
}
[/code]
Ampliaciones
Podis practicar con este ejemplo, a?adiendo cosas como:
Una nueva caracterstica llamada lugar que indique dnde se
encuentra el polica en cada momento. As, esta variable podr tener
los valores "casa", "comisaria", "calle" y "bar". Hacer que el
polica diga cundo va de un sitio a otro (tendris que usar las
acciones de entrada y salida de cada estado). Por ejemplo, en la
accin de salida del estado BuscarYAtraparCriminales el polica
dir "Me voy a la comisaria" (si es que va a la comisara ;) ) y en la
accin de entrada del estado EntregarCriminal dir algo como "Ya
estoy en la comisaria".
Nuevos estados, como Comer, Investigar (para encontrar
informacin sobre dnde se encuentran los criminales)...Tendris que
definir nuevas caractersticas para controlar estos estados, por
ejemplo hambre para controlar el estado Comer.
Comportamiento avanzado: por ejemplo, aadiendo el estado
Investigar podis poner una nueva caracterstica llamada
inteligencia. Si el polica tiene ms inteligencia que agresividad tal
vez decida investigar un poco antes de intentar detener criminales. Si
fracasa al intentar detener un criminal podis hacer que su
inteligencia se reduzca.
Hacer que la agresividad se reduzca despus de descansar y que la
inteligencia aumente. Tambin podis hacer que el polica descanse
un tiempo aleatorio, as no ser capaz de recuperarse del todo, la
agresividad no se reducir siempre lo mismo ni la inteligencia crecer
lo mismo...de esta forma las caractersticas del polica cambiarn
constantemente y cada vez se comportar de una manera diferente!
Consideraciones finales
De una manera sencilla hemos creado una IA, bastante simple pero
muy robusta. Adems, se puede ampliar muy facilmente aadiendo
nuevos estados y acciones.
En la prxima entrega introduciremos la Central de Polica, capaz de
enviar mensajes al polica dndole informacin sobre los
criminales...por ejemplo, podremos despertar al polica con un aviso
urgente para que vaya a detener el robo de un banco!
Listas.
veremos qu son las listas, cmo se usan y porqu resultan una
herramienta tan poderosa.
Definicin
Extrado del Manual Online de CGM:
A priori se puede decir que una lista es como un array: una coleccin
de valores que se guardan en orden. Sin embargo las listas poseen
unas funciones que hacen que sean una de las estructuras ms
utilizadas para el manejo de grandes cantidades de datos de manera
eficiente.
Para poder usar una lista, primero debemos crearla con la funcin
ds_list_create(). Esta funcin nos devuelve la id de la nueva lista
creada, que tendremos que usar para llamar a las dems funciones
de la lista. Para conocer las propiedades de la lista tenemos 2
funciones:
ds_list_size(idLista) Devuelve el nmero de valores en la lista.
ds_list_empty(idLista) Devuelve true si la lista est vaca.
Para saber si la lista est vaca tenemos 2 opciones: llamar a la
funcin ds_list_empty(idLista) o chequear si su tamao es igual a 0:
//Este cdigo
if (ds_list_empty(idLista){...}
Con estas funciones ya podemos crear una lista, ver su tamao, ver
si est vaca y eliminarla. Ahora veremos las funciones para usar
realmente las listas.
Funciones
ds_list_add(idLista,val) Inserta el valor al final de la lista.
ds_list_insert(idLista,pos,val) Inserta el valor en la posicin pos. La
primera posicin es 0 y la ltima es igual al tamao de la lista menos
1.
ds_list_replace(idLista,pos,val) Reemplaza el valor en la posicin pos
por val.
ds_list_delete(idLista,pos) Elimina el valor en la posicin pos.
ds_list_find_index(idLista,val) Devuelve la posicin en la lista del
valor val. Si no encuentra el valor en la lista devuelve -1.
ds_list_find_value(idLista,pos) Devuelve el valor en la posicin pos.
ds_list_sort(idLista,ascend) Ordena los valores de la lista. Si ascend
es true o 1 los ordena de forma ascendente (de menor a mayor), en
caso contrario los ordena de manera descendente (de mayor a
menor).
Como vis, no hace falta llevar una cuenta de cuntos puntos hemos
metido o quitado.
Por ltimo, unimos todos los puntos con una lnea y los dibujamos:
Evento Draw
if (ds_list_size(listaPuntosX) ] 1){//si hay dos ms puntos en la
lista
draw_set_color(c_black);
draw_primitive_begin(pr_linestrip);
var i;
for (i=0; i[ds_list_size(listaPuntosX); i+=1){
draw_vertex(ds_list_find_value(listaPuntosX,
i),ds_list_find_value(listaPuntosY,i));
}
draw_primitive_end();
}
draw_set_color(c_red);
var i;
for (i=0;i[ds_list_size(listaPuntosX); i+=1){//dibujar los puntos
draw_circle(ds_list_find_value(listaPuntosX,
i),ds_list_find_value(listaPuntosY,i), 2, false);
}
Ya est, poned este objeto en una room vaca y cread arte XD.
La principal ventaja que vemos en este ejemplo de las listas sobre los
arrays es que no hace falta que llevemos la cuenta de los puntos que
metemos en la lista. As mismo, tampoco necesitamos chequear nada
cuando quitamos puntos. Si lo hubiramos hecho con arrays,
tendramos que haber chequeado antes de borrar un punto de la lista
que el array tena algn elemento o nos huberia salido un error de
ndice negativo en el array.
Colas.
veremos otra estructura de memoria que podemos usar con GM: las
colas. Es recomendable aunque no necesario haber ledo antes el
artculo sobre listas.
Definicin
Funciones
ds_queue_enqueue(id,val) Introduce el valor en la cola.
ds_queue_dequeue(id) Devuelve el ltimo valor de la cola (el ltimo
en introducirse) y lo elimina de la cola.
ds_queue_head(id) Devuelve el valor al principio de la cola, esto es,
el primero que se introdujo, pero no lo elimina de la cola.
ds_queue_tail(id) Devuelve el ltimo valor de la cola pero no lo
elimina.
Entonces para qu sirve esto? Las colas se utilizan cuando hay que
calcular algo en cada step y luego utilizar los resultados 1 sola vez.
Evento Draw:
-Dibujar un tringulo azul apuntando al objetivo
direction = point _direction(x, y, objetivo.x, objetivo.y);
var d, dir;
d = 16;
dir = degtorad(direction);
draw_set_color(c_blue);
draw_primitive_begin(pr_trianglestrip);
draw_vertex(x+(2*d)*cos(dir)+0*sin(dir), y+0*cos(dir)-
(2*d)*sin(dir));
draw_vertex(x+(-d/2)*cos(dir)+(-d)*sin(dir), y+(-d)*cos(dir)-(-
d/2)*sin(dir));
draw_vertex(x+(-d/2)*cos(dir)+d*sin(dir), y+d*cos(dir)-(-
d/2)*sin(dir));
draw_primitive_end();
Las colas son muy rpidas y usan muy poca memoria si se utilizan
correctamente, ya que tienen la capacidad de acceder y eliminar los
valores que guardan al momento. Y para recorrerlas ni siquiera
necesitamos acceder al ndice de cada elemento!
Colas de prioridad.
Definicin
Es decir, las colas de prioridad funcionan igual que las colas normales
pero adems poseen una nueva caracterstica llamada prioridad que
nos permite acceder a los valores de la cola de otra forma.
Funciones
ds_priority_add(id,val,prio) Aade el valor con la prioridad
especificada a la cola.
ds_priority_change_priority(id,val,prio) Cambia la prioridad del valor
especificado al nuevo valor.
ds_priority_find_priority(id,val) Devuelve la prioridad del valor
especificado.
ds_priority_delete_value(id,val) Elimina el valor (con su prioridad) de
la cola de prioridad.
ds_priority_delete_min(id) Devuelve el valor con la menor prioridad y
lo elimina de la cola.
ds_priority_find_min(id) Devuelve el valor con la menor prioridad
pero no lo elimina de la cola.
ds_priority_delete_max(id) Devuelve el valor con la mayor prioridad
y lo elimina de la cola.
ds_priority_find_max(id) Devuelve el valor con la mayor prioridad
pero no lo elimina de la cola.
Evento Create:
-Crear la cola de prioridad
-Inicializar variables
enemigos = ds_priority_create();
objetivo = 0;
objetivo = ds_priority_delete_min(enemigos);
Mapas de Memorias.
Los mapas de memoria son una estructura que nos puede facilitar
muchsimo la escritura de cdigos complicados.
Definicin
Funciones
ds_map_add(id,key,val) Aade la pareja llave (key)-valor (val) al
mapa.
ds_map_replace(id,key,val) Reemplaza el valor correspondiente a la
llave con un nuevo valor.
ds_map_delete(id,key) Elimina la pareja llave-valor especificada del
mapa. Si hay varias parejas con la misma llave slo 1 es eliminada.
ds_map_exists(id,key) Devuelve true si la llave existe en el mapa.
ds_map_find_value(id,key) Devuelve el valor correspondiente a la
llave.
ds_map_find_previous(id,key) Devuelve la mayor llave que sea
menor que la indicada.
ds_map_find_next(id,key) Devuelve la menor llave que sea mayor
que la indicada.
ds_map_find_first(id) Devuelve la menor llave del mapa.
ds_map_find_last(id) Devuelve la mayor llave del mapa.
Evento Draw:
-Dibujar al jugador
draw_set_color(c_blue);
draw_circle(x, y, 16, false);
/*VELOCIDADES*/
velocidades = ds_map_create();
ds_map_add(velocidades, "normal", 4);
ds_map_add(velocidades, "doble", 8);
ds_map_add(velocidades, "triple", 16);
Evento Draw:
-Dibujar la bala segn su tipo
draw_set_color(ds_map_find_value(colores, tipo));
draw_circle(x, y, 4, false);
DLL.
external_define
(dll,name,calltype,restype,argnumb,arg1type,arg2type, )
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-11). 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.
external_call(id,arg1,arg2,)
Llama 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.
Historia:
No es muy complicada. Pacman, un comecocos (monstruillo que
come cocos) recorre unos escenarios de estructura laber?ntica
engullendo todos los cocos que encuentra a su paso. El objetivo de
nuestro amigo es comerse todos los cocos para pasar de nivel. Pero
en el escenario hay otros monstruillos, los fantasmas, a los que no les
hace ninguna gracia que Pacman se zampe los cocos de su territorio.
Los fantasmas intentaran impedirle a Pacman que se coma los cocos
y lo perseguir?n sin tregua por toda la pantalla para com?rselo. Pero
Pacman podr? defenderse: Repartidos por la pantalla hay un peque?o
n?mero de supercocos que s?per vitaminizan a Pacman por un
peque?o espacio de tiempo y que lo hacen invulnerable y con la
capacidad de comerse a los fantasmas.
APARTADO GR?FICO
- Unos objetos que no son otros que los cocos, los supercocos y
las frutas que recolecta el comecocos por el escenario.
- Unos muros que forman los pasillos del laberinto por donde se
mueven los personajes.
APARTADO SONORO
APARTADO DE PROGRAMACI?N
- El Comecocos
- Los Fantasmas
- Los cocos
- Los supercocos
- La fruta
Tiene que quedar clara la diferencia entre los sprites y los objetos.
Los Sprites son las im?genes (animadas) que no tienen ning?n
comportamiento. Los objetos tienen normalmente un sprite para
representarlas pero los objetos tienen un comportamiento.
Guardar como. Guarda el archivo del dise?o del juego bajo el nombre
que le queramos dar.
Crear Ejecutable. Una vez que tu juego este listo deber?s distribuirlo
en forma de ejecutable para que otros puedan jugarlo.
A?ADIENDO SPRITES
Para a?adir un sprite, elije a?adir Sprite del men? a?adir, o utiliza el
bot?n correspondiente en la barra de herramientas. Te aparecer?
una ventana.
En esta ventana podr?s indicar el nombre del sprite. Todos los
sprites (y el resto de los elementos que intervienen en nuestro juego)
Los objetos son los elementos del juego que hacen cosas. La
mayor?a del tiempo tienen un sprite como representaci?n gr?fica de
modo que se pueden ver. Tienen comportamiento porque pueden
reaccionar a ciertos acontecimientos. Todas las cosas que ves en el
juego (a excepci?n del fondo) son objetos. Los personajes, los
monstruos, las bolas, las paredes, son todos objetos. Tambi?n puede
haber ciertos objetos que no se ven pero que controlan ciertos
aspectos del juego. Para Agregar un objeto a tu juego, elije agregar
objeto del men? de agregar (Add). Aparecer? la siguiente pantalla:
A la izquierda hay informaci?n de car?cter general sobre el objeto.
En el centro hay la lista de los eventos que pueden suceder al objeto.
En la derecha hay las diversas acciones que el objeto puede realizar.
Lo primero que tienes que hacer es darle al objeto un nombre.
Despu?s elegir el sprite para el objeto. Luego indicaras si el objeto es
visible (en la mayor?a de los casos si lo es) y si es s?lido (como una
pared).
haciendo click sobre ellos con el bot?n derecho del rat?n. Puedes
arrastrar objetos por la pantalla si mantienes pulsado el bot?n
Control del teclado m?s el bot?n izquierdo del rat?n. Desde la
pesta?a settings, adem?s de fijar la anchura y la altura de la
pantalla podemos fijar la velocidad del juego. ?ste es el n?mero de
frames por segundo. Cuanta m?s alta es la velocidad, mas suave es
el movimiento. Tambi?n deberemos fijar un nombre y una descripci?n
para cada una de las pantallas que creemos.
Sigue las indicaciones del profe.
Procederemos a crear las pantallas de nuestro juego.
EVENTOS
Ahora puedes agregar acciones a otro evento. Haz clic con el bot?n
izquierdo del rat?n sobre el evento adecuado para seleccionarlo y
arrastra la acci?n a la lista.
Puedes cambiar el orden de las acciones en la lista arrastrando los
iconos. Si mantienes presionada la tecla mientras arrastras
una acci?n, crear?s una copia de dicha acci?n. Puedes inclusive
arrastrar acciones entre diferentes listas de diferentes objetos.
Cuando haces clic con el bot?n derecho sobre una acci?n, se muestra
un men? desde el cual puedes eliminar la acci?n (tambi?n puedes
hacer esto usando la tecla ), o copiar y pegar acciones.
Cuando mantienes el cursor del rat?n sobre una acci?n, se muestra
una descripci?n m?s detallada sobre la misma.
Para eliminar el evento seleccionado y todas sus acciones, presiona el
bot?n Delete. (Los eventos sin acciones son eliminados
autom?ticamente 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 bot?n 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 bot?n
Add Event. Se muestra la siguiente ventana:
Aqu? seleccionas el evento que deseas agregar.
ACCIONES
STEP
Step>If the number of instances is a value
Indicamos que si el numero del objeto coco es igual a 0
Inicio de bloque
Ejecutar sonido de nivel acabado
Sleep 2000 miliseconds (esperar 2 segundos).
Si existe una siguiente room.
Ir a la siguiente room
Aqu? podemos definir una transici?n: Un efecto que se produce al
cambiar de pantalla.
De lo contrario
(De lo contrario, de no haber mas rooms significaria que el jugador
ha terminado el juego, por lo tanto)
Inicio de un bloque.
Ense?ar la tabla de records.
Reiniciar el juego.
Final del bloque 1.
Final del bloque 2.
(con speed 1)
(Relative)
COLLISION EVENT WITH OBJECT FANTASMA_ASUSTADO
OUTSIDE ROOM
CREATE
STEP
(32*32)
OUTSIDE ROOM
FANTASMA ASUSTADO
ALARM 0
BONUS
CREATE
ALARM 0
ALARM 1
[b]SCRIPTS[/b]
OUTSIDE_WRAP
{
if (x < 0 && hspeed <0> room_width && hspeed > 0) x = -
sprite_width + sprite_xoffset;
if (y < 0 && vspeed <0> room_height && vspeed > 0) y = -
sprite_height + sprite_yoffset;
}
ADAPT_DIRECTION
{
if (hspeed == 0)
{
if (random(3)<1 && place_free(x-4,y))
{ hspeed = -4; vspeed = 0;}
if (random(3)<1 && place_free(x+4,y))
{ hspeed = 4; vspeed = 0;}
}
else
{
if (random(3)<1 && place_free(x,y-4))
{ hspeed = 0; vspeed = -4;}
if (random(3)<1 && place_free(x,y+4))
{ hspeed = 0; vspeed = 4;}
}
}
Glosario.
A
alpha Transparencia. Es un parmetro que se utiliza en las funciones de dibujo avanzadas y que indica el
nivel de transparencia de lo que se est dibujando: 0 es totalmente transparente y 1 es totalmente opaco.
argumento Los argumentos son los datos que se le pasan a una funcin para que sta opere con ellos.
Por ejemplo, una funcin que sume dos nmeros necesitar que le digas que nmeros tiene que sumar. Esos
B
background Fondo. Es la imagen que se pone de fondo al room para que sea el escenario. Puedes
agregar varias imgenes distintas y hacer que cada una se mueva a diferente velocidad cuando el personaje
avance, haciendo que las imgenes ms cercanas se muevan ms rpido que las ms lejanas. As consigues
boolean Booleano. Es un tipo de variable que slo puede tener dos valores: true o false. Es decir, si una
variable booleana no es true entonces es false.
D
depth Profundidad. Es una propiedad de las instancias que sirve para decidir cul debe dibujarse por
encima de las dems cuando chocan, cul se sita primero en el room...Puede ser positiva, negativa 0 y
F
false Falso. En Game Maker false=0, es decir, es lo mismo poner false que poner 0.
fps Frames por segundo. No es lo mismo que la room speed. La room speed es el valor ideal al que
queremos que el juego se actualice. Sin embargo, si ponemos muchas acciones en el evento step el juego
puede ralentizarse, o si usamos unos sprites de mucha calidad puede que el juego necesite mucha
memoria...esto provoca que el juego se ralentice y en lugar de dibujar todos los frames que queremos en
cada segundo dibuje menos. Los fps son la medida real de la velocidad del juego en cada segundo. Te
interesar que los fps estn siempre lo ms cercano posible a la room speed.
frame Para generar la ilusin de animacin, lo que se hace es dibujar la pantalla muchas veces (por
ejemplo 60 veces por segundo) haciendo que su contenido cambie poco a poco. As, al ver esos cambios de
manera seguida parece que la imagen se est moviendo. Cada instante en el que se dibuja la pantalla se
denomina frame.
frame rate Es la velocidad con la que se pasa de un frame a otro. Cuanto mayor sea, ms fluidas se
vern las animaciones en la pantalla, pero se requerir ms potencia.
G
gif Es un tipo de archivo de grficos comprimido y animado. Ideal para sprites.
H
height Altura. Es un argumento muy comn en las funciones de grficos.
highscore El marcador ms alto, el rcord de puntuacin obtenido en el juego. Puedes mostrar una lista
con las puntuaciones ms altas (highscore list) con la accin correspondiente.
I
image blending Mezclado de imgenes. Cuando dos imgenes se superponen (por ejemplo, cuando
chocan dos sprites) el programa debe decidir qu es lo que va a dibujar. Si la instancia de uno de los sprites
tiene menor profundidad que el otro se dibujar ste por encima. Pero si tiene mayor depth se dibujar por
debajo. Si uno de los sprites es parcialmente transparente, se ver parte del otro. Si el modo de mezcla est
en suma se sumarn los colores de los dos sprites en la zona en la que chocan (por ejemplo para causar un
efecto de brillo), pero si est en modo resta se restarn. Como ves, en la parte de los sprites que choca se
decide qu hay que hacer segn el modo de mezcla que est activo (esto tambin afecta a los backgrounds).
L
left Izquierda. Es un argumento muy comn en las funciones que deben especificar una posicin para
indicar dnde debe situarse el borde izquierdo.
M
midi Es un formato de sonido de muy pequeo tamao. Los midis tienen menos calidad que los wav o
mp3. Sin embargo su tamao es mucho menor, lo que hace que no consuman casi memoria. Esto hace que
los midis sean ideales para las msicas de fondo del juego.
P
path Camino o trayectoria. Game Maker te permite dibujar una trayectoria para que luego la siga una
instancia. As puedes hacer que un enemigo se mueva siguiendo este camino, o hacer que en un juego de
png Un tipo de archivo de grficos de tamao muy reducido creado para ser transmitido por Internet (png
significa "portable network graphics" o "grficos transportables por la red").
pop-up Son los mensajes o ventanas que aparecen de repente y sirven para dar o pedir informacin al
jugador. Por ejemplo, una ventana que se abra y le pregunte al jugador cmo se llama.
R
rar Es un tipo de archivo comprimido. Los archivos tipo rar consiguen una gran compresin aunque este
formato no est tan extendido como el zip (ver zip).
recurso Es lo que utiliza el juego. En Game Maker los recursos se dividen en las siguientes categoras:
sprites, backgrounds, sonidos y msica, paths, scripts, time lines, fuentes, objetos y rooms.
room Habitacin o cuarto. En el room es donde se sitan todos los objetos y donde todo el juego tiene
lugar. Un juego puede tener varias rooms y cada una puede ser un nivel distinto, una pantalla de men, de
ayuda...
room speed Es el frame rate que queremos que tenga un cuarto y se mide en frames por segundo.
Por ejemplo, una room speed igual a 30 significa que en cada segundo se dibujan 30 frames.
S
score Marcador. En el juego, puedes hacer que el marcador se incremente cuando el jugador recoja
screenshot Es una foto de la pantalla en un momento determinado. Los screenshots son muy tiles
para promocionar tu juego o para usarlos en tablas de rcords.
script Es un trozo de cdigo que puede recibir argumentos y devolver un valor. Los scripts se utilizan
scroll Es el movimiento del fondo. Game Maker te permite aadir varios fondos distintos y asignar un
movimiento a cada uno, para dar la impresin de que el decorado avanza cuando el personaje se mueve.
sprite Un sprite es la imagen que se asocia a un objeto y que se dibuja en la pantalla. Los sprites
suelen tener varias imgenes, de forma que si en cada momento se dibuja una imagen distinta parece que se
sprite sheet Una sprite sheet (o strip) es una imagen no animada de gran tamao en la que
aparecen muchas imgenes de un personaje (o varios) mostrando todos los frames de sus animaciones. El
editor de sprites de Game Maker permite crear sprites animados fcilmente a partir de una sprite sheet.
step Paso. Los juegos que crees con Game Maker se ejecutan por pasos, de forma que si haces que se
pase de un paso a otro rpidamente dar la impresin de que todo se ejecuta continuamente (Ver frame).
T
tile Para hacer un fondo, a veces es bueno utilizar imgenes pequeas que, puestas una al lado de otra,
forman un dibujo. Esta tcnica se denomina tiling. Por ejemplo: divides el room en casillas del mismo
tamao y en cada una pones una imagen ms pequea (en una un rbol, en otra una casa,...) y haces que se
repitan para llenar todo el room. As puedes conseguir fondos muy originales y que consumen muy poca
memoria.
time line Lnea de tiempo. En una time line puedes aadir acciones en momentos concretos, de forma
que estas acciones se ejecutarn en el orden que t decidas y justo cuando quieras.
top Arriba. Es un argumento muy comn en las funciones que deben especificar una posicin para indicar
dnde debe situarse el borde superior.
true Verdadero. En Game Maker true=1, es decir, es lo mismo poner true que poner 1.
w
wav Son archivos de sonido de gran calidad, pero que por lo tanto ocupan mucho tamao y consumen
bastante memoria. Los archivos wav se suelen utilizar para los efectos de sonido (explosiones, gritos,
disparos...).
width Anchura. Es un argumento muy comn en las funciones de grficos.
Z
zip Es un tipo de archivo comprimido muy corriente. Al comprimir tu juego, conseguirs que ocupe menos
espacio y as podrs distribuirlo ms fcilmente por la red.