2011-10-26 6 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)); 
} 

, 난 그냥 화면에 화살표를 그리기 해요, 나 또한 항상 같은 지점에서 화재와 같은 방향이다. 당신의 a 루프 카운터

ar = this; 

var ar = this; 

그리고 같은에 :이 유일한 문제이지만,이 라인을 변경해야하는 경우

+2

setInterval에서 실제로 1 밀리 초를 원하십니까? – erturne

+0

@erturne - 좋은 지적. 나는 대답을 언급하는 것을 잊어 버렸지 만 그렇습니다. 브라우저는 다른 일을 하느라 바쁘지 않더라도 실제로 1ms 간격을 주려고하지 않습니다. – nnnnnn

+0

알아요,하지만 이것은 노드를 사용하여 실행합니다.) – corazza

답변

4

확실하지.

현재 var을 사용하지 않으면 을 의미합니다. 모든 변수의은 전역 변수입니다.

일반적으로 모든 종류의 혼란을 야기하지만 더 구체적으로 말하자면 여러 화살표를 발사하면 각각이 자체적으로 setInterval을 시작하지만 간격 기능에서 ar에 대한 참조는 모두 동일한 것을 나타냅니다 전역 변수와 그래서 모두가 가장 최근에 해고 된 화살을 움직여 속도를 향상시킵니다.

varar 선언과는 Arrow 기능 지역이된다 (하지만 여전히 당신은 당신의 setInterval에 대해 만든 것과 같은 그 함수 안에 중첩 기능에 액세스 할 수 있습니다). 클로저의 마술은 각각의 간격이 주변 범위의 현재 로컬 ar만을 참조하며 각 화살표가 적절하게 독립적으로된다는 것을 의미합니다.

var으로 선언하지 않고 변수를 사용해야하는 경우는 특별히 일 때 함수 내에서 전역을 만들려는 경우입니다. 그리고 그때가 가장 좋은 방법인지 스스로에게 물어야합니다.

+1

+1 전역의 사용을 피하십시오. 스코프 체인을 해결하려면 스코어 체인을 걸어 야하기 때문에 퍼포먼스 패널티도 있습니다. – erturne

+0

답변 해 주셔서 감사합니다. – corazza

+0

반갑습니다. – nnnnnn

관련 문제