Как в Game Maker Studio 1.4.9 делать преднастройки переменных объекта?
Мне нужно сделать разные меню с одним скриптом.
Но как сделать так, чтобы содержание меню менялось?
В GMS если делать разные объекты под каждое меню отдельно, то код меню на каждом объекте будет уникален, а мне нужен один код на все меню?!
UPD: Сделал первый пример, Спасибо всем! :3
- 19 мая 2020, 07:03
- 00
Ты можешь двумерный массив использовать
Там даже функция для получения длины массива есть так что это не проблема.
Можно через дата-структуры пойти, но в GMS с ними работать запутанно. Когда 2.3 выйдет - там вообще пиздато станет - как с двумерными массивами можно будет работать.
Спасибо! Я хотел второе измерение использовать для двумерного меню,
как например инвентарь как в Зельде, где предметы расположены 2-мерным списком.
А одномерный список для простых меню.
Но жаль, что всё равно придётся предустановку переменных делать только кодом
для меня это шок после использования Юнити.
Если ты про функционал выноса в панель компонента переменных с возможностью овверайда этих переменных у прафабов то такое есть во второй студии. Я про это писал ещё. Что есть прям variables которые ты опередляешь с дефолтными значениями у объекта, у чайлда и инстанса можешь эти значения переопределить.
А чем плохо делать инвентарь двумерным массивом и меню двумерным. Это же вроде не взаимоисключащие вещи, да и сущности разные. Для инвентаря лучше ds_map и ds_grid использовать. Хотя бы потому что ты при сохранении вызываешь у них функцию _write и получаешь строку, на загрузке читаешь эту строку функцией _read и получаешь снова структуру.
Вообще рекомендую сохраняемые глобалы хранить в ds_map. Потом проще будет сохранения делать.
Мне структура ds_map нравится, похоже на словарь из других языков (dictionary) типа JS и C#.
ну ещё можешь ds_list использовать вместо массива и ds_map для навигации между менюшками
И там дальше создаёшь всякие current_menu и current_select чтобы сделать менеджмент и отрисовку. Надеюсь, сам сможешь =)
Это кстати не факт. Если использовать ds_map_add_list, то ненужно, да. Но вот если использовать ds_map_add (что равно доступу через "[? ]"), то ГМС будет думать, что добавили просто число.
Пару раз я наткнулся на это и оно отучило меня писать через простой аксессор для ds_map\ds_list
Это да. Я к тому что я не делаю сразу ds_list_destroy(temp_list), хотя по правилам программиста если выделил память - будь добр её освободить. Если создавать список временно то это нужно делать обязательно.
Про ds_map_add_list не знал, давно не заглядывал в этот раздел хелпа =)
Я вчера придумал другой способ:
У нас есть объекты разные меню. При создании объекта - инициируется одно меню.
И объект заносится в список menus[] = self.
То меню, которое самое верхнее (последнее созданное) и будет активным.
При закрытии меню, объект удаляется, и тот объект-меню, который был предпоследний теперь активный.
Внутри объекта каждый кадр мы обращаемся к скрипту WorkMenu(self) ; и отправляем скрипту "себя",
а в self тут как раз все переменные, вся инфа о меню, чтобы скрипт WorkMenu мог работать с этим.
Надеюсь сработает, а то пока только в уме продумал.
Надеюсь списки у каждого объекта свои личные. Чтобы у каждого объекта был разный набор кнопок.
Ещё надо погуглить как делать публичную переменную (public), а то пока не понял.
В гамаке нет разделения на публичные и приватные.
Все локальные переменные объекта публичные. Это те которые ты объявил через присвоение.
Всё что объявлено через var - локальные для блока кода. Причём в конструкции with на них нужно просто ссылаться без указания other. С other просто ничего не получится
Через globalvar можно объявлять глобальные переменные
А можно через объект global, например global.myvar = 5, на этом настаивают разработчики, но тогда ты везде должен будешь юзать приставку global. Лично мне неудобно так что я через globalvar всегда делаю.
Списки (они же массивы) - локальные переменные и для каждого свои. А вот всякие айдишники которые возвращают ds_list_create, sirface_create, instance_create и т.д. - они глобальные.
жаль ds_list_create у каждого объекта не свой, а то можно было бы прикольные вещи творить
Можно и свой сделать. Это же просто число. Храни его в переменной объекта и всё.
Странная система на самом деле. WorkMenu(self) не будет работать. Лучше так что ли:
with menus[array_length_1d(menus)-1] WorkMenu()
Но тебе придётся как -то дописывать айдишники чётко в конец массива. Лучше какие-нибудь ds_list что ли.
Ну может и правда переборщил. Просто хотел, чтобы один объект отвечал за всё меню.

А другой за другое меню, если оно выше находится.
С другой стороны второе меню будет только с проверкой Yes/No, а в остальных случаях меню будет всегда одно на текущий момент.
"WorkMenu(self) не будет работать."
Cейчас попробовал Self передать в скрипт из объекта и вроде работает идеально, в объекте есть переменная rnd, но может тут другие проблемы есть: