如何在 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
没有作为参数传递,但是 canvas
和 context
是。
所以按照这个例子,传递 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.
我正在尝试创建一个具有与我的游戏相关的功能的 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
没有作为参数传递,但是 canvas
和 context
是。
所以按照这个例子,传递 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.