Idioma del creador de juegos

La versión actual de la página aún no ha sido revisada por colaboradores experimentados y puede diferir significativamente de la versión revisada el 15 de junio de 2016; las comprobaciones requieren 6 ediciones .
Idioma del creador de juegos
clase de idioma orientado a objetos , orientado a eventos , guionado
Apareció en 1999
Autor marcus overmars
Desarrollador Overmars, Markus Hendrik
extensión de archivo .gml , .gmk , .gm6 , .gmd , .gm8 , .gm81
sido influenciado C++
Sitio web yoyogames.com
sistema operativo Microsoft Windows

Game Maker Language (GML)  es un lenguaje de programación interpretado diseñado para usarse junto con un programa de desarrollo de juegos de computadora llamado Game Maker . Mark Overmars introdujo originalmente la compatibilidad con idiomas en Game Maker para complementar el sistema de eventos de botones; sin embargo, más tarde todos los eventos de botones se incluyeron en GML, lo que permitió al programador evitar el uso de funciones de botones. GML está muy relacionado con el entorno de Game Maker. Game Maker está diseñado para eliminar la necesidad de programación manual de cosas como la gestión de eventos, el diseño de niveles y la configuración de objetos. Existe la idea errónea de que GML admite la inserción de fragmentos de código en otros lenguajes como Pascal , Assembler o C++ . El concepto erróneo surgió debido a la similitud parcial de la sintaxis GML con Pascal y C ++. (Por ejemplo, el operador "&&" se puede reemplazar con "y").

Bibliotecas

En Game Maker, una colección de eventos de botones forma una biblioteca. En la interfaz del programa, las bibliotecas se muestran como marcadores que contienen varios iconos de eventos. Cada uno de estos eventos es un script o función GML que el usuario puede usar en el juego. Game Maker viene con varias bibliotecas estándar que contienen los principales eventos utilizados en la mayoría de los juegos. También es posible crear sus propias bibliotecas utilizando Library Maker . GMS2 tiene un mecanismo incorporado para convertir las acciones de los botones en código GML y viceversa, lo que permite a los principiantes cambiar rápidamente a GML y mejora la comprensión de cómo funcionan las acciones estándar.

Sintaxis y semántica de GML

GML es estructuralmente similar a un lenguaje, con bloques de código, llamadas a funciones, asignaciones de variables, sintaxis de operadores, etc. GML distingue entre sentencias y expresiones. Por ejemplo,

gramo < 1;

no es una declaración válida y causará un error. Además, la asignación de variables siempre es un operador y, por lo tanto, no se puede usar en expresiones. Por ejemplo, la siguiente línea siempre generaría un error porque evaluaría la expresión anidada como verdadera o falsa y luego compararía el resultado booleano con la cadena "Sí" (comparación incorrecta):

if ((respuesta = get_string("Si o No?", "")) == "Si")

Vale la pena recordar que el signo igual "=" es un operador de asignación y un operador booleano de comparación en expresiones, mientras que en C ++, se escribe un signo doble "==" en expresiones. Sin embargo, el doble signo igual "==" se interpretará correctamente cuando se utilice en expresiones. El uso de dicho carácter como operador de asignación provocará un error de tiempo de ejecución. GML también admite operadores de incremento :

g++; // Se admiten tanto la notación de postfijo como la de prefijo

y

gramo += 1;

lo mismo que

gramo = gramo + 1;

También hay operadores: -=, *=, /=, |=, &= y ^=. A partir de GMS2, ​​¿soporte para el operador ternario ?: se ha introducido . Los operadores en GML pueden estar separados por punto y coma, pero esto no es obligatorio (aunque puede dar lugar a un error en algunos casos específicos).

Funciones

Game Maker contiene una extensa biblioteca de funciones integradas para proporcionar una funcionalidad básica. El programador puede crear sus propios scripts que se llaman exactamente de la misma forma que las funciones. Las funciones de dibujo en Game Maker utilizan la API de Direct3D . Si es necesario, Game Maker también permite llamar al código nativo de la plataforma a través de extensiones (DLL en Windows, Java en Android, JS en HTML5, etc.).

Variables

Por lo general, GML no necesita declarar previamente una variable, como lo hacen otros lenguajes. Una variable se crea automáticamente, inmediatamente después de asignarle un valor:

foo="barra";

Game Maker tiene muchas variables y constantes integradas . Cada instancia de objeto contiene muchas variables locales, como "x" e "y". También hay varias variables globales integradas, como "puntuación". Estas variables existen independientemente de las instancias del objeto. Estas variables no contienen el prefijo " global ", a diferencia de las variables globales especificadas por el programador. También se admiten matrices unidimensionales y bidimensionales .

Estructuras de datos

GML tiene funciones para crear y editar seis tipos de estructuras de datos : pila , cola , lista , mapa (arreglo asociativo), cola de prioridad y cuadrícula. También se puede acceder a la cuadrícula, la lista y el mapa a través de accesores que proporcionan una sintaxis similar a la de una matriz:

