Войти
GodotФорумВопросы

Как сделать переход в отдельную сцену для данжей и обратно без разрыва соединения с сервером?

#0
12:18, 17 сен 2022

Вопрос к знатокам Godot Engine? Как?
У меня есть основная сцена  Game.tscn и на неё сцены-игроки.
Когда новый игрок подключается к серверу,  то у всех ранее подключенных игроков к сцене  Game добавляется сцена-персонаж этого игрока.
Теперь , когда я перехожу на новую сцену  данжа c помощью  scenes-change, то при этом предыдущая сцена Game со сценой  персонажа перестаёт быть активной и соединение с сервером прерывается.
Получается , что в данже сингл-игра.
После возврата из данжа на общую сцену , снова происходит соединение с сервером и можно играть с другими игроками.И ещё хочется добавить совместное прохождение данжа с группой игроков.
Как это реализовать, что-то пока мне не понятно. На офсайте godot есть примеры, там собирается лобби  с игроками и потом они переходят на сцену игры. Но мне этот вариант не подходит, мне нужно, чтобы параллельно несколько сцен обрабатывалось.

#1
14:20, 17 сен 2022

Плохо понятно. Предлагаю точнее описать ситуацию.

#2
15:04, 17 сен 2022

Точнее могу так:
Нужно одновременно на сервере загружать несколько сцен - общую карту мира и сцены данжей,если туда зашли игроки.
На сервере и на клиенте в память загружена общая карта мира - это сцена  Game. К ней прикреплены дочерние сцены по одной на каждого игрока, к которым прикреплен скрипт player.gd - он обрабатывает действия персонажа игрока и эти скрипты через сеть обмениваются состояниями через сервер с помощью встроенной в godot системы сетевого взаимодействия.
Мне нужно добавить много данжей в виде отдельных сцен, чтобы они не занимали память всё время, а загружались и начинали выполняться их скрипты(этих сцен) по одной сцене, когда игрок(и) входят в этот данж.
Когда я так делаю только на клиенте, т.е. меняю главную сцену Game на сцену  данжа, то прекращается выполнение скриптов  Game и player и сервер определяет, что клиент отключился.
Поменять сцену на сервере нельзя, так как остальные подключенные игроки перестанут обрабатываться, к ним приходит сигнал disconnect.
В  godot есть возможность загрузить скрипты, независимые от сцены, с помощью указания их в автозагрузке.
Но мне непонятно, как их приспособить для этого. Они загружаются только при запуске игры. А мне нужно, чтобы при каждом подключении нового игрока запускались скрипты сцены персонажа игрока и продолжали работать при изменении сцены.
Возможно надо как-то сделать  более глобавльную сцену и к ней присоединять сцны игроков, а сцены  Game сделать вложенной и изменять её на сцену данжа и обратно. Возможно так получиться, надо пробовать(

#3
15:16, 17 сен 2022

Если сцену  Game  сделать в виде дочернего узла глобальной сцены , тогда получается, что  при входе в данж надо сохранять состояние и удалять узел Game, и создавать узел со сценой данжа, а потом наоборот. И ещё надо отслеживать, когда игроки строят и призывают героев и когда рождаются новые юниты и  и не передавать эти изменения в Game тем игрокам, которые сейчас в данже. Как в  godot делают?

#4
15:40, 17 сен 2022

Под словом "точнее" я подразумевал не "больше текста накидать" - а скорее наоборот - меньшим числом букв обозначить конкретную проблему.
У меня возникли десятки уточняющих вопросов, но я не готов их здесь задавать.

Могу заметить: раз ты переходишь (в рамках какого-то туториала видимо) из лобби в гейм-уровни без рассоединения, то переход между
уровнями можно сделать аналогично. И я бы рекомендовал разобраться с архитектурой.

#5
18:32, 17 сен 2022

Лобби у меня нет, это  в туториале:
https://docs.godotengine.org/ru/stable/tutorials/networking/high_… g-the-network
У меня в игре сразу из меню подключается к серверу и в основную сцену переход идёт и всё ОК, соединение сохраняется. А потом уже, если во время игры снова менять сцену, тогда соединение прерывается.
Вот тут игра с исходниками в папке 0.056, если интересно.
https://disk.yandex.com/d/7cinmU34cgXRQA
тут про игру:
https://gamedev.ru/gamedesign/forum/?id=270060&page=3&m=5613937#m33

Благодарю за ответы, буду разбираться

#6
(Правка: 0:33) 0:32, 18 сен 2022

вот вроде годные туториалы по переключению сцен
https://www.youtube.com/watch?v=XHbrKdsZrxY
https://www.youtube.com/watch?v=VcI22IKoT_E
https://www.youtube.com/watch?v=N4iV1L6xb04

правда не смотрел что там с сетью, с первых строк углядел некий connect

func _ready() -> void:
  current_level.connect("level_changed", self, "handle_level_changed")

может это signal->slot?

#7
(Правка: 0:54) 0:53, 18 сен 2022

#!
> с первых строк углядел некий connect

Некий "connect" - это не про сеть. Это подписка колбэка на получение сообщения. А signal и есть сообщение.


Так проблема не в переключении, а в том, что автор (как я понял) пытается воплотить мультисессионный сервер
по простым туториалам сингл-сессий. Впрочем толком я не понял, а писать за него игру я не смогу.

#8
11:32, 20 сен 2022

Вот этот способ работает:
"Если сцену  Game  сделать в виде дочернего узла глобальной сцены , тогда получается, что  при входе в данж надо  удалять узел Game, и создавать узел со сценой данжа, а потом наоборот."
Только по прежнему видны персонажи других игроков) на тех же местах , где огни были перед входом в данж.
Надо их тоже удалять, а потом восстанавливать, при выходе из данжа

#9
11:34, 20 сен 2022

Сцены персонажей других игроков удалять, если они остались в предыдущей локации или на глобальной карте.

GodotФорумВопросы