如何在 Phaser 3 中使用不同 js 文件中的函数?

How do you use functions in a different js file in phaser 3?

我正在尝试创建一个具有与我的游戏相关的功能的 js 文件,但我收到一条错误消息

Uncaught TypeError: Cannot read properties of undefined (reading 'add')

当我尝试在主文件之外使用移相器函数时。

我有 2 个文件,一个叫 game.js,一个叫 test.js。我也在用物质物理引擎

game.js :

class bootScene extends Phaser.Scene {
    //Preloading assets for later use
    preload() {
        this.load.image('linus', 'assets/linus.png');
        this.load.script('t','test.js')
    }

    create() { }

    update() {
        //launch game scene
        this.scene.launch('game').stop();
    }
}

class playScene extends Phaser.Scene {

    constructor() {
        super('game');        
    }

    create() {
        test('test',1,1,'linus');
    }

    update() { }
}

// set the configuration of the game
let config = {
    type: Phaser.WEBGL, // Phaser will use WebGL if available, if not it will use Canvas
    width: 1280,
    height: 720,
    pixelArt: true,
    transparent: false,
    autoCenter: true,
    backgroundColor: '#000000',
    physics: {
        default: 'matter',
        matter: {
            restingThresh: 2,
            // debug: {
            //     renderFill: false
            // },
            gravity: {
                y: 0
            }
        }
    },
    scene: [bootScene, playScene]
};

// create a new game, pass the configuration
let game = new Phaser.Game(config);

test.js:

function test(msg,x,y,texture){
    console.log(msg)
    this.matter.add.image(x,y,texture)
}

我试过尝试将 t.test(etc.) 和加载脚本添加到预加载中。我尝试查找示例,但找不到任何示例。

抱歉,如果这是一个非常明显的修复或者我只是太糟糕了

您只需将当前 scene 作为参数传递给 test 函数,您就可以访问 matter 对象和其他属性/函数,从scene.

function test(scene, msg, x, y, texture) {
    console.log(msg);
    scene.matter.add.image(x, y, texture);
}

并且必须调用函数 test,在“当前场景”的情况下是 this:

 ...
 create() {
     ...
     test(this, 'test', 1, 1, 'linus');
     ...
 }

官方网站的这个例子:Example Script Loading,间接说明了这个事实。在那个例子中,scene 没有作为参数传递,但是 canvascontext 是。
所以按照这个例子,传递 scene 应该可以解决你的问题。

Side Note: In general, if there is no specific reason, to load scripts from inside of a phaser application (as shown above), I would load the scripts within the html-file or use a web-bundler like webpack or others. Not only for performance/minification reason.