GMS 2, как поменять разрешение для всех комнат?
Что-то я запутался переходя с GMS 1 на GMS 2, раньше я делал так на старте игры:
//Auto Resize Rooms View
for (var i=1; i<=room_last; i++) {
if (room_exists (i)) {
room_set_view (i,0,true,0,0,screenW,screenH,0,0,screenW,screenH,screenW*.45,screenH*.45,2,2,noone);
room_set_view_enabled (i,true);
}
}
- 11 января 2021, 15:54
- 00
Подсказал бы, но сам пока до конца не разобрался. По сути, настройки комнаты остались те же самые, но в коде слегка переименовали это дело. Раньше у нас было два понятия: сам вид и порт этого вида на экран. Теперь у нас есть: камера и порт этого вида на экран. Тут чисто ренейм произошел.
Если тебе инструкцию здесь не напишут, то лучше всего будет открыть свойства комнаты, и каждую настроечку, которая там есть повторить в коде. Тогда, думаю, ты со всем разберешься.
Спасибо! Да мне потом объяснили, как сделать. Это один раз при старте игры:
Оказывается там была ещё одна проблема, это камера её надо было к виду привязывать на старте комнаты,
и вроде теперь всё наладилось:
1) при создании главного не удаляемого объекта, где ядро игры (я назвал MAIN), или просто при старте игры:
2) при событии старта новой комнаты, (в тот же MAIN запихал):
(хотя может тут ещё есть подводные камни)
Наверное тему переименую в "Вопросы по GMS" 2 как-нибудь так, удалить её всё равно нельзя.
Оказывается там много изменений было, например оказывается что функция tile_layer_find кажется устарела,
иначе не понимаю почему у меня так сильно тормозит код превращения тайлов в массив, для быстрой коллизии,
и ещё для генерации событий.
Немного повозился с тайлами и почему-то этот код выдаёт ошибку "-1",
хотя слой я переименовал и он его нашёл, может дело в том что тайлы были перенесены с GMS 1?
Слой как будто бы и есть, но его как будто бы и нет?! Или просто слой не осознаётся как тайловый?
Всё понял. Сделал с нуля тайловый слой и всё заработало.
Оказывается чтобы правильно перенести с GMS 1 в GMS 2, тут было очень много лишнего кода и скриптов,
а также все слои для совместимости были попорчены. Короче, лучше начинать свой проект с нуля,
чем пытаться в этом продолжать копаться с GMS1 совместимой версии. Так и сделаю, буду постепенно переносить всю графику и искать замену старым функциям на GMS 2.
PS Хорошо что проект не долгострой и не оброс тоннами скриптов и контентом, а то я бы также офигел как это было с Unity, которая взяла и отменила Java Script,а у меня на JS был долгострой и 120-150 скриптов в том проекте на юнити.
При переносе тайтлов с GMS1 на GMS2, он создаёт слой ассетов, в которых размещает обрезанные спрайты тайлсета. Самое смешное что сам ты поместить на слой ассетов такие кадрированные спрайты не можешь.
Так что да, нужно создать именно тайлсет и тайловый слой и там разместить тайлы. Функции для работы с тайлами в GMS2 совершенно другие. Кодом управлять не очень удобно на деле.
Печально будет, если кто-то делал очень много уровней на GMS 1, а потом это всё придётся переводить в другой формат. Ну ладно, благо я только начал.
Но вообще тут много чего интересного в GMS 2, правда из-за этого код приходится переписывать,
думаю возможно переписать свой старый код GMS 1 для кнопок меню из такого формата:
То есть тупо, очень много массивов привязанных к одной кнопке.
Хочу заменить на struct , чтобы в одной яйчейке массива было всё сразу, все данные.
Только я пока не уверен как это написать, но примерно понял. Надеюсь можно struct привязывать к массиву,
по типу:
пока ещё не тестировал, надеюсь я не ошибся с кодом
Ну и где-то саму структуру кнопки сделать, только пока хз где, может прямо тут или в глобальном объекте:
PS или может есть ещё лучше вариант, и я просто не шарю?!
или может лучше такой вариант? только как потом удалять такую структуру?...
Ну главное чтобы этого было достаточно, чтобы не было утечек памяти!
Потестировал код, вроде работает.
А я тут застрял на новом пункте, как вызывать функции из объекта и где эти сами функции внутри объекта хранить.
Может я не правильное место выбрал для функций в объекте, хотя читал что вроде как можно теперь любые функции добавлять прямо в объект, попробую погуглить эту тему.
Что-то не гуглится тема про кастомные User функции внутри объекта, либо они не так называются, либо мне приснилось, что я где-то это читал... xD либо я просто видел это в годоте, а подумал про GMS)
PS Возможно придётся и дальше юзать внешние Scripts, надеюсь когда их накопится под 500-1000 штук из-за того что придётся много локального интерактива делать под каждый отдельный объект это не выльётся в проблему.
Кастомные User ивенты (не функции) вызываются только по номерам, если ты о них.
Жаль, а по номерам не интуитивно и не удобно(
Так это и не надо делать, ведь теперь, с ГМС2.3, есть именно функции.
Так убери
self.
просто?Всё равно не работает, и в дебагере показывается странно, как будто самого объекта нету.
А o_test выглядит так и он тоже есть на уровне, как и объект вызывающий функцию.
Проблема в том, что твой GAME идёт раньше, а ты в его событии Create делаешь with(o_test) UseIt(); а у самого o_test лишь в Step событии ты задаёшь функцию эту.
Но если появляется ошибка, значит в Game with(o_test) срабатывает, но причина всё равно в том, что определяешь ты уже после того, как вызываешь. Переставь определение функции в Create событие.
Спасибо! Теперь всё заработало! :3
Получается если я хочу вызвать из Step, то лучше функцию в Step у другого объекта держать?
PS а нет, лол, похоже всё равно лучше держать все функции в Create,
откуда бы вызов ни шёл. Спасибо ещё раз, теперь всё работает)
Теперь можно делать более крутые диалоги и больше интерактивности, давно хотел такие функции как: EatIt, UseIt, TalkIt, GrabIt и другой интересный функционал, без этих скучных и непонятных номерных эвентов как было в старых GMS .
PS Плюс ещё один нюанс - приоритет загрузки, если поменять местами эти 2 объекта, то опять будет ошибка.
Алекс, напомни, что именно ты тестируешь здесь? Для чего тебе тестировать то, чего тебе в игре не нужно? Это же комната инициализации, она служит только для того чтобы инициализироваться и никаких Use_It().
Да пока других скриптов нет, я просто тестировал, чтобы понять как архитектуру менять под новую версию GMS, какие есть возможности. Так что да, этого не будет в нормальной версии.
Есть разника как объявлять функции. Как я помню в справке было написано, что функции, которые объявлены через обычный function functionName() видны в этом блоке кода, за исключением случаев когда они объявлены в скриптах. А если функцию присваивать переменной через functionName= function() то она попадает в область видимости всего объекта и должна быть доступна через with.
Вот тут можно почитать: https://www.yoyogames.com/blog/549/gamemaker-studio-2-3-new-gml-features
Спасибо, надо проверить! А я думал эти способы ничем не отличаются, потому-что в примерах пишут "или так или так" без комментариев, чем способы функций отличаются, как будто это абсолютно одно и то же.
А из этого метода можно заранее проверить, есть ли в этом объекте например функция
Use_It = function() {...}
Я попробовал такой метод, но оно не работает:
Может есть альтернативная штука типа function_instance_exists, но в гугле не находится подобное?!
А жаль, очень полезная была бы штука, заранее проверять, можно ли объект использовать.
Проверил. Не заметил разницы, всё также очень важен порядок инициализации функций, а через with работает и первый вариант function Use_It() {...} если порядок объектов нормальный,
то есть Game позже инициируется, чем o_test.
Зато нашёл вот такую штуку, проверять есть ли функция у объекта,
надеюсь я не ошибся с концепцией, и метод и функция это же одно и то же???
Но пока-что этот код работает в моём примере.
Метод — это функция, привязанная к объекту (ну или структуре).
В
if (is_method(Use_It))
может случиться ошибка, еслиUse_It
не инициализирована, для надёжности можно ещё в одну проверкуif (variable_instance_exists(id, "Use_It"))
вложить. К сожалению, нельзя эти две проверки просто объединить через&&
, потому что в GM он не short circuit, насколько помню.Спасибо за информацию!
Сложная система, а чего-то попроще как в юнити нету?
Система SendMessage, то есть отправляем запрос на функцию, и если функция существует,
то будет запущена, а если нет, то игнорируем эту строку?
В GMS есть event_perform.
Сделай новый скрипт, назовём его допустим execute_if_exists(), внутри:
https://manual.yoyogames.com/GameMaker_Language/GML_Reference/Asset_Management/Scripts/script_exists.htm
И вызывай
execute_if_exists("Use_It", аргументы скрипта)
.Насчёт
is_method()
не знаю , вроде бы не все функции являются методами.Спасибо, Ксит!
Если требуется именно метод, наверное, можно так. Сделать скрипт
и вызывать его
SendMessage(target, "Use_It")
. Если нужно ещё аргументы пробрасывать, то вероятно сойдёт вот такая модификация:поскольку непереданные аргументы инициализируются в undefined, как в JavaScript.
Спасибо, выглядит интересно, надо записать и потестить!
В старых это обычно решалось макросом. Объявляем макрос TAKE_IT соответствующим 6, а потом вместо user_event(6) объекта пишем user_event(TAKE_IT). Хотя новые возможности гибче будут.
В новой версии макросы(константы) тоже есть. В таком случае действительно будет удобнее.
Но там минус в том, что есть ограничение на 15-16 констант всего. Хотя как вариант запуска тех функций, которых я не знаю, есть ли они в объекте.
Что за хрень, вроде говорили что теперь все скрипты наподобие
gml_pragma("global", ...)
срабатывают со своими декларациями до всей игры? Теперь что, можно не знать какие у объекта функции, пока не выполнится ивент где эти функции задаются? Для полноты вакханалии надо было добавитьobject_has_declared_function(...)
и проверять есть ли такая-то функция уже, или ещё нету. Фейспалм.Что странно, если убрать строку с функцией и заменить на что угодно другое, то внезапно всё норм,
видимо проблема в том что нельзя функцию так читать(?):
А что если
o_test.Use_It()
, только не в степе функцию эту объявляй?Так вначале и писал, но не понимал из-за чего была ошибка, потому потом добавил with, чтобы быть точно уверенным для тестирования.
Я при переносе проекта Zzzz с GMS1 на GMS2 переделал все 60 уровней игры. Заняло пару дней. А совсем недавно для Cold Silence все слои тайлов менял. Потратил часов 6-8 на это дело. В масштабах разработки игры - копейки. Основная сложность была - разобраться со слоями которых GMS2 нагенерил довольно много.