Как в Game Maker Studio 1.4.9 делать преднастройки переменных объекта?
Мне нужно сделать разные меню с одним скриптом.
Но как сделать так, чтобы содержание меню менялось?
В GMS если делать разные объекты под каждое меню отдельно, то код меню на каждом объекте будет уникален, а мне нужен один код на все меню?!
UPD: Сделал первый пример, Спасибо всем! :3
- 19 мая 2020, 07:03
- 00
Ты имеешь в виду что хочешь один раз написать логику "можно листать вниз, можно листать вверх, можно активировать", но чтоб в разных меню были разные действия? Для этого традиционно используют наследование. Делается один объект-родитель всех меню (его в игре не будет), а все конкретные меню игры его логику наследуют. И если ты решишь поменять что-то в самом принципе переключения меню, или в его отрисовке, то тебе достаточно будет поменять это только в объекте-родителе. Но ты можешь оверрайдить и переключение, и отрисовку, и оба из них, в конкретных меню, в объектах-наследниках.
Спасибо, Ксит! А я всё думал зачем тут родители и чайлды, думал неудобно будет тут структуру сделать как в юнити, там на уровне есть один родитель и куча чайлдов, а оказывается тут не для уровня, а для программирования. Пошёл гуглить про наследование.
Не найдёшь ничего. Щас в айти нужных программистов некому учить, а про геймдев вообще шаром покати.
Вот держи, с нуля исходник сделал, конкретно иллюстрирующий как это делается:
https://www.dropbox.com/s/8d77fjft6laxo9g/ParentMenus.gmz?dl=0
Конечно могут понабежать Хейзеры и сказать что нафиг свитч-кейзы, но тогда придётся каждый раз из объекта меню переключаться на скрипты задаваемые пунктам. Или распихивать их по юзер-ивентам как ДД. Сути наследования основного функционала меню это не меняет.
event_inherited() выполняет код родителя из такого же ивента. Если в объекте-потомке нет ивента который есть в объекте-родителе, то код из объекта-родителя выполняется автоматически (в моём исходнике это происходит с Draw конкретно).
О, спасибо! Почему-то в документации не нашёл примеры кода про паренты.
Хотя в сети нашёл, вроде начал понимать как это устроено.
https://developer.amazon.com/blogs/appstore/post/e355260d-ffed-4807-8f62-25dd0c8164f4/gamemaker-basics-parenting-and-inheritance
Так можно сделать группу врагов, группу друзей, группу опасности, группу меню, если правильно понял.
Да, для этого и нужно в большинстве случаев. Очень полезная штука. В GMS2 вообще круто это реализовано. Там в чайлдах видны события парента. Чего нет в GMS 1.4. Рекомендую всё же перейти на GMS2. Там довольно многое сделано по-другому и сделано лучше.
Спасибо ещё раз, очень помог пример! :3

Хотя я немного прокачал меню, совместил свитч и отдельный скрипт.
Просто не люблю когда свитч от цифр зависит, лучше от текста, чтоб можно было менять кнопки местами как хочешь или делать инвентарь в будущем.
Вдобавок можно функции меню вызывать не из меню вообще, например чтобы открыть меню:
menus("open",menuTest);
А ещё всё управление меню вынес в родителя. Но начальные настройки стали чуть сложнее, потом придётся ещё для картинки/иконки добавлять один массив.

