Godot. Static, Tool и два Enums'a
Всем привет, редко писать стал, погряз в трудах праведных времени свободного мало. Сейчас в основном занимаюсь обвязкой для метагейма, апгрейды, покупки и т.д. Ну и открыл для себя немало удобных штук, думаю надо поделиться своими соображениями с сообществом.
Да, под метагеймом я подразумеваю не MostEffectiveTactic, а абстрагированное развитие прогресса игрока, вне основной геймплейной сессии.
А потому в этом посте, будет простенькое хранение игровой валюты, отображение её на экране и кнопочка с помощью которой можно будет потратить эту валюту)
Создал пустой проект, в которых запихнул три иконочки.
Перво наперво надо её где-то хранить, запилим CurrencyStorage. Можно это конечно сделать синглтоном или ещё как, но в этом случае я сделаю, используя статичные функции, меня недавно распрашивали насчет них, кому-то видимо нужно и может пригодится, да и сам я ими пользуюсь в различных Utils классах.
Важное замечание, в gdscript есть статичные функции, но нет статичных переменных, что с одной стороны странно и неудобно, с другой стороны хорошо) Но эту неприятность легко можно обойти, например в константе хранить массив, словарь или свой пользовательский класс.
Использую словарик.
Обратите внимание, что класс CurrencyStorage, ни отчего не наследуется, его экземпляров мы создавать не будем, при попытке запихать его в AutoLoad будет ошибка.
Ну ладно. проверим что все работает как надо
Теперь сделаем универсальный Label, который будет показывать не только количество, но и содержать в себе иконку валюты.
Сейчас можно расставить наши IconLabel в сцене Main, запустить и игра упадет.
Связано это с порядком выполнения методов _ready() в дочерних и родительских нодах, а если помните то CurrencyStorage.store() я поместил именно в _ready.
Кстати непонимание этой разницы вызывает немало ошибок у новичков, поверьте я знаю с двумя новичками и сотрудничаю сейчас.
метод _ready() это не конструктор, он вызывается когда экземпляр уже добавился на сцену в результате add_child(). Конструктор, который вызывается при создании экземпляра это _init()
И порядок выполнения следующий:
parent -> _init()
child -> _init()
...
child -> _ready()
parent ->_ready()
_init родителя вызывается раньше чем _init потомка, но добавляются на сцену они в обратном порядке, что в принципе очень даже логично)
Перенесем загрузку стартовых данных в _init()
Для каждой IconLabel не забудьте указать разный тип. И я кстати косякнул, два раза в match указал Gold, вместо Silver.
Собственно результат при запуске.
В редакторе же мы видим далеко не такую красоту, там тлен и пустота.
Согласитесь очень неудобно, ведь надо же не только вывести, но и красиво расставить.
Для этого воспользуемся ключевым словом tool.
собственно результат
Картинками не показать, что меняется в редакторе, вот видосик держите.
Наберет если пост 15 лайков, то напишу и продолжение про пользовательскую кнопку для покупок за валюту, и покупке валюты за рубли)) Тонкий байт на лайки, эндорфинов не хватает, а каждый лайкосик дает немало)
Ну и ссылка на чатик сообщества в тг https://t.me/Godot_pikabu
Можно позадавать или поотвечать на вопросы или просто пофлудить, но без троллинга и токсичности плз.
p.s. А иногда tool не сразу почему-то работает после добавления его в скрипт, бывает нужно релоаднуть проект.