перемещение спрайта вызывает рывки

У меня какое-то резкое движение моего спрайта.

По сути, когда пользователь касается точки на экране, спрайт должен перемещаться в эту точку. В основном это работает нормально ... даже с учетом дельты, потому что частота кадров может быть непостоянной.

Однако я заметил, что движение по оси y обычно заканчивается раньше, чем движение по оси x (даже если расстояния для перемещения одинаковы), поэтому создается впечатление, что спрайт движется в форме буквы «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);
}

person mac_55    schedule 28.03.2010    source источник


Ответы (1)


Вы хотите перейти к (targetx, targety) из любого (x, y) и достичь обеих координат одновременно (чтобы избежать «изгиба»). Итак, предположим, что скорость x равна vx, и вы доберетесь до нее за t секунд. Это означает, что vx = (targetx - x)/t. t должно быть одинаковым для координаты y, если вы хотите плавно перемещаться в одну и ту же точку в одно и то же время, так что это означает, что t = (targetx - x)/vx, а vy на самом деле должно быть (targety - y)*vx/(targetx - Икс).

Другими словами, вы не можете установить vx и vy отдельно и получить желаемый результат.

person Jim    schedule 28.03.2010
comment
Кажется, я понял это, так что x += vx * dt; и y += (targety - y)*vx/(targetx - x) *dt? - person mac_55; 28.03.2010
comment
Да, но следите за делением на ноль, если (targetx - x) = 0. - person Jim; 28.03.2010