Usando DLLs

 

Esta función solo está disponible en la versión registrada de Game Maker.

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 dinámico). En este archivo DLL se pueden definir funciones. Tales funciones pueden ser programadas en cualquier lenguaje que soporte la creación de DLLs (p. Ej. Delphi, C, C++, etc.). Aunque se necesita contar con ciertas habilidades de programación para poder hacerlo. Las funciones plug-in deben tener un formato específico. Pueden tener entre 0 y 11 argumentos, cada uno de los cuales puede ser un número real (double en C) o una cadena terminada en un carácter nulo. (Para más de 4 argumentos, sólo se soporta argumentos reales). Estas funciones deben devolver ya sea un valor real o una cadena terminada en carácter nulo.

En Delphi se puede crear una DLL seleccionando New en el menú File y luego eligiendo DLL. A continuación tienes un ejemplo de una DLL escrita en Delphi que puede ser empleada con Game Maker. (Esto es código de Delphi ¡no GML!)

library MyDLL;
 
uses SysUtils, Classes;
 
function MyMin(x,y:double):double;  cdecl;
begin
  if x<y then Result := x else Result := y;
end;
 
var res : array[0..1024] of char;
 
function DoubleString(str:PChar):PChar; cdecl;
begin
  StrCopy(res,str);
  StrCat(res,str);
  Result := res;
end;
 
exports MyMin, DoubleString;
 
begin
end.

Esta DLL define dos funciones: MyMin toma dos argumentos reales y devuelve el de menor valor, y DoubleString que duplica una cadena. Cabe recordar que se debe ser cuidadoso con el manejo de la memoria. Esta es la razón por la que declaré la cadena resultante como global. También nota el uso de la convención de llamada cdecl. Puedes emplear las convenciones de llamada cdecl o stdcall. Una vez que crees la DLL en Delphi tendrás 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 qué tipo de argumentos requieren. Para ello tenemos la siguiente función en el GML:

external_define(dll,name,calltype,restype,argnumb,arg1type,arg2type, …) Define una función externa. dll es el nombre del archivo dll. name es el nombre de las funciones. calltype es la convención de llamada empleada. Usa dll_cdecl o dll_stdcall. restype es el tipo del resultado. Usa ty_real o ty_string. argnumb es el número de argumentos (0-11). Después, para cada argumento debes especificar su tipo. Para ello usa nuevamente ty_real o ty_string. Cuando hay más de 4 argumentos todos ellos deben ser de tipo ty_real.

Esta función devuelve el id de la función externa que debe emplearse para llamarla. En el ejemplo de arriba, al inicio del juego usarías el siguiente código GML:

{
  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 función:

external_call(id,arg1,arg2,…) Llama a la función externa con el id y los argumentos dados. Necesitas proporcionar el número correcto de argumentos del tipo correcto (real o string). La función devuelve el resultado de la función externa.

Así, por ejemplo, escribirías:

{
  aaa = external_call(global.mmm,x,y);
  sss = external_call(global.ddd,'Hello');
}

Si ya no utilizarás la DLL, lo mejor sería liberarla.

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. en el evento game end.

Ahora te preguntarás cómo hacer una función en una DLL que haga algo en el juego. Por ejemplo, podrías querer una DLL que agregue instancias de objetos a tu juego. La forma más fácil es dejar que la función DLL devuelva una cadena que contenga una pieza de código GML. Esta cadena que contiene una pieza de GML puede ser ejecutada usando la siguiente función del GML

execute_string(str) Ejecuta la pieza de código en la cadena str.

Alternativamente puedes dejar que la DLL cree un archivo con un script que puede ser ejecutado (esta función también puede ser empleada para luego modificar el comportamiento del juego).

execute_file(fname) Ejecuta el código en el archivo fname.

Ahora puedes llamar una función 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 función y luego ser pasado a la DLL:

window_handle() Devuelve el handle de la ventana principal.

 

Nota: las DLLs no pueden ser empleadas en modo seguro.

El empleo de DLLs externas es una función extremadamente poderosa. Pero por favor haz uso de ellas sólo si sabes lo que estás haciendo.