2014-12-31 5 views
0

애니메이션으로 놀고 있습니다. 나는 두 개의 동그라미를 정해진 거리만큼 움직이고 멈추게하려고 노력 중이다. 내가 가지고있는 문제는 여러 간격으로 발생합니다. 고유 한 변수에 각 간격을 할당하고 그 변수를 clearInterval로 할당하지만 첫 번째 간격은 계속됩니다. 여기 자바 스크립트 setInterval : 여러 간격

코드입니다 : 다음

function moveRight(player){ 

if(player==1){ 
    currentLoc = p1Loc[0];   //global var with player's current location 
    intervalR1 = setInterval(function(){ 
     p1Loc[0]+=1; 
     draw();      //function that redraws the canvas 
     if(p1Loc[0]>currentLoc+wu){ //wu is a single "width-unit" 
      clearInterval(intervalR1); 
     } 
    },5) 
} 
else{ 
    currentLoc = p2Loc[0]; 
    intervalR2 = setInterval(function(){ 
     p2Loc[0]+=1; 
     draw(); 
     if(p2Loc[0]>currentLoc+wu){ 
      clearInterval(intervalR2); 
     } 
    },5) 
} 

} 

,의 내가 while 루프 내에서 다음과 같은 지침을 제공 가정 해 봅시다 :

instructions = ["moveRight(1)", "moveRight(2)"]; 
for(instruction in instructions){ 
    eval(instructions[instruction]); //I know, eval(), ugh. Is just temporary 
} 

두 선수를 잘 움직이기 시작한다 일어나고 끝나는 무엇을하지만, 선수 2는 선수가 계속 가고있는 동안 단 하나 wu, 또는 폭 단위 후에 멈춘다. 지시 사항을 "moveRight (1);"로 변경하면 플레이어 1이 단일 wu를 이동하고 중지합니다.

여기 무슨 일 이니?

+0

을이 통과 간격으로 재생하는 대신 [requestAnimationFrame] (http://davidwalsh.name/requestanimationframe-shim)을 사용하는 것이 좋습니다. –

+0

그 간격은? setInterval이 완료 될 때까지 설정되지 않습니다. 이는 clearInterval 호출 전에 경고를 표시하여 테스트하기에 충분합니다. –

답변

1

이것은 단지 코드의 일부로 어떤 일이 일어나는지 말할 수 없기 때문에 추측에 불과하지만, currnetLoc을 두 번 할당하고 있기 때문에 첫 번째 플레이어의 위치는 항상 p2Loc[0]과 비교했을 때

moveRight(1)으로 전화하면 currentLoc에서 p1Loc[0]으로 설정됩니다. 그런 다음 바로 moveRight(2)으로 전화하여 currentLocp2Loc[0]으로 설정하십시오. 이제 플레이어 1의 간격은 p1Loc[0]>currentLoc+wu이 아니고 p2Loc[0]>currentLoc+wu이됩니다. p2Loc의 값에 따라 항상 false이 될 수 있습니다.

+0

Oo, 좋은 캐치, 확인 보겠습니다 – ZAR

+0

예! 좋은 캐치. 6 분 안에 올바른 표시가됩니다 (SO 규칙에 따라) – ZAR

1

이 줄 :

currentLoc = p1Loc[0];   //global var with player's current location 

좀 무섭다. 특히 두 번째 항목의 값을 함수에 다시 할당 할 때 전역 변수를 사용하지 마십시오.

currentLoc = p2Loc[0]; 

가능성이 있습니다.

당신은 하나의 플레이어의 위치를 ​​추적 플레이어 객체를 만들고 같은, 거기에 뭔가 그것을 추적해야하는 경우 :

function Player(number) { 
    this.number = number 
    this.position = 0 //some default initial position 
} 

을하고 그냥 참고었던 MovieRight()에

+0

당신은 또한 문제를 확인했습니다. isomarcte가 처음 이었지만 당신은 지구상의 덩어리에 대해 절대적으로 옳습니다. 저는 캔버스 애니메이션에 대해 배우기 위해 무언가를 함께 해킹하는 중입니다. 현재 바람에 좋은 코드 원칙을 던지고 있습니다. 나는 네가 그렇게 할 때 일어나는 일이라고 생각해. 고마워! – ZAR

+0

문제 없습니다. upvote 주셔서 감사합니다! –