Я делаю небольшую игру на холсте, но я не могу получить setInterval
, чтобы хорошо работать внутри игрового ядра.setInterval внутри gameloop, не работает по назначению
С помощью этого кода интервал запускается один раз, а затем gameloop, похоже, захватывает и работает все время.
<html>
<head>
<script type="text/javascript">
//Gameloop
function gameLoop(){
update();
draw();
requestAnimationFrame(gameLoop);
}
var x=50;
var y=50;
// update values
function update(){
x++;
//timer to increase speed once every 2 seconds
function timer(){
x = x +5;
}
var interval = setInterval(timer, 2000);
}
//Draw onto canvas
function draw(){
var canvas = document.getElementById('canvas');
if (canvas.getContext) {
var ctx = canvas.getContext('2d');
}
ctx.clearRect(0,0,800,800);
ctx.beginPath();
ctx.rect(x,y,25,25);
ctx.fill();
}
</script>
</head>
<body onload=gameLoop()>
<canvas id="canvas" width="800" height="800"></canvas>
</body>
</html>
вэй .. вам нужно сделать 'clearInterval (intervalid)', чтобы очистить интервал. поэтому вам нужно где-то сохранить ссылку и решить, когда вы хотите их очистить. – Tschallacka
Вы начинаете интервал для каждой итерации в игровом цикле, поэтому к тому моменту, когда первый интервал перемещается в поле, выполняется еще около 30 интервалов, которые начнут перемещать поле сразу после, и появятся новые интервалы, начиная все время. Запустите функцию «update» один раз, а не в игровом цикле. – Guffa
Спасибо за азерсеров, тоже подумал об этом, жесткая, это не настоящая игра, просто тестовая проблема для решения моей проблемы, поэтому функция обновления передает ALOT информации в реальной игре, поэтому она необходима. И если я очищаю интервал после каждой итерации gameloop, тогда он не работал бы с момента его запуска и получал canceld много раз в течение одной секунды? –