使用JavaScript开发游戏遇TypeError:无法读取undefined的'physics'属性求助
解决Phaser中Enemy类的"Cannot read property 'physics' of undefined"错误
嘿,我来帮你搞定这个困扰你的Phaser游戏开发问题!先看看错误的核心:
Enemy can be created ‣ TypeError: Cannot read property 'physics' of undefined at new Enemy (src/prefabs/Enemy.js:7:14)
这个错误说明在你的Enemy构造函数第7行,你试图访问某个对象的physics属性,但那个对象压根是undefined。结合你给的代码片段,我帮你梳理下最可能的原因和解决办法:
最常见的问题根源
Phaser 2里的Sprite实例本身没有自带physics属性,物理系统是挂在game实例上的。大概率你是在构造函数里写了this.physics,而不是正确的game.physics。
修正后的敌人类代码示例
假设你原本是想给敌人启用物理系统,正确的写法应该是这样:
export default class Enemy extends Phaser.Sprite { constructor(game, x, y, bulletLayer, frame) { // 先调用父类构造函数,确保this被正确初始化 super(game, x, y, 'enemy', frame); // 正确通过game实例访问物理系统,给当前敌人启用物理(这里以ARCADE物理为例) game.physics.enable(this, Phaser.Physics.ARCADE); // 接下来就可以正常设置敌人物理属性了 this.body.velocity.x = -100; // 设置水平移动速度 this.body.collideWorldBounds = true; // 让敌人碰到边界反弹 // ...其他你的敌人逻辑代码 } }
还要检查测试代码的问题
另外,你测试文件(test/test_Enemy.js)里创建Enemy实例时,一定要确保传入的第一个参数是有效的Phaser.Game实例,要是传了undefined进去,那访问game.physics肯定会报错。比如测试代码应该是这样的:
// 先初始化Phaser游戏实例 const game = new Phaser.Game(800, 600, Phaser.AUTO); // 再创建Enemy,确保game参数正确传入 const enemy = new Enemy(game, 400, 300, yourBulletLayerInstance);
快速排查步骤
- 打开
src/prefabs/Enemy.js看第7行,确认你访问physics的对象是不是game,如果是this就改成game - 检查测试代码里创建Enemy时的参数,确保
game实例已经正确初始化并传入 - 如果你用的是Phaser 3,注意继承的是
Phaser.GameObjects.Sprite,物理启用方式是this.scene.physics.add.existing(this),但错误根源还是一样的——访问了未定义对象的physics属性
内容的提问来源于stack exchange,提问作者MMM
相关产品推荐
相关产品推荐

