Phaser 3场景切换报错:无法读取'start'属性,如何从函数启动场景?
解决Phaser 3中调用场景启动方法时
this.scene未定义的问题 没错,你猜的完全对——这个错误就是this的指向问题搞的鬼!咱们来一步步拆解问题,然后给你几个实用的解决办法:
问题根源
你写的check()是个全局函数,在浏览器环境里,全局函数里的this默认指向window对象,而不是Phaser的game场景实例。window上根本没有scene属性,所以自然会抛出Cannot read property 'start' of undefined的错误。
下面是几种靠谱的修复方案,你可以根据自己的代码结构选择:
方案1:把check封装成场景类的方法(最推荐)
Phaser的场景逻辑本来就应该尽量封装在对应的场景类内部,这样this的指向会自动绑定到场景实例上:
修改game.js:
class game extends Phaser.Scene { constructor() { super({ key: "game" }); // 可以在这里定义游戏状态变量,比如gameOver this.gameOver = false; } create() { // 调用类内部的check方法 this.check(); } // 把check定义为场景类的成员方法 check(){ // 注意变量名不能有空格,这里改成合法的gameOver if(this.gameOver){ this.scene.start("mainMenu"); } } }
这样check方法里的this就稳稳指向game场景实例,调用this.scene.start()完全没问题。
方案2:给全局check函数传递场景实例
如果一定要保留全局的check函数,那就手动把当前场景实例传进去:
先修改Load.js里的check函数:
// 接收scene参数,用这个参数来调用场景方法 function check(scene){ if(gameOver){ scene.scene.start("mainMenu"); } }
然后在game.js的create方法里调用时传入当前场景:
create() { // 把当前场景实例this传进去 check(this); }
方案3:用箭头函数绑定this
箭头函数会继承外层作用域的this,你也可以用这种方式来确保指向正确:
class game extends Phaser.Scene { constructor() { super({ key: "game" }); this.gameOver = false; // 用箭头函数定义check,自动绑定当前场景的this this.check = () => { if(this.gameOver){ this.scene.start("mainMenu"); } } } create() { this.check(); } }
最后提个小细节:你代码里的game over == true有语法错误,变量名不能包含空格,得改成gameOver == true(或者更简洁的if(gameOver))。
内容的提问来源于stack exchange,提问作者Lakshya dubey
相关产品推荐
相关产品推荐