valor var = lista[| 0]; // en lugar de ds_list_find_value(lista, 0) mapa[? "nombre"] = "Nombre de usuario"; // en lugar de ds_map_add(mapa, "nombre", "Nombre de usuario") valor var = mapa[? "nombre"]; // en lugar de ds_map_find_value(mapa, "nombre");

Tipos

GML admite los siguientes tipos de datos:

Alcance de las variables

Si bien se puede pensar en GML como un lenguaje orientado a objetos , la naturaleza de los objetos y las instancias de objetos en Game Maker crea algunas diferencias importantes en la forma en que se delimitan las variables. Hay dos tipos de localidad: localidad en un objeto y localidad en un script (u otra pieza de código contenida en un contenedor separado). El hecho de que una variable sea local para una instancia de un objeto significa que la variable está vinculada a una instancia particular del objeto y solo se puede usar desde fuera de esa instancia con el prefijo que define esa instancia; el hecho de que una variable sea local para un script significa que la variable solo se puede usar en ese script (y se destruye cuando finaliza el script). De ahora en adelante, el término "local" significará localidad en un objeto. De forma predeterminada, una variable es local para el objeto, pero no para el script en el que se usa. Para que una variable esté disponible para todas las instancias de objetos, se puede definir a través del espacio de nombres global :

global .foo = "barra";

También es posible declarar variables globales utilizando la palabra clave globalvar :

globalvar foo, bar;

Pero este método debe evitarse, ya que fácilmente puede conducir a errores difíciles de detectar debido a la intersección de alcances de variables (lo mismo recomiendan los propios desarrolladores de GMS; además, es posible que en el futuro esta palabra clave sea completamente eliminado del idioma; por el momento se deja únicamente por razones de compatibilidad con versiones anteriores). Para hacer que una variable sea local para un script, debe definirse así:

var foo, bar;

El alcance de una variable local es el script dentro del cual se declara. Esto implica que seguirá estando disponible en un cambio de contexto (usando con ). Por ejemplo:

