2010-03-28 7 views
2

스프라이트가 갑자기 움직이는 경우가 있습니다.스프라이트를 움직이면 흔들리는 동작이 발생합니다.

기본적으로 사용자가 화면의 한 지점을 터치하면 스프라이트가 해당 지점으로 이동해야합니다. 이것은 대개 잘 작동합니다 ... 심지어 델타를 고려하고 있습니다 - 프레임 속도가 일정하지 않을 수 있기 때문입니다.

그러나 x 이동 이전에 y 이동이 일반적으로 끝나기 때문에 (이동 거리가 같을지라도) 스프라이트가 부드러운 대각선이 아닌 'L'모양으로 움직이는 것처럼 보입니다 .

수직 및 수평 속도 (vx, vy)는 모두 300으로 설정됩니다. 잘못된 아이디어가 있습니까? 내 스프라이트가 부드러운 대각선으로 이동하도록하려면 어떻게해야합니까?

- (void)update:(ccTime)dt 
{ 
int x = self.position.x; 
int y = self.position.y; 

    //if ball is to the left of target point 
if (x<targetx) 
{ 
      //if movement of the ball won't take it to it's target position 
    if (x+(vx *dt) < targetx) 
    { 
     x += vx * dt; 
    } 
    else { 
     x = targetx; 
    } 

} else if (x>targetx) //same with x being too far to the right 
{ 
    if (x-(vx *dt) > targetx) 
    { 
     x -= vx * dt; 
    } 
    else { 
     x = targetx; 
    } 

} 
if (y<targety) 
{ 
    if (y+(vy*dt)<targety) 
    { 
     y += vy * dt; 
    } 
    else { 
     y = targety; 
    } 

} else if (y>targety) 
{ 
    if (y-(vy*dt)>targety) 
    { 
     y -= vy * dt; 
    } 
    else { 
     y = targety; 
    } 

} 
self.position = ccp(x,y); 
} 

답변

2

당신은 어떤 것 (x, y)에서 (targetx, targety)로 이동을 동시에 협조 (이하 "도그 레그"을 피하기 위해) 도착합니다. 그래서 x 속도가 vx이고 t 초 안에 도착한다고 가정하십시오. 이것은 vx = (targetx - x)/t를 의미합니다. t = (targetx - x)/vx 및 vy가 실제로 (targety - y) 여야 함을 의미하므로 * tx = (targetx - targetx) - x).

즉, vx와 vy를 따로 설정할 수 없으며 원하는 결과를 얻을 수 없습니다.

+0

나는 이것을 얻는다. x + = vx * dt; y + = (targety - y) * vx/(targetx - x) * dt? –

+0

예, (targetx - x) = 0 인 경우 0으로 나누는 것에주의하십시오. – Jim

관련 문제