Phaser 3如何解决场景指定次数循环跳转失效问题
问题
在Phaser场景开发中编写如下逻辑,预期实现按指定次数间隔跳转回scene1的效果,但实际for循环未按预期运行,场景出现无限循环跳转:
for (var i = 0; i < 5; i++) { this.time.addEvent({ delay: 300, loop: false, callback: () => { this.scene.start("scene1"); } }) }
问题根源
代码存在两个核心问题:
- for循环是同步执行逻辑,会一次性向Phaser时间系统注册5个延迟300ms触发的事件,这5个事件会在300ms后几乎同时执行,完全不符合“间隔300ms跳转一次、总共跳转5次”的预期。
- 每次执行
this.scene.start("scene1")切换场景时,如果后续流程会再次回到承载这段代码的场景,这段注册事件的逻辑会被重新执行,不断新增定时跳转任务,最终形成无限循环。
修正方案
不需要手写for循环批量注册事件,直接使用Phaser Time模块原生的重复触发参数控制执行次数,同时增加防重复注册标记即可:
// 防重复注册标记,避免场景重启后反复新增跳转事件 if (!this.hasBindJumpEvent) { this.hasBindJumpEvent = true; this.time.addEvent({ delay: 300, // 第一次触发的延迟时长 repeat: 4, // 重复触发次数,总触发次数 = repeat + 1,设置为4即总共触发5次 repeatDelay: 300, // 每次重复触发的间隔时长 callback: () => { this.scene.start("scene1"); } }) }
额外注意事项
- 开发Phaser项目时尽量使用
let/const声明变量,不要用var,避免变量提升带来的作用域异常。 - 如果跳转逻辑仅在特定流程下生效,可以监听场景的
shutdown事件,在场景销毁时主动移除相关定时事件,避免残留定时器触发异常跳转。
内容的提问来源于stack exchange,提问作者Ng Jia Yong
相关产品推荐
相关产品推荐

