Phaser 3自定义精灵类update()方法未触发问题求助
解决Phaser自定义类update()方法不执行的问题
Phaser引擎只会自动调用**场景(Scene)和Phaser内置游戏对象(如Sprite、GameObject)**的update()方法。你自己写的自定义类如果没有继承Phaser的GameObject体系,也没有手动关联到场景的更新循环,引擎根本不知道要去执行它的update方法。
方式一:让自定义类继承Phaser内置游戏对象
如果你的类是用来表示游戏中的可见实体(比如玩家、敌人),推荐直接继承Phaser.GameObjects.Sprite(或其他子类,比如Image、Container)。这样只要把实例添加到场景,引擎就会自动把它纳入更新循环,调用其update方法。
自定义类示例(createGooBoi.js)
class GooBoi extends Phaser.GameObjects.Sprite { constructor(scene, x, y) { // 调用父类Sprite的构造函数,传入场景、坐标、纹理名 super(scene, x, y, 'gooboi-texture'); // 将实例添加到场景,这是关键步骤 scene.add.existing(this); // 如果需要物理系统,添加物理体 scene.physics.add.existing(this); // 初始化自定义属性 this.moveSpeed = 250; } // 重写update方法,引擎会自动调用 update(time, delta) { // 这里写你的更新逻辑,比如移动 this.x += this.moveSpeed * (delta / 1000); // 超出屏幕重置位置 if (this.x > this.scene.game.config.width) { this.x = -this.width; } } }
场景中实例化示例(Level_1.js)
class Level_1 extends Phaser.Scene { constructor() { super('Level_1'); } preload() { // 先加载纹理 this.load.spritesheet('gooboi-texture', 'assets/gooboi.png', { frameWidth: 32, frameHeight: 32 }); } create() { // 直接实例化,自动加入更新循环 this.player = new GooBoi(this, 100, 200); } // 场景的update可以保留,不影响自定义类的update执行 update(time, delta) { // 其他场景级逻辑 } }
方式二:手动在场景update中调用自定义类的update
如果你的类不需要继承Phaser内置对象(比如纯逻辑类),可以手动在场景的update方法里调用自定义类的update。注意必须保存自定义类的实例引用到场景属性中,否则会出现调用失败的情况。
自定义类示例(createGooBoi.js)
class GooBoi { constructor(scene, x, y) { this.scene = scene; this.x = x; this.y = y; this.moveSpeed = 250; // 手动创建精灵并添加到场景 this.sprite = scene.add.sprite(x, y, 'gooboi-texture'); } update(time, delta) { // 更新精灵位置 this.sprite.x += this.moveSpeed * (delta / 1000); if (this.sprite.x > this.scene.game.config.width) { this.sprite.x = -this.sprite.width; } } }
场景中调用示例(Level_1.js)
class Level_1 extends Phaser.Scene { constructor() { super('Level_1'); } preload() { this.load.spritesheet('gooboi-texture', 'assets/gooboi.png', { frameWidth: 32, frameHeight: 32 }); } create() { // 将实例保存为场景的属性,关键! this.myGooBoi = new GooBoi(this, 100, 200); } update(time, delta) { // 手动调用自定义类的update,传入time和delta(可选,但推荐) this.myGooBoi.update(time, delta); } }
你之前手动调用失败的可能原因
- 自定义类实例是局部变量(比如在create里只写
new GooBoi(...)没赋值给this.xxx),导致场景update里找不到实例; - 自定义类的
update方法拼写错误(比如写成Update大写开头); - 调用时没传必要的参数,导致逻辑执行异常。
内容的提问来源于stack exchange,提问作者Khendry
相关产品推荐
相关产品推荐

