如何让JavaScript游戏循环的延迟时间随每次迭代缩短?
问题分析与修复方案
你这段代码的问题在于同步的while循环会一次性创建所有定时器,这些定时器的延迟都是从start函数执行的那一刻开始算的,而不是等前一个定时器跑完再启动下一个。
举个例子:当i=1000时,你设了个5000ms后触发的定时器;紧接着i=900,又设了个4500ms后触发的——后者反而比前者早500ms执行。到最后,所有定时器的触发时间是0.5s、1s、1.5s…5s,间隔全是500ms,自然10次5秒就跑完了,完全不是你想要的“间隔逐渐缩短”的效果。
修复后的代码
用递归调用就能实现真正的“上一次触发完成后,再设下一个更短的间隔”:
const begin = document.getElementById("startbtn"); begin.onclick = start; function start() { console.log("test"); let interval = 1000; // 初始间隔(毫秒) const step = 100; // 每次缩短的幅度 function loop() { console.log("adsafsd"); interval -= step; // 间隔还大于0就继续 if (interval > 0) { setTimeout(loop, interval); } } // 启动第一次循环 setTimeout(loop, interval); }
额外说明
- 如果要保留你原代码里“延迟乘以5”的逻辑,把
setTimeout(loop, interval)改成setTimeout(loop, interval * 5)就行 - 这种递归方式是游戏循环里常用的“帧调度”思路,确保每次循环都在前一次完成后启动,间隔控制更准确
内容的提问来源于stack exchange,提问作者ThisNameTagPasses
相关产品推荐
相关产品推荐

