2011-10-26 126 views
0

我遇到了setInterval問題。在我的比賽中,我希望球員能夠射出一支箭,但是每次他射箭的時候都會更快! 這是箭頭的構造函數:如何解決這個setInterval問題?

arrows = []; 

Arrow = function(x, y, followX, followY) // (player.x, player.y, followX, followY) 
{ 
    ar = this; 

    ar.rect = [x, y, 28, 3]; 

    ar.x = x; 
    ar.y = y; 

    ar.followX = followX; 
    ar.followY = followY; 

    if(ar.followY - ar.y < 0) 
    { 
      ar.where = [-(((ar.followX - ar.x)/200)/((ar.followY - ar.y)/200)), -1]; 
    } 
    else 
    { 
      ar.where = [(((ar.followX - ar.x)/200)/((ar.followY - ar.y)/200)), 1]; 
    } 

    ar.flying = setInterval(function() 
    { 
      ar.rect[0] += ar.where[0]/10; 
      ar.rect[1] += ar.where[1]/10; 
    }, 1); 

    ar.fall = setTimeout(function() 
    { 
      for(a = 0; a < arrows.length; a++) 
       if (arrows[a] == ar) 
       { 
        clearInterval(ar.flying); 
        arrows = sliceHere(arrows, a); 
       } 
    }, 1000); 
} 

所以總的想法是,箭頭飛一秒鐘,然後被刪除。

這是怎麼和箭頭被創建:

fireArrow = function(player) 
{ 
    arrows.push(new Arrow(player.rect[0] + player.rect[2] - 1, player.rect[1] + player.rect[3]/2 - 10, player.rect[0] + player.mouse.x - sx/2, player.rect[1] + player.mouse.y - sy/2)); 
} 

在那之後,我只是畫箭頭在屏幕上,我也總是從同一地點火了,在同一個方向。

+2

你真的想在setInterval中使用1毫秒嗎? – erturne

+0

@erturne - 好點。我忘了在我的回答中提到,但是,是的,即使它不忙於做其他事情,瀏覽器也不會給你1ms的時間間隔。 – nnnnnn

+0

我知道,但這是使用節點運行;) – corazza

回答

4

不知道這是唯一的問題,但你應該改變這一行:

​​

var ar = this; 

與同爲你a循環計數器。

目前你不使用var任何地方這意味着所有你的變量是全球性的。

這通常會導致各種混淆,但更具體地說,如果您激發多個箭頭,則每個箭頭都會啓動它自己的setInterval,但在間隔函數中對ar的引用將全部引用相同全局變量等都將移動最近被觸發的箭頭,從而加快速度。

聲明arvar,併成爲當地的Arrow功能(但仍是嵌套像您setInterval創建的那些函數內部函數訪問)。封閉的魔力意味着你的每個間隔只會引用周圍範圍內現在的當地ar,並且每個箭頭都將正確地獨立。

你曾經使用的變量,而不與var宣佈它的唯一情況是,當你特別想從一個函數中創建一個全球性的。即便如此,你應該問問自己,如果這是最好的方式。

+1

+1用於避免使用全局變量。他們也有性能損失,因爲範圍鏈必須被解決。 – erturne

+0

謝謝你的回答! – corazza

+0

不客氣。 – nnnnnn