You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Phaser框架中如何捕获game.scale.refresh方法的结束事件

解决Phaser中捕获scale.refresh()完成事件的问题

首先得说清楚:你尝试的写法无效,是因为game.scale.refresh()是一个同步执行的方法,它并不会返回一个带有onComplete信号/事件的对象,所以链式调用scaleRefresh.onComplete.add(...)自然不会生效。

下面分两种场景给你解决方案:

场景1:refresh()同步完成(大多数基础适配场景)

如果你的resize逻辑里没有涉及异步操作(比如等待DOM重绘、异步尺寸计算),其实refresh()执行完成后会立即同步返回,你直接把后续代码放在它后面就行:

game.scale.refresh();
// 这里直接写你要在完成后执行的逻辑
function doStuff() {
    // 比如更新UI位置、重新计算碰撞体尺寸等
    console.log("Refresh完成,执行后续操作");
}
doStuff();

场景2:需要监听实际的resize完成事件(适配复杂场景)

如果你的游戏适配涉及到DOM层面的尺寸变化(比如浏览器窗口resize联动、动态调整画布尺寸),Phaser的ScaleManager本身提供了对应的事件可以监听,不需要手动捕获refresh()的完成:

Phaser 2 写法

在游戏初始化阶段先注册onResize信号监听器,之后每次调用refresh()或者触发resize时,都会执行你的回调:

// 在create()或者初始化代码里注册监听
game.scale.onResize.add(function() {
    // 这里写refresh完成后要执行的逻辑
    console.log("Resize/Refresh完成,执行后续操作");
}, this);

// 之后调用refresh时,监听器会自动触发
game.scale.refresh();

Phaser 3 写法

Phaser 3改用事件系统,通过scale.on('resize', ...)来监听:

// 在create()里注册事件
this.scale.on('resize', () => {
    // 处理resize完成后的逻辑
    console.log("Resize/Refresh完成,执行后续操作");
});

// 调用refresh触发事件
this.scale.refresh();

额外提醒:如果是自己手动调用refresh(),Phaser 2的onResize信号会在refresh()执行结束后立即触发;Phaser 3的resize事件同理,所以这个监听完全可以覆盖你需要捕获refresh()完成的需求。

内容的提问来源于stack exchange,提问作者Kvasir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:14:52