在 Phaser3 类方法之间共享变量的最佳方式是什么?

cam*_*tem 6 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();
            }
        });
    }
});
Run Code Online (Sandbox Code Playgroud)

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);
    }
});
Run Code Online (Sandbox Code Playgroud)

使用“这个”

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

在此输入图像描述

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();
            }
        });
    }
});
Run Code Online (Sandbox Code Playgroud)

cam*_*tem 1

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

在这个例子中,英雄的作用域将是函数,并且也不应该污染返回对象;

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();
            }
        });
    }
}}());
Run Code Online (Sandbox Code Playgroud)