Phaser 3 обменивается данными пользовательских объектов между сценами? - PullRequest
0 голосов
/ 02 августа 2020

У меня есть пользовательский объект класса в моей GameScene.

this.player = new Player(
      this,
      this.game.config.width * 0.5,
      this.game.config.height * 0.5,
      "playerShip"
    );

У этого объекта есть жизни и очки. Как лучше всего передать все данные игрока в другую сцену? Я пытался сохранить его в localstorage и получить данные в разных сценах, но он теряет все свойства класса. Я не могу передать данные в качестве параметра, потому что после каждой сцены идут 2 сцены диалога, а затем новая сцена воспроизведения

Ответы [ 3 ]

0 голосов
/ 03 августа 2020

Один из методов, который мне нравится использовать, - это Phaser.Plugins.BasePlugin.

class Player extends Phaser.Plugins.BasePlugin {
    constructor(pluginManager) {
        super(pluginManager); 
        //initialize player state
    }
    //Additional methods for getting managing player data
   isAlive() { return true; }
}

//in your JS entry file
let config = {
    type: Phaser.AUTO,
    parent: 'game'
},
    plugins: {
        global: [ //make the Player global to all scenes (and other plugins)
            // key is plugin key, plugin is class, start true/false if there
            // is a start method to run, mapping is the name tagged of this 
            // to access the plugin class
            { key: 'Player', plugin: Player, start: false, mapping: 'player'}
         ]
     }
 };

//In the scene 
class MyScene extends Phaser.Scene {
    
    update(){
         if(this.player.isAlive()) {
              //do some stuff
        }
    }
}

Я также включил сохранение состояния в локальное хранилище для своих плагинов. Это может быть полезно для плагинов, связанных с состоянием квестов прогресса инвентаря игрока между игровыми сессиями.

0 голосов
/ 19 августа 2020

DataManager class может использоваться для обмена данными между сценами.

Посмотрите на этот пример .

0 голосов
/ 02 августа 2020

Локальное хранилище и любое внутриигровое хранилище, такое как реестр игры или кеш игры, сериализуют данные. Вы теряете эти свойства класса при сериализации для этих механизмов хранения. какой-то механизм хранения.

Чтобы сохранить объектные ссылки на эти классы между сериализациями или в качестве альтернативы гидратации из состояния, вам необходимо сохранить ссылку где-то глобально.

Вы можете расширить класс Phaser.Game, чтобы сделать вещи более типобезопасными, но похоже, что экземпляр игры phaser допускает расширение для более быстрого решения. Просто добавьте ссылку на свой экземпляр класса, и вы сможете получить к нему доступ в любой сцене. Пример Stackblitz

...