我正在制作一个浏览器游戏,需要能够重新启动而无需重新加载页面,但我不想使用Location.reload(),因为某些事情需要不同(我不想返回游戏的状态与页面首次加载时的状态完全一致)。所以,我想在游戏结束时再次使用setInterval(如果某些条件像按键一样真实),以启动另一个游戏循环。
假设我的模块返回了一些名为main或init的函数。假设main是此模块返回的唯一内容。
const main = () => {
func1();
func2();
func3();
loop = setInterval(repeatingFunc, 100);
}
repeatingFunc
中的某个地方
loop = clearInterval(loop);
这实际上是游戏。同样在repeatingFunc
中,有一个条件,如果为真,将执行行
loop = setInterval(repeatingFunc, 100);
第二个setInterval的目的是再次启动。我的方式是不是很糟糕?我真的不喜欢它重复游戏而不是主游戏重启游戏。有没有办法让主要做这项工作?我不是很熟悉浏览器以及如何正确使用多个setIntervals。
答案 0 :(得分:1)
您可以使用自动重启功能,例如:
var run = false;
function loop(){
//whatever
if(run) setTimeout(loop, 100);
}
function start(){
if( run ) return;
run = true;
loop();
}
function stop(){
run = false;
}
答案 1 :(得分:0)
如果您使用requestAnimationFrame
,则可以伪造浏览器进行绘制。但是如果您使用// Get all requestAnimation from moost browsers
var requestAnimation = window.requestAnimationFrame ||
window.mozRequestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.msRequestAnimationFrame;
window.requestAnimationFrame = requestAnimationFrame;
// Get all cancelAnimationFrame from moost browsers
var cancelAnimation = window.cancelAnimationFrame ||
window.mozCancelAnimationFrame ||
window.webkitCancelAnimationFrame ||
window.msCancelAnimationFrame;
window.cancelAnimationFrame = cancelAnimation;
let run = false;
function Update(time) {
console.log("run time: "+ time);
// If you do not use the boolean the requestAnimationFrame will be reactevate the animation frame.
if (run)
requestAnimationFrame(Update);
}
// Stops the requestAnimationFrame
function Stop() {
cancelAnimationFrame(Update);
run = false;
}
// Starts the requestAnimationFrame
function Start() {
run = true;
Update(0);
}
,浏览器会在完成之前的抽奖时调用。
<button type="button" onclick="Start();">Start!</button>
<button type="button" onclick="Stop();">Stop!</button>
&#13;
integral
&#13;