Этот вопрос может быть слишком широким, но с учетом Phaser 3 он все еще зависит от того, для каких целей служит ваше меню.
Я думаю, что в большинстве игр есть главное меню, которое обычно вызывается при первом запуске игры, а затем не вызывается снова.
Если это игровое меню, в котором можно изменить настройки или сбросить / перезапустить часть игры, то может не иметь смысла перенаправлять на совершенно другую сцену.
С поддержкой нескольких сцен в Phaser 3 - Dev Log # 119 и Dev Log # 121 , вероятно, являются лучшими текущими источниками информации - другой вариант - начать новую сцена в текущей сцене, чтобы справиться с этим.
Однако, если это действительно просто пользовательский интерфейс, ничто не помешает вам создать оверлей, а не создавать целую сцену.
Если вы беспокоитесь о производительности, я могу подумать о том, нужно ли вызывать все меню или будет работать упрощенное меню. Кроме того, убедитесь, что вы предварительно загружаете ресурсы, прежде чем войти в меню и основную игру.
Я лично использую Boot> Preloader> Splash Screen> Main Menu> Основные игровые сцены, где Preloader загружает большую часть ресурсов, которые мне понадобятся. Это имеет обратную сторону более длинной начальной загрузки, но имеет положительную сторону минимальной загрузки после этой точки.
Переходы сцены
Как я справляюсь с ними в моих стартовых шаблонах , чтобы добавить сцены в Менеджер сцен при создании сцены. Затем я перехожу на start
к первой сцене.
this.scene.add(Boot.Name, Boot);
this.scene.add(Preloader.Name, Preloader);
this.scene.add(SplashScreen.Name, SplashScreen);
this.scene.add(MainMenu.Name, MainMenu);
this.scene.start(Boot.Name);
Тогда я просто продолжаю start
писать следующие сцены по мере необходимости.
this.scene.start(Preloader.Name);
Для другой игры, в которой используются несколько сцен, в итоге я создал следующую функцию (TypeScript), чтобы справиться с этим:
private sleepPreviousParallelScene(sceneToStart: string): Phaser.Scene {
if (this.uiSceneRunning !== sceneToStart) {
// Make sure that we properly handle the initial state, when no scene is set as running yet.
if (this.uiSceneRunning !== "") {
this.scene.get(this.uiSceneRunning).scene.sleep();
}
const newScene = this.scene.get(sceneToStart);
newScene.scene.start();
this.scene.bringToTop(sceneToStart);
this.uiSceneRunning = sceneToStart;
return newScene;
} else {
return this.scene.get(this.uiSceneRunning);
}
}
В игре, для которой я использовал это, я пытался воспроизвести стандартный интерфейс вкладок (например, то, что показано в журналах разработчиков выше, с интерфейсом, похожим на папку с файлами).