Game Maker - создание игр | HellRoom Games
Июль 13, 2025, 21:36:35 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
Новости:
 
   Начало   Game Maker Помощь Правила форума Поиск Календарь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Функторы  (Прочитано 16933 раз)
0 Пользователей и 1 Гость смотрят эту тему.
luden
GM Pro user
*

Репутация: 151
Offline Offline

Награды:
500 сообщений!За постоянность! [200 дней на форуме]
API: GameMaker Studio Master
Сообщений: 704


« : Январь 09, 2018, 12:07:17 »

Все их различия описаны как параметры
на локалварах, мне этот метод кажется удобным,
а паренты я так понял еще удобнее?
(с) Джамб

Тема про функторы в целом, кнопки для показательности.

Если коротко то функторы это указатели на функции(они же скрипты в гмл). Их довольно редко освещают во всяких учебниках(лично у меня их не было во всём институтском курсе для типапрограммистов), потому что они а) сложнее в использовании и отладке, чем циклы и условия, б) ценность их использования довольно сложно объяснить новичкам. В итоге может получится абсурдная ситуация когда программист уже дорос до их использования, но просто не слышал о такой клёвой штуке, и вместо функторов использует супергромоздкие машины состояний. Собственно им и посвящается. Если же вам кажется что решения вроде таких отличная идея, заходите в тему через годик-другой.

На пальцах, а лучше кодом в гмл это выглядит так -
Код:
scr = mysript;   //Приравниваем переменной скрипт. scr - переменная. myscript - название скрипта.
script_execute(scr);    //Вызываем скрипт записанный в переменную.

Создадим таким образом обещанную кнопку.
Допустим у нас есть уже подходящий спрайт с центровкой по центру. И некий obj_button с ним, мы обойдёмся без красивостей с подсветкой наведения и нажатия, только функционал.
Код: (Create event)
my_text  = "";   //Объявление переменных, делаем их пустыми, чтобы сразу увидеть если забыли проставить
my_script = noone;
 
Код: (LMB pressed event)
if (script_exists(my_script))  //проверяем наличие скрипта
{
  script_execute(my_script);  //исполняем скрипт
}
Код: (Draw event)
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);
}
« Последнее редактирование: Январь 09, 2018, 13:59:22 от luden » Записан
AndrewVideoGames
Главный Модератор
*

Репутация: 821
Offline Offline

Пол: Мужской
Награды:
За постоянность! [500 дней на форуме]За лояльность! [+750 репутации]5000 сообщений!За помощь новичкам!
API: GameMaker Studio Pro
Деятельность: А я кто? А я руководитель!
Сообщений: 7316



« Ответ #1 : Январь 09, 2018, 13:15:45 »

В первом куске кода есть комментарии, в других нет - нехорошо.
В Draw event'е, так подозреваю, перед рисованием текста должен быть draw_self?
И я бы всё-таки описал удобство такого подхода поподробнее, то-есть показать что таким образом можно одним объектом сделать множество кнопок, меняя только скрипт при создании объекта. Пока, как мне кажется, новичок заходит в тему, видит много странных букв и не понимает почему в LMB не проще сразу написать содержание scr_game_start. В общем говоря, показательный пример удобного подхода и неудобного (и со свичами и вообще с кучей объектов) и, может, с примером script_execute, в котором используется не только скрипт, но и аргументы.
А так, спасибо за статью, раньше помню делал со свичами, в текущем проекте объектов почти нет, но как меню начну делать, буду использовать script_execute.
+ тему я бы всё-таки назвал Функторы, слово "кнопка" только сбивает.
Записан
Dmi7ry
Гл. Администратор
*

Репутация: 1379
Offline Offline

Пол: Мужской
Награды:
5000 сообщений!За постоянность! [200 дней на форуме]За лояльность! [+1000 репутации]За помощь в развитии форума!Знаток Game Maker!За помощь новичкам!
API: GameMaker Studio Master
Деятельность: Code, design
Сообщений: 6626



WWW
« Ответ #2 : Январь 09, 2018, 13:41:49 »

Во-первых, то, о чём вы пишете - это простой callback, а не функтор (хотя callback и может быть функтором, GML - не тот случай).
Во-вторых, не понятно, зачем вы сюда приплели машины состояний. Эти вещи из разных опер. И эти самые колбэки точно также могут применяться в машинах состояний.
В-третьих, причины, которые вы описали - глупость.
Записан

- А какой, собственно, командой процессора колобок ест черта?
- Командой EAT...
Справка и FAQ в правом верхнем углу...
luden
GM Pro user
*

Репутация: 151
Offline Offline

Награды:
500 сообщений!За постоянность! [200 дней на форуме]
API: GameMaker Studio Master
Сообщений: 704


« Ответ #3 : Январь 09, 2018, 14:26:59 »

