Documente Academic
Documente Profesional
Documente Cultură
ndice
[ocultar]
1Sintaxis general
o 1.1Funciones
o 1.2Variables
1.2.1Tipos
1.2.2Alcance
Sintaxis general[editar]
El lenguaje GML a nivel de sintaxis es similar a C++, aun as, este lenguaje constata de
mucha flexibilidad debido a sus diversas variaciones de sintaxis (las cuales son todas vlidas).
Por ejemplo, al trabajar con operadores puede funcionar as:
g=g+1;
g+=1;
variable=<valor>;
En este caso, la variable ya est declarada y puede usarse de forma general, aun as, GML
tambin incluye un bloque "var" imitando las declaraciones de variables de otros lenguajes,
pudiendo declarar un sin nmero de variables en el programa sin necesidad de asignarles un
valor (si no que este automticamente es 0 ). Por ejemplo:
var xx,yy,ss;
Game Maker tambin trabaja con constantes, las cuales se pueden asignar desde una funcin
del programa (ms las que ya existen por ende).
Dentro del cdigo GML existen dos tipos de variables de trabajo, las variables
locales y variables globales. Las variables locales trabajan nicamente dentro de un
"objeto", es decir, no es existente fuera del "objeto" o bloque de cdigo(en caso de haber sido
declaradas con "var") que la trabaje (lo cual permite usar el mismo nombre de la variable en
otro objeto). Por otro lado estn las variables globales, las cuales usan el
prefijo global. antes del nombre de la variable, por ejemplo:
global.variable=0;
Las variables globales tienen uso en todo el programa, por lo cual solo puede existir una sola
variable global con el mismo nombre, y su valor puede verse afectado desde cualquier
parmetro del programa/cdigo.
GML tambin puede manejar arrays de manera muy simple y muy similar a C++.
Deben ser declaradas de la forma:
array[ndice1,ndice2];
Las arrays en Game Maker pueden ser de 1 o 2 dimensiones y pueden contener una mezcla
de strings y de valores reales, pero no otras arrays. Tambin existe un lmite en los tamaos:
Los ndices deben estar entre 0 y 32.000 y no puede haber ms de 1.000.000 valores en una
misma array.
GML tambin cuenta con funciones utilizadas para crear y editar seis estructuras de datos
simples. Estas funciones slo estn disponibles para los usuarios que tienen la versin Pro de
Game Maker. Las estructuras de datos disponibles son Stacks, Queues, Listas, Mapas,
Queues de prioridad, y Grids.
Tipos[editar]
Por la simplicidad del GML, este slo tiene dos tipos de variables. Cualquier variable puede
llevar cualquier tipo de datos sin ningn tipo de declaracin.
Strings Son cadenas de caracteres ASCII ( Unicode y ANSI en caso de GM 8.1) que
pueden tener cualquier longitud. Como GM prefija el tamao de las strings como valores
enteros de 4 bytes, una string en realidad no puede tener ms de 4,294,967,296
caracteres, si se supera dicho nmero, los caracteres son cortados desde el principio
hasta que el nmero total de estos sea menor al lmite. Sin embargo, generalmente las
strings son muchsimo ms cortas.
ty_string
Boolean Son para distinguir un caracter de tipo true o tipo false, no almacena ningn valor
Valores Reales Son nmeros con signo de punto flotante. Eso quiere decir que pueden
ser nmeros positivos o negativos y que pueden tener parte decimal. Desde la versin 6.1,
GM permite la representacin de valores hexadecimales como reales en el cdigo, si se
preceden del carcter $. En la versin 6, el manejo de valores reales tena un bug que
provocaba errores de precisin al trabajar con valores reales altos. El bug tambin existe
en GM 7 y 8, pero fue mitigado con ms precisin.
ty_real
Como GML no tiene valores booleanos, sentencias que requieren valores booleanos (como if)
evaluarn cualquier valor real mayor que 0.5 como verdadero y cualquier valor real menor o
igual a 0.5 como falso. En GML tambin existen las constantes por
defecto true y false que equivalen a 1 y 0 respectivamente, y pueden ser usadas para
hacer el cdigo ms legible.
Alcance[editar]
En GML, hay dos tipos de variables locales: locales a una "instancia", y locales a un "script" (o
cualquier otra pieza de cdigo que tenga su propio contenedor). Ser local a una instancia
significa que esa variable est unida a esa instancia particular y que para ser llamada desde
otra instancia debe usarse como prefijo el nombre de la instancia que contiene la variable. Ser
local a un script significa que la variable slo puede ser usada en ese script y que al terminar
de procesarse ste, la variable expira. El trmino "local" sin ms especificaciones, usualmente
se refiere a local a una instancia.
Por defecto, una variable es local de una instancia pero no local al script en el que es usada.
Para hacer una variable accesible por todas las instancias (y scripts) puede ser definida
usando el prefijo global global.foo=bar; o declarada explcitamente globalvar
foo,bar; . Usando la primera forma, la variable debe siempre ser llamada usando el
prefijo global. ; la declaracin con globalvar no requiere ningn prefijo. Para hacer una
variable local a un script se usa la palabra clave var : var foo,bar; .
Se puede acceder a una variable que es local a una instancia desde otra instancia usando
como prefijo un identificador de instancia instancia.variable . No hay forma de acceder a
una variable local de un script desde otro, a menos que la variable se pase de script en script
como argumento.
Una instancia puede ejecutar cdigo en otra instancia usando la sentencia "with". Por ejemplo,
la siguiente pieza de cdigo, colocada en un evento de colisin, puede ser usada para destruir
a la instancia que colisiona con la actual. Cuando se ejecuta un evento de colisin, Game
Maker automticamente crea la variable "other", la cual se refiere a la instancia envuelta en la
colisin.
Ntese que cuando una variable es local a un script, sta es independiente de toda instancia.
Por ejemplo, el siguiente cdigo funcionara aunque la variable foo no est definida
en OtraInstancia .
var foo;
foo="bar";
with (OtraInstancia) {show_message(foo);}
evento Create . Podemos aadir cdigo cada vez que se entra en la room.
Cdigo de crear en la instancia. Sabemos que las acciones del
Vemos que cada instruccin acaba con un punto y coma ;, es una manera de
decirle al programa que ha acabado esa instruccin. Debido a que Game Maker
es bastante flexible, como hemos comentado, no es obligatorio poner ;, pero yo
lo recomiendo para tener un cdigo lo ms ordenado posible. Otro ejemplo:
Ejemplo de cdigo GML en el evento Create. Vemos que se declaran algunas variables para usarlas en otros
eventos.
Conclusin
Hemos hecho una pequea explicacin la importancia de programar con cdigo.
Con una pequea introduccin hemos comentado el lenguaje de programacin
que podemos usar con Game Maker Studio. En el prximo post hablar de las
variables y cmo las podemos usar en nuestro cdigo.
Programa.
Un programa es un conjunto de instrucciones llamadas sentencias, que son
interpretadas por GameMaker:Studio con el propsito de hacer que algo ocurra dentro
de un juego. Ese "algo" puede ser una accin tan simple como sumar 2 ms 2 para
obtener 4, o tan complejo como hacer que un enemigo huya cuando su salud baja de
cierto nivel. La estructura de un programa vara enormemente depndiendo de las
funciones que usa, pero reducindolo a su estructura ms bsica, la representacin de
cualquier programa sera:
{
<statement>;
<statement>;
...
}
Un programa debe comenzar con el smbolo '{' y terminar con el smbolo '}', y entre
estos dos smbolos se ubican las sentencias, cada una separada con un smbolo de
punto y coma ';'. Ahora veamos un tpico programa de GML , ms precsamente un
programa creado en el Editor de Scripts de GameMaker:Studio:
Existen diversos tipos de sentencias, las cuales se discutirn en las siguientes
secciones del manual.
Variables y su alcance.
Se tratan los diferentes tipos de variables disponibles
en GameMaker:Studio.
Como cualquier otro lenguaje de programacin, GML usa variables como la unidad
bsica para la mayora de las operaciones de programacin. Las variables se utilizan
para almacenar informacin en la memoria para su posterior (o inmediato) uso. Se les
asigna un nombre para poder llamarlas en funciones y programas. Una variable en
GML puede almacenar un nmero real, (como 100, 2.456575, -56, etc.) o una cadena
(como "Hola , mundo").
De manera coloquial, una variable es un contenedor para poner un valor que se usar
en una o ms operaciones o funciones. Imagina el valor "pi", Un nmero de tipo real
que guarda el valor 3.14159265(etc...). Por qu? Es ms fcil decir "pi" que "tres
punto catorce quince noventaydos sesenta y cinco. De este modo, darle nombre a los
valores facilita su uso, y tambin nos asegura que aun cuando el valor de la variable
cambie, su nombre ser siempre el mismo. El nombre de una variable en GML siempre
debe comenzar con una letra y slo puede contener letras, nmeros y el guin bajo '_'
(no se admiten cacateres acentuados ni especiales). Su longitud no debe exceder los
64 caracteres. Ejemplos de variables vlidas son velocidad, limite_inferior, numero1;
nombres no vlidos podran ser 5velocidad, limite superior, o *numero. En otros
lenguajes de programacin, es necesario "declarar" una variable antes de usarla. Esto
quiere decir que se le indica a la computadora el nombre con el que se desea
identificar esa variable, de tal modo que se le reserve un espacio en memoria para
almacenar cualquier dato que se desea "poner" en la variable. Esto no siempre es
necesario en GML, ya que depende del alcance de la variable. Hay cuatro categoras
de variables en GameMaker:Studio y cada una tiene su propio alcance (el area de
operacin o su dominio). Las cuatro categoras son:
local: Estas variables se declaran mediante la funcin "var". Una variable local
slo es vlida dentro del evento o script en el cual se crea. En este
caso GameMaker:Studio crear la variable, la usar el tiempo que dure el
evento y luego se "olvidar" de ella, lo que causar que se obtenga el error
"unknown variable" si se intenta usarla posteriormente..
Variables de Instancia
El alcance de una variable de instancia est limitado a la instancia donde se
crea.
Una variable de instancia se crea dentro dela instancia de un objeto y es considerada
nica para esa instancia: muchas instancias del mismo objeto pueden tener la misma
variable, pero cada uno puede guardar un valor distinto, ya que esas variables son
nicas a cada instancia. Cmo se crea una variable de instancia? Slamente hay que
asignarle un valor, com ose muestra a continuacin:
pociones = 12;
vida = 100;
nombre = "Juan Prez";
fuerza = 5.5;
armadura = -2;
vida -= 5 + armadura;
Si la vida "vida" est en 100, su valor cambiar a 97 (100 - (5 + -2) = 97). Esto es un
ejemplo sencillo, se podra reemplazar "armadura" por el valor -2, pero qu pasa si se
usa ese valor en distintos lugares y decides cambiarlo? Se tendra que ir por todo el
cdigo y cambiar cada -2 por el nuevo valor, lo cual consume tiempo y puede conducir
a errores! pero al usar una variable, todo lo que hay que hacer es reasignarle un nuevo
valor, el cual ser usado automticamente en el cdigo, aumentando la flexibilidad y
facilitando la correccin de errores. Aun si el valor no fuera a cambiar, es ms fcil
recordar qu uso tiene una variable llamada "vida" que slo ver un nmero.
Variables locales
Una variable local se declara, se usa y despus se descarta.
Las variables locales solamente se crean para eventos especficos, cuando dicho evento
finalice, la variable se descarta (La nica excepcin a esto son los scripts, donde una
variable declarada como local se mantiene local al scri0pt, y luego se descarta). Por
qu habramos de necesitarla? Las variables ocupan espacio en memoria, y puede ser
que slamente las usaremos para una operacin o funcin, en tal caso slo es
necesario tenerlas en memoria slo el tiempo que sean usadas. Esto mantiene el
cdigo base limpio y ordenado, a la vez que se optimiza el espacio en memoria para
las cosas que son realmente necesarias. Para declarar una variable local usamos la
funcin var de esta manera:
El cdigo anterior crea una variable local de nombre "i" y la inicia en cero, and sets it
to 0, todo en la misma lnea. En veriones previas de GameMaker era necesario declarar
primero la variable local primero y luego asignarle un valo, pero en esta versin se
puede declarar y asignar un valor al mismo tiempo. En el ejemplo, el valor de la
variable se usa para iniciar un arreglo. Como la variable "i" no va a ser usada en otras
operaciones posteriores, puede tener un alcance local. Aqu hay otro ejemplo:
var xx,yy;
xx = x - 32 +irandom(64);
yy = y - 32 +irandom(64);
instance_create(xx, yy, obj_blood);
Aqu se ha usado la variable local para almacenar coordenadas aleatorias qusadas para
crear una instancia. Se puede ver que no es estrictamente necesario usar estas
variables, pero para propsitos de claridad y facilidad de uso lo hacemos as. Es mucho
ms claro y obvio lo que se est haciendo, que usar cdigo como este:
Un detalle acerca de las variables locales: Al ser nicas al evento que las ejecuta,
tambin es posible usarlas en otras instancias mediante cdigo! Es decir, podemos
usar variables locales para ajustar y cambiar cosas en otras instancias mediante la
sentencia "with()" (hay una seccin sobre esto en seccin Generalidades del
lenguaje en el manual). El cdigo lucira as:
Este cdigo funciona porque la variable "num"es local al evento (o script) en el que
est contenida, NO A LA INSTANCIA NI EL ENTORNO DE JUEGO, lo que permite usarla
en cualquier funcin en cualquier objeto siempre y cuando est en el mismo bloque de
cdigo.
Variables globales
En trminos simples, una variable global es un tipo de variable que una vez declarada
no pertenece a ninguna instancia, pero puede ser leda por todas ellas. Las variables
globales deben ser declaradas, tal como sucede con las variables locales, pero a
diferencia de stas, una variable global permanece en memoria hasta el final del
juego. Por ejemplo, se puede crear una variable global para llevar un registro del
nmero de balas del jugador y sencillamente actualizar esta variable en distintos
puntos del juego. Una variable global no pertenece a una instancia en particular y
puede ser leda, cambiada y usada por todas las instancias en cualquier momento,
pero cualquier cambio hecho a la variable es tambin "global", es decir, el cambio
afecta a todas las instancias que usen dicha variable. Veamos un ejemplo de esto:
globalvar food;
food = 5;
hemos creado una nuava variable llamada "food" la cual ha sido declarada como
global. "food" esta disponible para cualquier instancia, por ejemplo, podra haber un
objeto "food" contra el que el jugador colisione, y en ese evento de colisin
tendramos:
food +=1;
Podramos tener otro objeto que dibuje el valor de "food", de esta manera:
Mediante variables globales podemos cambiar valores y ver reflejados esos cambios en
todas las instancias que hagan referencia a esas variables. De la misma manera que
con las variables locales, hay que tener cuidado de no nombrar de igual manera que
alguna variable de instancia, ya que esto causara problemas y se facilitara la
aparicin de errores en el juego. Como recurso para evitar estos inconvenientes,
podemos llamar a las variables globales usando la palabra reservada "global" seguida
de un punto "." antes de la variable. Esto se ilustra a continuacin:
global.food = 5;
Con este mtodo, debemos usar la palabra "global" cada vez que deseemos usar la
variable, por ejemplo:
global.food += 1;
draw_text(32, 32, "food = " + string(global.food));
o score
o health
o lives
score
Variable global para almacenar el marcador del juego.
Sintaxis:
score;
Devuelve: Real
Descripcin
Esta variable tiene un alcance global y se usa para almacenar un valor numrico que
generalmente se trata del marcador del juego, sin embargo no necesariamente debe
ser as - que el nombre sea "score" (marcador) no significa que tenga que ser usada
para el marcador... puede almacenar el valor que se desee.
Ejemplo:
if place_meeting(x, y, obj_Bullet)
{
score += 10;
instance_destroy();
}
Este cdigo revisa la instancia actual para determinar si hay una colisin con alguna
instancia del objeto "obj_Bullet", y si la hay, suma 10 al marcador global y a
continuacin se destruye.
health
Variable global para almacenar los puntos de salud.
Sintaxis:
health;
Devuelve: Real.
Descripcin
Esta variable tiene un alcance global y se usa para almacenar un valor numrico que
generalmente representa la salud del jugador health, pero hay que tener en cuenta
que esto no necesariamente tiene por que ser as. A pesar de que el nombre es
"health", se puede usar para almacenar cualquier valor numrico til para el juego.
Ejemplo:
if place_meeting(x, y, obj_Enemy)
{
health -= 10;
if health <= 0 instance_destroy();
}
El cdigo anterior revisa si hay una colisin con el objeto indexado en la variable
"obj_Enemy", y de haberla, resta 10 puntos de la variable global health y luego
determina si el valor de dicha variable es menor o igual a ceroSi se cumple esta
condicin, la instancia que ejecuta el cdigo se destruye.
Accediendo a variables desde otras
instancias
Se describen varios mtodos para llamar a variables en otras
instancias.
obj_ball.speed = 0;
Lo que hace el cdigo anterior es ajustar la velocidad de TODAS las instancias del
objeto "obj_ball", as que este mtodo permite cambiar una variable en todas las
instancias de algn objeto. Y si se quiere cambiar la velocidad de slamente
una instancia en particular, en lugar de todas? En tal caso, el principio es el mismo,
excepto que en lugar de usar el nombre del objeto como identificador de todas sus
instancias, usamos el identificador de la instancia para decirle
a GameMaker:Studio que slo queremos manejar una sola instancia.
(100012).speed = 0;
other colisin,
var nnn;
nnn = instance_create(100, 100, obj_ball);
nnn.speed = 8;
nnn.direction = random(360);
Todas estas son formas vlidas de leer y ajustar variables en otras instancias, y
funciona porque el punto es en realidad un operador. Toma un valor como operando
izquierdo y una variable (direccin) como operador derecho, y devuelve la direccin de
esa variable en particular en el objeto o instancia indicada. Todos los nombres de
objetos y objetos especiales de los prrafos anteriores representan en realidad valores,
estos valores pueden ser tratados como cualquier otro valor. Los Nombres de objetos,
los objetos especiales y los identificadores de instancia se pueden usar en muchas
otras funciones, ya que GMS los trata como constantes. write.
El uso de "other"
Hay dos situaciones en que la palabra reservada other puede ser usada para hacer
referencia a una instancia en especfico: Cuando se usa en una
funcin with (explicado aqu) o cuando se usa en un evento de colisin, que es el caso
que veremos a continuacin.
Un evento de colisin ocurre solamente entre un par de instancias. Desde luego que se
pueden presentar colisiones mltiples entre mltiples instancias, pero cada colisin es
tratada por GameMaker:Studio una a una, entre la instancia en la que se defini el
evento de colisin y la "otra" instancia involucrada. Imaginemos que tenemos un
objeto jugador, objetos enemigos y objetos bala disparados por los enemigos. Se
puede asignar a cada enemigo una instancia de bala, pero con distinta capacidad de
dao calculada de manera aleatoria cuando se crea dicha instancia, por ejemplo:
var nnn;
nnn = instance_create(x, y, obj_Bullet);
nnn.damage = 5 + irandom(5);
nnn.speed = 8;
nnn.direction = point_direction(x, y, obj_Player.x, obj_Player.y);
Observa que estamos ajustando variables mediante el mtodo del punto antes
explicado. Ahora, qu pasa con el objeto jugador? Cmo hacer para que sepa cunto
dao va a recibir? Usando other en el evento de colisin (del objeto jugador).
hp -= other.damage;
if hp <= 0 instance_destroy();
Asignaciones
Una asignacin es el mtodo usado para almacenar un valor en una variable. Toda
asignacin presenta la siguiente estructura:
<variable> = <expresin>;
La expresin ms sencilla puede ser un simple valor, pero tambin puede ser ms
compleja (una o varias operaciones). Adems de asignar valores, tambin podemos
sumar un valor al valor actual de la variable, usando +=, por ejemplo:
a += b;
De igual manera, se puede sustraer usando -=, multipicar usando *=, dividir
usando /=, o usar operadores bit a bit |=, &=, o ^=. Tambin se puede sumar o
restar uno de una variable, mediante ++, --.