Все их различия описаны как параметры
на локалварах, мне этот метод кажется удобным,
а паренты я так понял еще удобнее?
(с) Джамб
Тема про функторы в целом, кнопки для показательности.
Если коротко то функторы это указатели на функции(они же скрипты в гмл). Их довольно редко освещают во всяких учебниках(лично у меня их не было во всём институтском курсе для типапрограммистов), потому что они а) сложнее в использовании и отладке, чем циклы и условия, б) ценность их использования довольно сложно объяснить новичкам. В итоге может получится абсурдная ситуация когда программист уже дорос до их использования, но просто не слышал о такой клёвой штуке, и вместо функторов использует супергромоздкие машины состояний. Собственно им и посвящается. Если же вам кажется что решения вроде
таких отличная идея, заходите в тему через годик-другой.
На пальцах, а лучше кодом в гмл это выглядит так -
scr = mysript; //Приравниваем переменной скрипт. scr - переменная. myscript - название скрипта.
script_execute(scr); //Вызываем скрипт записанный в переменную.
Создадим таким образом обещанную кнопку.
Допустим у нас есть уже подходящий спрайт с центровкой по центру. И некий obj_button с ним, мы обойдёмся без красивостей с подсветкой наведения и нажатия, только функционал.
my_text = ""; //Объявление переменных, делаем их пустыми, чтобы сразу увидеть если забыли проставить
my_script = noone;
if (script_exists(my_script)) //проверяем наличие скрипта
{
script_execute(my_script); //исполняем скрипт
}
draw_self(); //отрисовываем кнопку
draw_set_halign(fa_center);
draw_set_valign(fa_middle);
draw_text(x, y, my_text); // и текст на ней
Собственно создание кнопки будет выглядеть как-то так -
var tmp = instance_create(x, y, obj_button); //создаём кнопку
tmp.my_text = "Start"; //присваиваем ей текст
tmp.my_script = scr_game_start; //присваиваем ей скрипт
Ну и конечно, нужно описать этот самый scr_game_start.
Выглядит поопрятнее бесконечного свитч-кэйза, плюс обязывает разбивать код на небольшие автономные куски, которые и менять удобно и вызывать из других мест.
Это самое простое использование, попробуйте пока его. Чисто для познания дзена, дальше уже сами разберётесь. Для повышения же завлекательности такого подхода оставлю ещё один кусок кода -
while (ds_list_size(scripts_list) > 0)
{
script_execute(scripts_list[| 0]);
ds_list_delete(scripts_list, 0);
}