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
相关产品推荐
相关产品推荐

