J'essaie de trouver un moyen propre et lisible de gérer les variables entre les fonctions d'une classe Phaser, mais pour diverses raisons, je ne suis pas satisfait des solutions que j'ai trouvées.

Ce que je sais est disponible:

Variables globales

Je n'aime pas beaucoup cette implémentation pour la possibilité que des variables soient accessibles par d'autres fichiers.

var heroes = [];

var play = new Phaser.Class({
    Extends: Phaser.Scene,

    initialize: function(){
        Phaser.Scene.call(this, {key: 'play'});
    },
    create: function () {
        for(var i = 0; i < 5; i++){
            heroes.add(new Hero())
        }
    },
    update: function(){
        if(!heroes.length){
            heroes.add(new Hero())
        }

        heroes.forEach(function(hero){
            if(hero.hp <= 0){
                hero.destroy();
            }
        });
    }
});

Classe DataManager (implémentée en tant que registre)

Je préfère cela car il est plus contrôlé, mais pour moi, DataManager semble être destiné aux configurations, pas comme un moyen de traiter / partager des données entre les méthodes de classe; l'accès et la mise à jour des variables sont également très lourds avec un service spécifique pour obtenir et définir ses valeurs.

var play = new Phaser.Class({
    Extends: Phaser.Scene,

    initialize: function(){
        this.registry.set('heroes', []);
        Phaser.Scene.call(this, {key: 'play'});
    },
    create: function () {
        var heroes = this.registry.get('heroes');

        for(var i = 0; i < 5; i++){
            heroes.add(new Hero())
        }

        this.registry.set('heroes', heroes);
    },
    update: function(){
        var heroes = this.registry.get('heroes');

        if(!heroes.length){
            heroes.add(new Hero())
        }

        heroes.forEach(function(hero){
            if(hero.hp <= 0){
                hero.destroy();
            }
        });

        this.registry.set('heroes', heroes);
    }
});

Utiliser "ceci"

Jusqu'à présent, cela me semble le plus propre car cela fait référence à l'objet de classe et il est assez facile de mettre à jour et de récupérer des valeurs MAIS dans ce contexte, `` ceci '' est partagé avec certaines variables internes spécifiques à Phaser dont je veux séparer mes variables. Outre l'espace de noms avec cela, existe-t-il des solutions alternatives?

enter image description here

var play = new Phaser.Class({
    Extends: Phaser.Scene,

    initialize: function(){
        this.heroes = [];
        Phaser.Scene.call(this, {key: 'play'});
    },
    create: function () {
        for(var i = 0; i < 5; i++){
            this.heroes.add(new Hero())
        }
    },
    update: function(){
        if(!heroes.length){
            this.heroes.add(new Hero())
        }

        this.heroes.forEach(function(hero){
            if(hero.hp <= 0){
                hero.destroy();
            }
        });
    }
});
2
camjocotem 16 avril 2018 à 16:04

3 réponses

Meilleure réponse

Je viens de réaliser une autre façon de le faire en utilisant une fonction auto-invoquante:

Dans cet exemple, les héros seront limités à la fonction et ne devraient pas non plus polluer l'objet de retour;

var play = new Phaser.Class(function(){
    var heroes = [];

    return {
    Extends: Phaser.Scene,

    initialize: function(){
        heroes = [];
        Phaser.Scene.call(this, {key: 'play'});
    },
    create: function () {
        for(var i = 0; i < 5; i++){
            heroes.add(new Hero())
        }
    },
    update: function(){
        if(!heroes.length){
            heroes.add(new Hero())
        }

        heroes.forEach(function(hero){
            if(hero.hp <= 0){
                hero.destroy();
            }
        });
    }
}}());
0
camjocotem 17 avril 2018 à 08:45

J'ai essayé de transmettre des données globales entre les scènes et j'ai trouvé ce qui suit. Chaque scène a sa propre référence au registre mondial. Voici la citation de la documentation:

Il s'agit d'une instance du gestionnaire de données à l'échelle du jeu, vous permettant d'échanger des données entre des scènes via un point universel et partagé.
Dans la configuration par défaut, vous pouvez y accéder depuis une scène via la propriété this.registry.

https://photonstorm.github.io/phaser3-docs/Phaser. Data.DataManager.html Voici le doc avec la description détaillée de la classe. J'ai essayé cela dans un jeu récent - c'est très pratique à utiliser.

1
Михаил Гордиенко 25 juil. 2019 à 00:05

La manière la plus claire et la plus lisible à mon avis serait d'utiliser des classes appropriées (et non des instances de Phaser.Class). Vous pouvez toujours étendre une classe Phaser dont vous avez besoin (comme ici avec Phaser.Scene).

Manuscrit:

class Play extends Phaser.Scene {
    private heroes: Hero[] = [];

    private create(): void {
        for (let i = 0; i < 5; i++) {
            this.heroes.push(new Hero());
        }
    }

    private update(): void {
        if (!this.heroes.length) {
            this.heroes.push(new Hero());
        }

        this.heroes.forEach((hero) => {
            if (hero.hp <= 0) {
                hero.destroy();
            }
        });
    }

    public initialize(): void {
        Phaser.Scene.call(this, { key: 'play' });
    }
}

ES6 (identique, sauf pour les déclarations de type et les modificateurs d'accès):

class Play extends Phaser.Scene {
    heroes = [];

    create() {
        for (let i = 0; i < 5; i++) {
            this.heroes.push(new Hero());
        }
    }

    update() {
        if (!this.heroes.length) {
            this.heroes.push(new Hero());
        }

        this.heroes.forEach((hero) => {
            if (hero.hp <= 0) {
                hero.destroy();
            }
        });
    }

    initialize() {
        Phaser.Scene.call(this, { key: 'play' });
    }
}

Si, pour une raison quelconque, vous êtes bloqué sur ES5, votre dernière suggestion pourrait être votre meilleur pari.

1
Kamen Minkov 17 avril 2018 à 08:02