Это функциональное назначение доступно только в Pro издании Game Maker.
Пожалуйста, обратите внимание, что начиная с версии 7 есть новый механизм расширения в Game Maker. Строго рекомендуется использовать этот механизм расширения, а не функции, описанные в этом разделе. За подробностями обращайтесь на http://www.yoyogames.com/extensions. Эти функции оставлены для совместимости с пришлыми версиями.
В тех случаях, когда функциональных возможностей GML для Ваших грандиозных планов не хватает - Вы можете реально расширить возможности, используя плагины. Плагины должны быть в форме DLL файла (динамически загружаемых библиотек). В таком DLL файле Вы можете определить функции. Такие функции могут быть написаны на любом языке программирования, которые поддерживают создание DLL (например, Delphi, Visual C++, Visual Basic и т.д.). Для этого Вам необходимо как минимум знать один из таких языков и иметь опыт программирования. Плагины с функциями должны иметь специфический формат. Они могут содержать между 0 и 16 аргументов, каждый из которых может быть вещественным числом (double in C) или строкой с нулевым символом в конце. (Для плагинов содержащих более четырёх аргументов, только реальные аргументы поддерживаются на данный момент). Они должны возвращать либо вещественную строку, либо строку с нулевым символом в конце.
В Delphi для создания DLL библиотеки Вы выбираете пункт New из меню File и выбираете DLL. Далее приводится пример DLL, который Вы можете использовать в Game Maker написанный в Delphi. (Обратите внимание, что это - Delphi код - не 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.
Эта DLL определяет две функции: MyMin, которая берёт два реальных параметра и возвращает минимальный из этих двух, и DoubleString, которая удваивает строку. Обратите внимание, что нужно быть внимательным с использованием памяти. Именно поэтому объявлена результирующей глобальная строковая. Также обратите внимание на использование cdecl - соглашений о вызовах. Это важно. Как только Вы создали DLL в Delphi, у Вас получится файл MyDLL.DLL. Этот файл должен быть помещён в каталог с Вашей игрой. (Или иное место, где Windows может найти его).
Чтобы использовать указанный DLL в Game Maker - Вы сначала должны определить внешние функции, которые хотите использовать и какой тип аргументов они берут. Для этого в GML имеются следующие функции:
Каждая из этих функций возвращает идентификатор внешней функции, которая должна использоваться для его вызова. Так в вышеприведенном примере, в начале игры Вы использовали бы следующий GML код:
{
global.mmm = external_define('MyDLL.DLL','MyMin',dll_cdecl,
ty_real,2,ty_real,ty_real);
global.ddd = external_define('MyDLL.DLL','DoubleString',dll_cdecl,
ty_string,1,ty_string);
}
Теперь всякий раз, когда Вам нужно вызвать функции, Вы используете следующую функцию:
external_call(id,arg1,arg2,...) Вызывает внешнюю функцию с заданным идентификатором и заданными аргументами. Вам нужно обеспечить правильное количество аргументов правильного типа (real или string). Эта функция возвращает результаты внешней функции.
Итак, например, Вы можете написать:
{
aaa = external_call(global.mmm,x,y);
sss = external_call(global.ddd,'Hello');
}
Если Вам больше не нужно использовать DLL, то лучше её выгрузить.
external_free(dll) Выгружает DLL с заданным именем. Её действительно важно выгружать из игры. Также DLL долго выгружается и не может быть удалена. Лучше всего выгружайте её в событии завершения игры.
Вы возможно не знаете как пишется функция в DLL, которая что-нибудь делает в игре. Например, Вы захотели создать DLL, которая добавляет образцы объектов в Вашу игру. Самый простой способ состоит в том, чтобы позволить своей функции в DLL возвращать строку, которая содержит часть кода GML. Эта строка, содержащая часть GML, может быть выполнена, используя функцию GML
execute_string(str,arg0,arg1,...) Выполняет фрагмент кода в строке str с заданными параметрами.
Дополнительно Вы можете позволить DLL создать файл со сценарием, который может быть выполнен (эта функция также может использоваться, чтобы позже изменить поведение игры).
execute_file(fname) Выполняет фрагмент кода в файле.
Теперь Вы можете вызывать внешнюю функцию и затем выполнить результирующую строку, например, следующим образом:
{
ccc = external_call(global.ddd,x,y);
execute_string(ccc);
}
В некоторых, редких случаях Вашей DLL может понадобиться знать о настройках основного графического окна игры. Это можно сделать с использованием следующей функции, и тогда может быть использована DLL:
window_handle() Возвращает настройки окна для основного экрана.
Обратите внимание, что DLL не могут использоваться в безопасном режиме.
Использование внешних DLL - чрезвычайно мощная функция. Используйте их только в том случае, если действительно уверены в том, что делаете.