Funciones en GML
¿Qué es una función? Lo vamos a decir de una manera poco formal: una función es un trozo de código que acepta unos parámetros de entrada y devuelve una salida. Si tiramos de matemáticas…
sin(x)
Sabemos que x tiene un valor y sin(x)
devolverá un valor calculado.
Game Maker nos ofrece un montón de funciones en su sistema. No vamos a nombrarlas todas, pero si que vamos a ver en que pueden afectar a la hora de programar (si afectan a sprites, objetos, paths, etc).
Como se escriben las funciones
Sabemos que cuando creamos una variable, al darle un nombre podemos usarlo tal cual. Pero una función tiene el siguiente esquema:
funcion( arg1, arg2, …)
Es decir, las funciones se escriben con los paréntesis al final de su nombre. Si tiene argumentos de entrada, se ponen dentro del paréntesis separado por comas. Si no tiene argumentos, igualmente hay que poner los paréntesis.
instance_destroy();
Esta función elimina la instancia actual. Como es la instancia actual, no hay que poner nada en los paréntesis.
Usar scripts como funciones
¿Podemos crear nuestras propias funciones? Si, lo hacemos cuando creamos scripts. Recordemos que un script acepta hasta 16 argumentos de entrada. Los diferenciamos porque son las palabras especiales argument0, argument1, etc hasta argument15, y podemos devolver datos con la palabra especial return. Veamos un ejemplo:
Si tenemos un script llamado triple()
que devuelve el triple de lo que le pasas, su código sería algo así:
var value = argument0; return (value * 3);
Y se usaría de la siguiente manera
a = triple(x);
Ya sabemos lo que vale a.
Funciones que devuelven instancias y objetos
Podemos crear un script que en vez de devolver un valor calculado, devuelva un objeto o una instancia. Por ejemplo, instance_create()
es una función de Game Maker que te crea una instancia en una posición del objeto que le dices. Podemos hacer esto:
instance_create(x, y, obj_enemy);
O podemos hacer esto:
inst = instance_create(x, y, obj_enemy);
Al devolver instance_create()
la instancia, ahora podemos manipularla con la variable inst.
inst.speed = 4;
¿Os acordáis de la acción Create moving? Es lo que hace ese código, crea un objeto nuevo y le da una velocidad. Pero, ¿es necesaria esa variable? Pues no. Creemos que se podría hacer todo en una línea
instance_create(x, y, obj_enemy).speed = 4;
Pero esto devuelve un error. ¿Porqué? Porque así lo usaríamos con un objeto, pero no con una instancia. Refresquemos memoria
(100004).speed = 4;
Si sabemos el número de instancia, lo ponemos entre paréntesis. Es lo que vale la variable inst. Así que en una línea sería así:
(instance_create(x, y, obj_enemy)).speed = 4;
A mi me gusta que se vea claro, así que no lo uso de esta manera. prefiero una instrucción with.
with (instance_create(x, y, obj_enemy)) { speed = 4; }
Como todas las opciones son posibles, usad la que sea más fácil de ver para vosotros.
Tipos de funciones
Listar todas las funciones de sistema sería enumerar una lista de ¡más de 200!, y no sería nada práctico hacerlo. Así que vamos a englobarlas un poco para saber qué podemos hacer:
- Funciones de manipulación de datos. Son funciones matemáticas para manipular números, aunque también tenemos para fechas y cadenas.
- Podemos redondear un número floor(), tener un número aleatorio random() o choose(), funciones trigonométricas sin(), cos(), raíz cuadrada sqrt()…
- Podemos saber hora actual current_time(), fecha actual date_current_datetime(), comparar fechas date_compare_date(), sumar dias, horas, semanas…
- Con texto podemos insertar texto dentro de otro, saber cuantos caracteres tiene…
- Funciones de recursos. Podemos manipular sprites, fondos, fuentes, rooms… Saber el nombre que le hemos puesto, el total de imágenes de un sprite…
- Funciones de objetos e instancias. Aunque los objetos y las instancias son recursos, merecen una mención aparte, ya que manipular estos datos nos permite dar más versatilidad a nuestro juego. Con las funciones de objetos podemos obtener todas sus propiedades, y con las funciones de instancias podemos manipularlas: crear, destruir, clonar, comprobar si existen, incluso activarlas y desactivarlas.
- Movimiento y colisiones. Podemos calcular distancias entre objetos o instancias, mover objetos a una posición concreta o siguiendo un camino, etc. Con las colisiones podemos calcular en puntos concretos si existe una colisión, muy útil para detectar instancias en los lugares que queramos.
- Funciones de periféricos. Para detectar controles relaciones con el teclado, ratón, gamepads, etc.
- Funciones de dibujo. Podemos dibujar formas sencillas (líneas, rectángulos, círculos) o sprites sin que estén relacionados con un objeto, también manejar tamaño de pantalla y controlar las vistas para saber que mostramos y que dejamos de mostrar.
- Otras funciones. En un cajón desastre tenemos una serie de funciones para hacer todo tipo de cosas: manipular ficheros de texto (para leer y escribir), manejar datos de estructura complejos (pilas, colas, grids), usar partículas, opciones de sistema operativo, controlar las opciones de physics (no me gusta mucho decir físicas ^_^), controles de red…
Como habéis visto, la lista de funciones de cada categoría es inmensa. Conforme nos acostumbremos a programar más con GML, iremos conociendolas y usándolas como mejor veamos.
¿Cuál es la diferencia entre una función y una variable de sistema?
Si buscamos en la ayuda, veremos que existe una función object_get_visible()
, que nos devuelve si un objeto es visible o no. Pero también tenemos la propiedad (o variable interna) visible
.
Lo mismo ocurre con sprite_get_number()
, que nos devuelve el número de subimágenes de un sprite. ¿Y la variable image_number
? Tendremos el mismo resultado.
La principal diferencia entre este tipo de funciones y las variables, es que las variables están, principalmente, relacionadas con el objeto, mientras que las funciones hay que decir el recurso (objeto, sprite) al que nos referimos.
De esta manera, si queremos usar las variables de otros objetos, podemos usar las funciones o utilizar los objetos tal y como hemos visto
//estas dos líneas harian lo mismo a = sprite_get_number(spr_enemy); a = obj_enemy.image_number;
¡Pero cuidado! El objeto puede cambiar el sprite que le hemos dicho por defecto, y las variables pueden cambiar en cualquier momento, así que tenemos que vigilar de no tener resultados no deseados.
Resumen
Ya sabemos cómo se usan las funciones, hemos visto la manera de escribirlas y algunos ejemplos. Ahora toca ir escribiendo código y averiguar qué funciones podemos usar. En el próximo post veremos cómo se usan los comentarios dentro del código.
¿Qué opináis vosotros? ¿Creéis que se deben conocer todas las funciones que nos ofrece Game Maker? Podéis decir vuestro punto de vista en los comentarios.
Primero que todo, excelente post amigo, me has ayudado mucho.
Con respecto a la última pregunta planteada, Pues Si, sería muy útil tener una lista con todas las funciones de Game Maker, con sus parámetros de entrada y salida, una breve explicación, un ejemplo y agrupada por categorías, es un trabajo grande pero estoy seguro que un experto como vos en el tema puede lograrlo en poco tiempo.
Saludos.
Hola Jason,
bueno, la intención es poner ejemplos prácticos con el uso de la mayoría de funciones. Listarlas todas y poner un ejemplo no lo tengo tan claro, ya que prefiero hacerlo al revés, buscar y resolver problemas concretos con las funciones.
Igualmente, en este enlace tienes la documentación de la versión 6.1 de Game Maker en español. Aunque es una versión algo vieja, la mayoría de funciones todavía se utilizan.
David
Creo que se debe a que estas tratando de “anclar” o dar un minimo y maximo a “mouse_y” la cual es una variable de solo lectura…
Hola buen dia, tengo un problema y pues creo que es esclusivamete de game maker escribo este codigo
y = clamp(mouse_y,106,418); y me sale este erro estoy completamente seguro que la sintaxis no es por que pasa esto en GML game maker gracias por su ayuda
FATAL ERROR in
action number 1
of Step Event
for object object_jugador:
COMPILATION ERROR in code action
Error in code at line 1:
y = clamp(mouse_y,106,418);
^
at position 7: Unknown function or script: clamp
Hola Luis,
pues es muy raro, he hecho una pequeña prueba y me funciona. Prueba de limpiar los assets, pulsando, a veces es mejor compilar desde cero.
David
No me funcionan bien las coords x e y del mouse. Código (en evento create)
:x=mouse-x y=mouse-y
gravity= 1
El objeto no aparece exactamente en las coordenadas del raton, aparece o no aparece depende de la posicion del raton en la pantalla. Es muy extraño.
Deberia ser
x = mouse_x
y = mouse_y
La diferencia es que debe ser guión bajo.
Exelelente, nos motiva a seguir adelante!