АВГ - пофиксил, то что фиксится легко. Спс. С показательностью нужно подумать.

Дмитрий - ооок. Ну ценить разницу между коллбэком и функтором это будет мой личностый рост.
Записан
DmitryDS
Потому что я такой-сякой
GM Pro user
*

Репутация: 159
Offline Offline

Награды:
За лояльность! [+150 репутации]1000 сообщений!За постоянность! [100 дней на форуме]
API: GameMaker Studio Master
Сообщений: 1061



WWW
« Ответ #4 : Январь 10, 2018, 10:55:49 »

Не уверен, что в GML можно реализовать функторы (хотя колбэки, конечно, вещь - здорово мне помогли в Anti-city, хотя я и не знал, что они называются callback).

Хотя...

Код: (o_funct Create event)
f_script = sc_SomeScript;

Код: (...используем "функтор")
var funct = instance_nearest(0, 0, o_funct); //Чем не вариант?
execute_script(o_funct.f_script, 100, "Lorem ipsum");


Не, вроде опять фигня какая-то. Да и GML'овские объекты - это немного не те объекты... Впрочем, если функции нужно иметь память о предыдущих состояниях - это самое то.
Записан

Я никогда никого не пытаюсь оскорбить или обидеть, хотя порой веду себя вызывающе. Не обижайтесь, я не со зла
luden
GM Pro user
*

Репутация: 151
Offline Offline

Награды:
500 сообщений!За постоянность! [200 дней на форуме]
API: GameMaker Studio Master
Сообщений: 704


« Ответ #5 : Январь 10, 2018, 11:38:47 »

Не думаю, что это вообще имеет отношение. У меня в Си, функторы(это-то хоть функторы?) выглядят как-то так -
Код:
void (*parse_CAN0)(CanRxMsg msg);
Просто указатель без лишних заморочек.
Записан
DmitryDS
Потому что я такой-сякой
GM Pro user
*

Репутация: 159
Offline Offline

Награды:
За лояльность! [+150 репутации]1000 сообщений!За постоянность! [100 дней на форуме]
API: GameMaker Studio Master
Сообщений: 1061



WWW
« Ответ #6 : Январь 10, 2018, 12:09:41 »

Ну, в GML указатели завезли с очень большим НО
А вообще, по определению, функтор - объект, который можно использовать, как функцию.
Записан

Я никогда никого не пытаюсь оскорбить или обидеть, хотя порой веду себя вызывающе. Не обижайтесь, я не со зла
MusNik
KeeVee Games
GM Pro user
*

Репутация: 733
Offline Offline

Пол: Мужской
Награды:
3000 сообщений!За постоянность! [200 дней на форуме]За лояльность! [+500 репутации]За отличную игру Rock painting story!За помощь в развитии форума!За отличные статьи по Game Maker!...
API: GameMaker Studio 2
Сообщений: 3241



WWW
« Ответ #7 : Январь 10, 2018, 16:54:36 »

это-то хоть функторы?
Нет)

Но это сложно. Нету официальной формулировки.
Изначально, в метематическом смысле, функтор — это идентификатор, описывающий реализацию математического понятия на языке программирования.
То есть любая штука, к которой применяется оператор вызова функции () — функтор. И функция, и указатель на функцию, и функциональный объект.

Но это уже никто не помнит и в современном мире функтор = функциональный объект. Например, класс с перегруженным operator() для C++.
https://msdn.microsoft.com/ru-ru/library/df74sak1.aspx
« Последнее редактирование: Июль 23, 2023, 09:57:10 от MusNik » Записан

Dmi7ry
Гл. Администратор
*

Репутация: 1379
Offline Offline

Пол: Мужской
Награды:
5000 сообщений!За постоянность! [200 дней на форуме]За лояльность! [+1000 репутации]За помощь в развитии форума!Знаток Game Maker!За помощь новичкам!
API: GameMaker Studio Master
Деятельность: Code, design
Сообщений: 6626



WWW
« Ответ #8 : Январь 10, 2018, 20:04:45 »

А вообще, по определению, функтор - объект, который можно использовать, как функцию.
Именно так. А в GML нет этих самых объектов вообще.
Записан

- А какой, собственно, командой процессора колобок ест черта?
- Командой EAT...
Справка и FAQ в правом верхнем углу...
luden
GM Pro user
*

Репутация: 151
Offline Offline

Награды:
500 сообщений!За постоянность! [200 дней на форуме]
API: GameMaker Studio Master
Сообщений: 704


« Ответ #9 : Январь 10, 2018, 23:12:10 »

Нет)
Да это объявление такое просто. Вызывается обычно -
Код:
parse_CAN0(arg);
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

HellRoom Games © 2006-2012 All Rights Reserved
Powered by SMF 1.1.21 | SMF © 2013, Simple Machines
Страница сгенерирована за 0.115 секунд. Запросов: 30.