2012-12-08 1 views
0

그래서 HTML5 캔버스와 자바 스크립트를 사용하여 간단한 물리 시뮬레이션을 만들고 있습니다. 현실적인 충돌을 시도하고 있지만 충돌이 발생할 때마다 코드가 무한 루프를 반복하여 페이지를 고정시킵니다.Javascript, loops 無限로 동결

나는 자바 스크립트 콘솔에서 라인 "을 console.log를 ("내가 뭔가와 충돌하고있다 ")"볼 때 구글 크롬 24.0.1312.32 베타 m

를 사용하여 당 수천 번 미쳐 가고 인쇄하고 두 번째로 페이지가 완전히 깨집니다.

나는 왜 그 일이 벌어지고 있는지, 나는 무엇을 해야할지 잘 모릅니다. 어떤 도움이나 의견도 정말 감사 할 것입니다.

for (i = 0; i <= 3; i++) { 
    if (collide(i)) { 
     console.log("I am colliding with something"); 
     if (typeof getCollideIndx === 'undefined') { 
      console.log("collide index is not undefined"); 
      if (!getCollideIndx(i)) { 
       console.log("Made it past null check"); 
       //...update object based on collision 

을 충돌() 함수는 다음과 같습니다

function collide(b) { 
for (i = 0; i <= 3; i++) { 
    //Distance between each object 
    var distance = (Math.sqrt(Math.pow((balls[b].x - balls[i].x), 2) + Math.pow(balls[b].y - balls[i].y, 2))); 
    if (distance < 32) { 
     //must be less than 2*radius -- all radii are the same 

     //makes it so that it doesn't return true when checking its own index 
     if (!(balls[b].mass == balls[i].mass)) { 
      return true; 
     } else { 
      return false; 
     } 
    } 
} 

}

+1

무한 루프가 보이지 않습니다. 첫 번째 코드 블록을 무엇이라고 부릅니까? 첫 번째'for' 루프 위에 무엇인가를 출력한다면, 역시 1 톤 인쇄 될까요? – loganfsmyth

+1

어떤 종류의 실행 루프 내에 있습니까? 당신의 루프를 추측하는 것은 예를 들어 30fps로 더 많이 실행할 것입니다. 그렇다면이 코드를 초당 30 번 호출 할 것입니다. –

+0

게임의 루핑 기능 내에 있습니다. 30 밀리 초마다 호출됩니다. 내가 그것을 실행할 때마다 초당 15,000 회 이상 인쇄되고 페이지가 정지됩니다. 이 페이지에 대한 링크는 다음과 같습니다 : univeloper.freeiz.com/simulation.html – ZacB

답변

0

난 당신의 코드에서 무한 루프를 볼 수없는, 내 추측이 문이 될 것입니다

if (typeof getCollideIndx === 'undefined') 

매번 실패하고 아래 코드가있는 함수를 계속 호출합니다.

컨트롤이 항상 (을 충돌() 함수에서) 호출 함수로 돌아 간다
for (i = 0; i <= 3; i++) { 
    if (collide(i)) { 
     console.log("I am colliding with something"); 
     if (typeof getCollideIndx === 'undefined') { 
      console.log("collide index is not undefined"); 
      if (!getCollideIndx(i)) { 
       console.log("Made it past null check"); 
       //...update object based on collision 

이에, 나는

+0

나는 그것을 꺼내 스크립트를 멈추게했지만, 잡히지 않은 TypeError를 얻는다. 내가 거기에서 할 수있는 것을 볼 것이다. – ZacB

0

음, for 루프에 갇혀 for 루프의 지점이 표시되지 않습니다 인덱스 변수 i이 어딘가에 잘못 설정되어 있음을 나타냅니다. 명시 적으로 코드를 볼 수는 없지만 명시 적으로 범위를 지정하지 않았으므로 (for(var i...) 루프 for(i=0; i<3; i++){...window 개체에 i을 할당합니다.

두 번째 기능에서 동일한 변수 i이 영향을 받기 때문에 첫 번째 기능이 세 번이 아닌 한 번만 실행되는 this jsfiddle을 참조하십시오.

분명히 한 번 실행! = 무한 루프하지만 collide 기능은 i에 무언가를 (또는 어쩌면 충돌을 발견 한 후? 나누기) 다음 i의 값이 루프 각의의 시작 부분에 0으로 재설정됩니다 경우 시간이라고.

그래, 더 많은 코드가 없으므로 나는 확실히 말할 수 없다. 이 경우의 나의 충고는 : 루프를 위해 항상 var을 사용하거나 이상한 일이 일어날 수있다!