Phaser3 Сцены переходов - PullRequest
       12

Phaser3 Сцены переходов

0 голосов
/ 10 ноября 2018

Я новичок в phaser3 и, прежде чем начинать сумасшедший проект, я хочу знать, как мне начать, переключаться между сценами. Я видел, что есть несколько функций: запуск, запуск, переключение, запуск, возобновление, пауза и т. Д. *

Пример, скажем, я хочу иметь 2 сцены, меню и игру. Я загружаюсь в Меню и хочу перейти на сцену Игры, и если я нажимаю на кнопку, то возвращаюсь на сцену Меню. Я связал это с вызовом функции start, но заметил, что функции all, init, preload и create вызываются каждый раз, и поэтому я загружаю все изображения, настраивая всех слушателей снова и снова.

Это кажется неправильным, должен ли я использовать функции запуска или переключения и приостанавливать и возобновлять? Но как мне скрыть предыдущую сцену?

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 05 июня 2019

Хорошо, вот сделка. В Phaser 3 функция запуска фактически ЗАКРЫВАЕТ предыдущую сцену, когда она начинает новую. Вот почему вы видите init, preload ext каждый раз. Однако если вы вместо этого «запускаете» свои сцены, то они не пройдут через весь процесс выключения, перезапустите. Вы можете переместить их в верхнюю или нижнюю часть, настроить получение входных данных или нет и т. Д. ОДНАКО, ОСТОРОЖНО! Начиная с phaser 3.16, сон или пауза сцены НЕ закрывают обновление. В результате, если вы запускаете сцену, а затем спите, она в основном ничего не делает, кроме как может установить флаг, говоря, что он спит, хотя на самом деле это не так. Таким образом, любая обработка обновления будет продолжаться в любой запущенной сцене. Вы можете закорочить обновление с каким-то флагом в начале (вот к чему я прибегал), но другая проблема - размер камеры. Поэтому все сцены должны иметь одинаковый размер камеры, иначе они будут отображаться (даже если они «спят») и портят ваш дисплей. Итак, суть в том, что будет грязно, пока сон и пауза не сработают.

0 голосов
/ 10 ноября 2018

Этот вопрос может быть слишком широким, но с учетом 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);
    }
}

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

...