Войти
ПрограммированиеФорумИгровая логика и ИИ

Вопрос по загрузке/удалении объектов на сцену на Godot

#0
20:24, 21 янв 2023

Доброго времени суток.
Я начинающий (совсем) разработчик, делаю квест, похожий на Rusty Lake на движке Godot.
Имеется несколько вопросов по подходу к архитектуре игры.
Самый простой вариант, который получилось реализовать меня не устраивает, поэтому придумал другой, но пока нет понимания как его реализовать и какие могут быть подводные камни.

Исходный вариант:
Есть переменная currentLoc - ID локации.
Каждая локация (один экран), которая состоит из слоя с background и слоя с интерактивными объектами - строится заранее как отдельная сцена. На ней размещаются все объекты, висит отдельный скрипт в котором указана логика взаимодействия с объектами, включая двери для перехода в другую локацию, которая меняет значение currentLoc, удаляет текущую сцену и загружает другую, через case.
Мне не нравится то, что в итоге будет около 20 отдельных сцен локаций, это не считая сцен с планируемыми встроенными головоломками.

Хочется сделать более гибкий вариант, его логика следующая.
Весь геймплейный контент можно разбить не несколько типов, который описать группами:
1. Интерактивный предмет (Несколько видов, потом разобью)
2. Дверь для перехода в другую локацию
3. Локация (background, фоновая музыка)
*Головоломки отдельными сценами по-прежнему остаются.
Когда currentLoc меняет значение, мы запускаем вызов трёх функций (к примеру). Каждая из них запускает наследуемый скрипт, где в виде массива хранится вся информация о каждом объекте конкретной группы. Например у каждого предмета будет по У: [currentLocID(В какой локации находится), ID, адрес спрайта, координаты спрайта, размер спрайта].
И каждый новый такой предмет добавляет новый столбик в массив.
Соответственно при изменении currentLoc происходит проверка по первой строке, где номер соответствует локации - затем берутся все данные из этого столбика и попадают в качестве данных для функции добавления на сцену. Затем поиск по первой строке продолжается до следующего совпадения.
Также происходит с фоном локации, дверьми, головоломками (вместо спрайта просто координаты спавна сцены).

Теперь собственно вопрос. Имеет ли такой подход вообще смысл при указанном количестве локаций? Если да, есть у кого-нибудь пример алгоритма поиска по массиву (по строке) и добавления в функцию информации со всего столбца?

#1
1:29, 22 янв 2023

PerFerro
> Мне не нравится то, что в итоге будет около 20 отдельных сцен локаций
Почему именно это тебе не нравится? У тебя ведь клик-квест? По моему самое идеальное.

> и загружает другую, через case.
А это зачем? Я бы в самой двери информацию хранил, куда она ведет.

Ты по моему сильно переусложняешь. Это бы имело частичный смысл, если контент динамически генерился.
А у тебя ведь всё руками расставлено? Какой-то "God Object" менеджер городишь необоснованно.

#2
7:15, 22 янв 2023

Спасибо за хороший комментарий, я тут с этой мыслью переспал и понял что и правда бестолковый вариант. Много сложностей, профит нулевой.

Если что, про "case и дверь" имел в виду что из массива загружается помимо спрайта и его расположения информация о номере локации куда она ведёт.

#3
15:42, 22 янв 2023

PerFerro
> Если что, про "case и дверь" имел в виду что из массива загружается помимо
> спрайта и его расположения информация о номере локации куда она ведёт.

Я понял. Но в моём понимании на задник просто бросаешь Sprite или TextureButton, делаешь скрипт door.gd типа

extends TextureButton
export var door_destination : String # заполняешь типа  "res://locations/location1.tscn" или "location1"
func _pressed() -> void:
  load_new_location(door_destination)

При этом load_new_location() - может быть методом менеджера, или даже сигналом.
Использовать Sprite или Control - тоже есть ньюансы типа масштабирования, но в любом случае, двигать мышкой картинку по картинке
удобнее чем прописывать всё в каких-то массивах.

#4
15:43, 22 янв 2023

Der FlugSimulator
В общем понял что именно не так. При переходе между сценами и использованием предметов - если возвращаешься в сцену снова - все данные исчезают. Предметы возвращаются в первоначальное состояние. Почитал что можно это решить синглтоном.

#5
15:49, 22 янв 2023

Получается для сохранения информации о состоянии предметов перед загрузкой сцены будет вызываться ссылка на root сцену, которая будет предоставлять данные по имеющимся в сцене объектам. При покидании сцены туда же будет идти запись.

#6
18:39, 22 янв 2023

Думаю вопрос можно считать закрытым, спасибо за помощь)

ПрограммированиеФорумИгровая логика и ИИ

Тема в архиве.

Тема закрыта.