Phaser Time Event无法循环求助:游戏计时器仅执行一次
问题解决:计时器仅执行一次的原因及修复
核心问题
你在创建时间事件时犯了一个关键错误:callback: self.updateTimer() 这行代码里,updateTimer() 是直接调用函数,而不是传递函数引用。这会导致场景启动时立刻执行一次updateTimer,之后因为callback的值是undefined(函数无返回值),循环事件不会再触发。
修复代码
把callback的赋值改成传递函数本身(去掉括号):
create: function(){ const self = this self.startTime = new Date(); self.totalTime = 120; self.timeElapsed = 0; self.createTimer(); // 修复:去掉updateTimer后面的括号,传递函数引用 self.gameTimer = this.time.addEvent({ delay: 100, callback: self.updateTimer, callbackScope: self, loop: true }); }
额外优化建议
- 倒计时逻辑修正:当前代码计算的是已流逝时间,如果需要从120秒倒计时,应该用
剩余时间 = 总时间 - 已流逝时间,修改updateTimer里的显示逻辑:
updateTimer: function(){ var me = this; var currentTime = new Date(); var timeDifference = currentTime.getTime() - me.startTime.getTime(); me.timeElapsed = Math.floor(timeDifference / 1000); // 计算剩余时间,避免出现负数 var timeLeft = Math.max(me.totalTime - me.timeElapsed, 0); var minutes = Math.floor(timeLeft / 60); var seconds = timeLeft - (60 * minutes); var result = (minutes < 10) ? "0" + minutes : minutes; result += (seconds < 10) ? ":0" + seconds : ":" + seconds; me.timeLabel.text = result; // 时间耗尽后停止计时器 if(timeLeft === 0){ me.gameTimer.remove(); } }
- 控制启动时机:如果需要在游玩阶段开始才启动计时器,不要在
create里直接创建事件,而是写一个启动方法:
create: function(){ const self = this self.totalTime = 120; self.timeElapsed = 0; self.createTimer(); // 先不启动计时器 }, // 游玩阶段开始时调用此方法 startTimer: function(){ const self = this; self.startTime = new Date(); self.gameTimer = this.time.addEvent({ delay: 100, callback: self.updateTimer, callbackScope: self, loop: true }); }
比如在玩家点击开始按钮、开场动画结束等触发游玩开始的时机,调用this.startTimer()即可。
内容的提问来源于stack exchange,提问作者Aciddragon
相关产品推荐
相关产品推荐

