跨Phaser3类方法共享变量的最佳方法是什么?

时间:2018-04-16 13:04:41

标签: javascript phaser-framework

我试图找到一种干净,可读的方式来管理Phaser类中各个函数的变量,但由于各种原因,我对我找到的解决方案不满意。

我所知道的是:

全局变量

我不太喜欢这种实现,因为其他文件可以访问变量。

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();
            }
        });
    }
});

DataManager类(作为注册表实现)

我更喜欢这个,因为它更受控制,但对我来说,DataManager感觉就像它用于配置,而不是作为在类方法之间处理/共享数据的手段;访问和更新变量对于获取和设置其值的特定服务感觉非常苛刻。

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);
    }
});

使用&#39;

到目前为止,这对我来说是最干净的方式,因为它指的是类对象,它很容易更新和检索值,但在这种情况下,这个&#39;这个&#39;与我想要将变量分开的一些内部Phaser特定变量共享。除了命名空间,还有其他解决方案吗?

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();
            }
        });
    }
});

3 个答案:

答案 0 :(得分:1)

在我看来,最干净,最易读的方法是使用适当的类(而不是Phaser.Class的实例)。您始终可以扩展所需的Phaser类(例如此处使用Phaser.Scene)。

打字稿:

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(同样,除了类型声明和访问修饰符):

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' });
    }
}

如果您出于某种原因坚持ES5,那么您最后的建议可能是您最好的选择。

答案 1 :(得分:0)

刚刚意识到另一种方法是使用自我调用函数:

在这个示例中,英雄将作用于该函数,也不应该污染返回对象;

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();
            }
        });
    }
}}());

答案 2 :(得分:0)

试图在场景之间传递一些全局数据,并发现了以下内容。每个场景对全局注册表都有自己的引用。这是文档中的报价:

  

这是数据管理器在游戏范围内的实例,使您可以通过通用点和共享点在场景之间交换数据。
在默认设置中,您可以通过this.registry属性从场景中访问此设置。

https://photonstorm.github.io/phaser3-docs/Phaser.Data.DataManager.html 这是带有该类详细说明的文档。在最近的游戏中对此进行了尝试-使用非常方便。