var foo = "barra"; con otros { mostrar_mensaje(foo); // la variable foo está disponible }

Se puede acceder a las variables locales de un objeto utilizando el identificador de instancia del objeto como prefijo

instancia.varname

sin embargo, no es posible obtener las variables locales de un script de otro de esta manera a menos que se pasen como parámetros de función. El espacio de nombres actual de un objeto se puede cambiar con la construcción " with ". Por ejemplo, el siguiente script, si se coloca en un evento de colisión , destruirá la otra instancia del objeto involucrado en ese evento (tenga en cuenta que en el evento de colisión, Game Maker establece automáticamente la variable other en la segunda instancia del objeto que fue chocó):

con otros { instancia_destruir(); }

Asignación de memoria

GML asigna automáticamente memoria para las variables sobre la marcha y utiliza tipos dinámicos , por lo que también es posible asignar valores de diferentes tipos a las variables. Por ejemplo, primero puede crear una variable entera y luego cambiarla a una cadena:

NúmeroInt = 1; intNumber = "Esta variable ahora contiene una cadena";

No existe una funcionalidad especial en GML que le permita liberar la memoria ocupada por una variable, sin embargo, si es necesario, puede asignar un nuevo valor más pequeño a la variable. Por ejemplo, si tiene una variable que almacena texto grande, establecer la variable en una cadena vacía puede liberar memoria. Lo mismo ocurre con las matrices:

datos = [1, 2, 3, 4, 5]; // creó una matriz (esta sintaxis para crear matrices está disponible desde GMS2) datos = 0; // destruyó la matriz (ahora es solo una variable)

Cuando se destruye un objeto, todas las variables locales también se destruyen y las variables globales existen independientemente de ellas. Por lo tanto, se debe dar preferencia a las variables locales, y las variables globales se deben usar solo si es realmente necesario. Para almacenar grandes cantidades de información de manera más eficiente, Game Maker admite varias estructuras de datos, como pila, cola, lista, mapa, cola de prioridad y cuadrícula. Estas estructuras se crean, modifican y destruyen a través de funciones integradas. También hay funciones en casi todas las estructuras para ordenar datos en ellas. En algunos casos, será más conveniente y más eficiente usar búferes que le permitan almacenar datos arbitrarios y, de hecho, son solo piezas de memoria asignadas.

Objetos y recursos

El trabajo de Game Maker con los recursos se basa en identificadores únicos que se utilizan para identificar un recurso específico o una instancia de objeto. Estos identificadores pueden ser utilizados por scripts o funciones para indicar el recurso requerido. Dado que la creación de recursos directamente en Game Maker requiere un nombre, este nombre sirve como una constante que contiene el identificador del recurso. El ID de una instancia en particular se almacena en la variable local " id ". Al crear recursos de forma dinámica, siempre se devuelve el identificador del recurso creado, que se puede utilizar más adelante.

Ejemplos de guiones

Aquí hay un ejemplo de script simple que imprime el legendario " ¡Hola, mundo!" »:

show_message("¡Hola mundo!");

Otro ejemplo que muestra el mismo texto, pero en la ventana del programa. Tenga en cuenta que, de forma predeterminada, Game Maker redibuja continuamente la ventana, por lo que, en el caso normal, este código debe colocarse en el evento de sorteo.

dibujar_texto(10, 10, "¡Hola, mundo!");

Aquí hay un fragmento de código del juego GML:

// esto es un comentario /* Así es como se escriben los comentarios en C++. */ /* definición de variables temporales. Estas variables se eliminarán después del final del script. Tenga en cuenta que las variables no requieren ninguna definición de tipo. */ var xx , yy , nn ; // Condición. Se puede acortar a "si (puede_disparar)". if ( can_shoot = true ) // "=" y "==" pueden usarse { // Inicio del bloque de código. También puedes escribir "comenzar" como en Pascal. /* Establecer la variable en falso. Lo mismo se puede escribir así: "can_shoot = 0;" Dado que Game Maker no distingue entre valores booleanos y enteros. */ puede_disparar = falso ; /* Aquí establecemos un temporizador cero para cinco pasos. La variable del temporizador bajará a 0 y, cuando lo alcance, se llamará al evento de contador cero. */ alarma [ 0 ] = 5 ; /* Aquí la variable local xx se define como un número entero, Y se usa la función lengthdir_x. */ xx = x + longituddir_x ( 14 , dirección ); yy = y + longituddir_y ( 14 , dirección ); //Esta función crea una instancia de obj_bullet y devuelve el ID del nuevo objeto. nn = instancia_crear ( xx , yy , obj_bullet ); /* La declaración with le permite acceder directamente a las variables del objeto */ con ( nn ) { velocidad = obj_tanque . velocidad + 3 ; dirección = obj_tank . dirección ; } }

Los estilos de código se pueden mezclar. Por ejemplo, el ejemplo anterior podría escribirse así:

var xx , yy , nn ; si puede_disparar = verdadero entonces comience puede_disparar := falsa alarma [ 0 ] := 5 xx := x + lengthdir_x ( 14 , dirección ) yy := y + lengthdir_y ( 14 , dirección ) nn := instancia_crear ( xx , yy , obj_bullet ) con nn comienza la velocidad := obj_tank . velocidad + 3 dirección := obj_tank . dirección final final

Aquí hay un ejemplo de un control de teclado normal. La función motion_set toma dos parámetros: dirección (en grados) y velocidad (píxeles por paso). Llamar a esta función cambiará la velocidad y la dirección de las variables locales integradas que usa Game Maker para mover objetos (los objetos también se pueden mover directamente usando las variables locales x e y):

if ( keyboard_check ( vk_left )) motion_set ( 180 , 4 ); if ( keyboard_check ( vk_up )) motion_set ( 90 , 4 ); if ( keyboard_check ( vk_right )) motion_set ( 0 , 4 ); if ( keyboard_check ( vk_down )) motion_set ( 270 , 4 ); if ( keyboard_check ( vk_nokey )) motion_set ( 0 , 0 );

Y aquí hay un ejemplo de un guión más complejo para un juego de plataformas. Usándolo, el jugador puede caminar sobre una superficie convexa:

si ! lugar_libre ( x -4 , y ) { si lugar_libre ( x -4 , y -4 ) { x- = 4 y = 4 } más si lugar_libre ( x -3 , y -5 ) { x = 3 y- = 5 } más si lugar_libre ( x -2 , y -6 ) { x- = 2 y = 6 } } más x- = 4

Crítica

La sintaxis suelta de GML facilita la creación de juegos hasta cierto punto, pero puede generar código completamente ilegible: cambiar 0 comenzar caso 0 : x = 0 romper } si a = 0 luego comenzar b = 1 } de lo contrario si a == 0 { b := 1 fin Aunque no forma parte del lenguaje, otra crítica común a las versiones anteriores de Game Maker fue el proceso de creación de archivos EXE, que consisten en un cargador y recursos de archivos GM. Al iniciar un juego de este tipo, el código se analiza en un árbol de sintaxis abstracta (se utilizó la interpretación del código), lo que facilitó la descompilación y aumentó significativamente el tiempo de carga. Sin embargo, en versiones más modernas (GameMaker: Studio), se han cambiado los mecanismos, por lo que no hay problemas ni de velocidad de lanzamiento ni de descompilación (no hay descompiladores para GMS).

Literatura

  • Mateo De Lucas. GameMaker Programación de juegos con GML. - Paquete, 2014. - 350 p. — ISBN 978-1-78355-944-2 .

Véase también

Enlaces