Круто развил. Это дело.
Ты только не забудь что локаль потом может понадобиться приспособить не английскую. И понадобится разделять внутренние команды в свитчах и текст который на самом деле рисуется на кнопке.
Там кстати не от текста зависит, а от идентификатора кнопки (отдельный массив), но также у меня пока нет идей, как сам текст делать сразу для перевода. Какой самый простой способ сделать текст так, чтобы его легко было переводить на GMS?
Самый простой? Я бы сказал что писать везде только locale[N], где N это индекс строки в глобальном массиве locale, который читается из внешнего INI-файла со всё тем же CSV внутри на каждый язык. То есть содержимое файла:
Russian="Старт";"Загрузить";"Выход"
English="Start";"Load";"Exit"
В коде пишешь locale[0] там где Старт, 1 там где Загрузить, 2 там где Выход.
У нас в Замке Невозврата так доходит до locale[250] где-то, и 30 языков в игре - всё работает.
Инициализация:
Скрипт explode_string_list:
Начало файла Locale.ini для примера формата:
Символ ^ я выбрал в качестве разделителя потому что в текстах мне понадобилась точка с запятой. Так что по факту это не CSV (Comma-Separated Values), а... Caret-Separated Values, тоже CSV. :yak:
Как ты понял, это та причина почему скрипт explode_string_list вызывается с параметром "^".
P. S. И да, это простой способ. Если ты хочешь сложный, то в коде придётся писать каждый раз не locale[число], а идентификатор по типу locale[? "title_menu_start_button_text"] и в файл локали придётся добавлять каждый идентификатор тоже. То есть будет:
[English]
title_menu_start_button_text="Start"
...
[Russian]
title_menu_start_button_text="Старт"
И так все тексты. Раздувает файл локали и обращение к локализованным строкам в коде сразу в 2+ раза.
Спасибо) как раз с этим сейчас мучаюсь.
Правда не понял зачем working_directory, это вроде локальная папка виндовса для сейвов:
1) но тогда как туда запихать файл с переводом, перед тем как игра запуститься?
2) и как с файлом перевода работать в режиме разработчика, то есть напрямую из GMS?
плюс

3) ещё пытаюсь найти где тут операция Split, как в JavaScript и C#, кажется будто нету,
чтобы автоматически string текст разделить на массив, а по идее должна быть...
полез гуглить)
4) ещё также мне интересно можно ли хранить текстовые файлы внутри ресурсов, ещё и уметь их читать,
например чтобы базы данных быстро составлять, вместо того чтобы объекты делать с таким странным кодом инициализации, я бы мог бы сделать небольшой текстовый файл со всеми данными для кнопок
3) https://www.gmlscripts.com/script/explode
4) Собственно, эта же ссылка. Пример оттуда процитирую:
Это отличается от варианта с Included files тем, что конечный пользователь (геймер) поменять твои настройки кнопок не сможет, ну и ведь это системное меню. Но ты можешь сделать и так и так.
Спасибо, то что надо :)
Тебе нужно поместить этот файл в категорию ресурсов Included files (слева там где в ГМС1 объекты, спрайты и прочее, почти в конце внизу), и тогда он будет автоматически дописываться к дистрибутиву игры.
Такой возможности не предусмотрено, но из геймдев-IDE я вообще не помню чтоб что-то позволяло редактировать локали прям параллельно с разработкой игры. Все 30 локалей Замка Невозврата 2 сделаны в Блокноте, и только из-за того что добровольцы все поголовно хотели Эксель, мне приходилось запаковывать их в две колонки - английский и требуемый язык, то есть оригинальный текст транспонировать (переводить строку в колонку), а потом при получении готового перевода транспонировать обратно. Но тебе для твоих целей Блокнота с головой, по-моему.
И да, в ГМС2 можно редактировать внешние текстовые файлы прямо в IDE.
Наверное я плохо объяснил, хотел спросить как работать в режиме GMS с файлом (не редактировать, а чтоб все текста работали), но вроде бы первый ответ это ответ и на второй вопрос, сейчас потестирую)
Так то я могу с CSV и в Open Office работать (аналог Excel), чтоб не запутаться в знаках препинания.
Да, это и есть ответ.
получается в Included files вообще можно левые txt файлы держать, чтобы их читать для каких-то своих данных, например для информации кнопок меню или покупки в разных магазинах/вещи в сундуках, надо потестить
ещё бы понять как много файлов можно держать в Included files
В Замке Невозврата 2 их как минимум 100, стопудово тебе хватит.
Получается то что в Included files потом при запуске игры на другом компе эти все 100 файлов перенесутся в working_direction (то есть локальную папку винды)? И игрок их сможет редактировать, если найдёт? Или я не так понял?!
working_directory, не working_direction.
Да, так и будет. Вообще, возможность моддить игру это скорее приятно для игрока, чем нет, согласись. Если ты не делаешь мультиплеерную игру где нужно бороться с читерами, это ничего не портит. Да и много ли сейчас людей лазит по системным файлам игры. Мне кажется, современное поколение на смартфоны-планшеты всё подсело и еле помнит что такое ПК кроме как для просто_играния или работы.
Да в принципе не проблема)