2011-10-26 24 views
0

setIntervalに問題があります。私の試合では、矢を撃つことができるようにしたいが、彼が撃つたびに矢印が速く進んでいる!だから、一般的な考え方は、矢印が1秒間飛行し、その後、削除されるということであるこの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)); 
} 

を、私は、画面上の矢印を描いてる、私もいつも同じ場所から発射し、同じ方向に移動します。あなたのaループカウンタ用

​​

var ar = this; 

と同じに:これが唯一の問題ですが、この行を変更する必要がある場合

+2

本当に1ミリ秒をsetIntervalに入れたいですか? – erturne

+0

@erturne - 良い点。私は私の答えで言及することを忘れていましたが、はい、ブラウザは実際には1ms間隔を与えるつもりはありません。 – nnnnnn

+0

私は知っていますが、これはノードを使用して実行されます) – corazza

答えて

4

わかりません。

現時点ではvarを使用していません。つまり、を意味します。変数のはすべてグローバルです。

一般的にすべての種類の混乱につながりますが、具体的には、複数の矢印を放つと、それぞれが独自のsetIntervalを開始しますが、interval関数のarへの参照はすべて同じグローバル変数と同様にすべての最近の発射された矢印を移動するので、スピードアップします。

vararを宣言し、それがArrow関数に対してローカルになり(それでもあなたはsetIntervalのために作成したもののように、その関数内にネスト機能にアクセス可能です)。クロージャーの魔法は、あなたの間隔のそれぞれが、現地の範囲arのみを周囲の範囲から参照することを意味し、各矢印は適切に独立しています。

varで宣言せずに変数を使用する必要があるのは、関数内からグローバルを作成する場合は、特にの場合です。そしてそれが最善の方法であるかどうかを問わなければならない。

+1

+1はグローバルの使用を避けるためです。スコープチェーンは、それらを解決するために歩かなければならないので、パフォーマンスペナルティもあります。 – erturne

+0

あなたの答えをありがとう! – corazza

+0

よろしくお願いします。 – nnnnnn

関連する問題