2015-02-07 3 views
0

Когда я вызываю функцию один раз, интервал в порядке, он добавляется и очищается, как предполагалось. Когда эта же функция снова вызвана, интервал называется сотнями раз. Как я могу остановить это поведение и что не так с моей функцией?Интервал внутри функции вызывает сотни раз

function draw(){ 
    ctx.clearRect(0,0,width,height); 
    ctx.fillStyle = 'blue'; 

    // Add cube width 5px 
    if(cube.width <= 300){ 
     cube.width += 5; 
    } 

    // Draw it on the screen 
    ctx.fillRect(cube.x,cube.y,cube.width,cube.height); 

    // Create function b(e) to check cubes collision 
    function b(e){ 
     var x = e.clientX - ctx.canvas.offsetLeft; 
     var y = e.clientY - ctx.canvas.offsetTop; 

     if(x >= cube.x && x <= cube.x + cube.width 
      && y >= cube.y && y <= cube.y + cube.height){ 
      ctx.canvas.removeEventListener('click',b,false); 
      level1(); 
      return; 
     } 
    } 

    ctx.canvas.addEventListener('click', b, false); 

    // Set the interval to 60 FPS 
    var timer = setInterval(function(){ 
     check += 1; 

     console.log(check); 

     if(check > 50){ 
      return; 
     } 
     // Call again the same function 
     draw(); 
    },1000/60); 
} 

Я подозреваю, что это Java-проблема, поэтому я думаю, что полотно не имеет ничего общего с этим.

Update Функция Я зову дро из (который находится внутри другой функции):

function a(e){ 
     var x = e.clientX - ctx.canvas.offsetLeft; 
     var y = e.clientY - ctx.canvas.offsetTop; 

     if(x >= player.x && x <= player.x + player.width 
      && y >= player.y && y <= player.y + player.height){ 
      ctx.canvas.removeEventListener('click',a,false); 
      draw(); 
     } 
    } 

    // Add the click event using the previous function 
    ctx.canvas.addEventListener('click', a, false); 
+0

вы создаете бесконечный цикл, даже если вы не объявили и не инициализировали контрольную переменную –

+0

Это всего лишь часть всего программного обеспечения. Он работает отлично, но вы правы, если вы просто смотрите на этот кусок кода. – GSquadron

+0

Так как я не вижу декларацию переменной проверки внутри функции draw, то она должна быть вне функции draw, и похоже, вы хотите вызвать функцию draw только 50 раз. Таким образом, вы можете очистить таймер, когда проверка станет больше 50, надеюсь, это вам поможет. –

ответ

1

Что я понял, в соответствии с этим я вывешиваю этот ответ

function draw(check){ 
    ctx.clearRect(0,0,width,height); 
    ctx.fillStyle = 'blue'; 

    // Add cube width 5px 
    if(cube.width <= 300){ 
     cube.width += 5; 
    } 

    // Draw it on the screen 
    ctx.fillRect(cube.x,cube.y,cube.width,cube.height); 

    // Create function b(e) to check cubes collision 
    function b(e){ 
     var x = e.clientX - ctx.canvas.offsetLeft; 
     var y = e.clientY - ctx.canvas.offsetTop; 

     if(x >= cube.x && x <= cube.x + cube.width 
      && y >= cube.y && y <= cube.y + cube.height){ 
      ctx.canvas.removeEventListener('click',b,false); 
      level1(); 
      return; 
     } 
    } 

    ctx.canvas.addEventListener('click', b, false); 

    check+ = 1; 
    if(check <=50) 
    { 
     // Set the interval to 60 FPS 
     var timer = setTimeout(function() 
     { 
     // Call again the same function 
     draw(check); 
     },1000/60); 
    } 
} 

Update Функция Я зову дро из (который находится внутри другой функции):

function a(e){ 
    var x = e.clientX - ctx.canvas.offsetLeft; 
    var y = e.clientY - ctx.canvas.offsetTop; 

    if(x >= player.x && x <= player.x + player.width 
     && y >= player.y && y <= player.y + player.height){ 
     ctx.canvas.removeEventListener('click',a,false); 
     var check = 0; 
     draw(check); 
    } 
} 

// Add the click event using the previous function 
ctx.canvas.addEventListener('click', a, false); 

Вы можете объявить проверьте переменную где-то снаружи и установите ее на 0 перед вызовом функции рисования из какой-либо другой функции или вы можете просто передать контрольную переменную с начальным значением, что бы вы хотели использовать для функции рисования

+0

Не работает. Я нажимаю на прямоугольник, и он не анимируется, если я не нажму на него. Я хочу, чтобы он «реанимировал», когда вызывается одна и та же функция. В принципе, сброс значения cube.width. – GSquadron

+0

Можете ли вы разместить сообщение, откуда вы вызываете функцию ничьей –

+0

Я разместил его как обновление. – GSquadron

0

Вы должны вызвать setInterval() только один раз и вне функции отрисовки. Как вы это делаете, вы начинаете увеличивать количество таймеров, которые вызывают функцию draw(), которую можно назвать бесконечно растущим числом раз. Альтернативно: «Для выполнения функции только один раз, после заданного количества миллисекунд, используйте метод setTimeout()». Ссылка: Window setInterval. setTimeout() может использоваться внутри вашей функции draw().

+0

Я не хочу называть это вне функции, потому что у меня есть другие таймеры, и это практически означает, что я должен использовать все таймеры вне всех функций. Если я вытащил его наружу, функция draw, которая была вызвана другой функцией, делает так, чтобы таймер никогда не выполнялся при вызове функции, но он запускается снаружи, выполняя ту же проблему бесконечно. – GSquadron

Смежные вопросы