Phaser框架中为何将精灵创建代码移至其他函数后无法加载?
问题解决:Phaser中独立函数创建精灵报错
Cannot read properties of undefined (reading 'add') 核心问题是函数内部的this指向错误:当你把精灵创建代码放到独立函数player1Create里直接调用时,函数内的this不再指向Phaser的Scene实例,而是全局对象(浏览器环境下为window),导致this.physics为undefined,触发报错。
给你三种可行的解决方法:
方法1:调用时绑定Scene的this
在create函数里调用player1Create时,用call或bind把Scene的this传递进去:
// 在create函数内调用 this.player1Create.call(this); // 或者 this.player1Create.bind(this)();
方法2:将函数定义为Scene类的方法
如果你的Scene是用ES6类编写的,直接把player1Create定义为类的方法,调用时this会自动指向Scene实例:
class YourGameScene extends Phaser.Scene { create() { this.player1Create(); } player1Create() { this.player1 = this.physics.add.sprite(100, 450, 'Billy'); this.player1.setBounce(0.2); this.player1.setCollideWorldBounds(true); } }
方法3:用箭头函数定义player1Create
箭头函数会继承外部作用域的this,在Scene的上下文里用箭头函数定义player1Create,this会自动指向Scene实例:
// 在create函数内定义 const player1Create = () => { this.player1 = this.physics.add.sprite(100, 450, 'Billy'); this.player1.setBounce(0.2); this.player1.setCollideWorldBounds(true); }; // 直接调用即可 player1Create();
额外建议:尽量避免使用全局变量player1,改为Scene实例的属性(比如this.player1),既符合Phaser开发规范,也能避免全局变量污染。
内容的提问来源于stack exchange,提问作者Junk Mail
相关产品推荐
相关产品推荐

