перемещение спрайта вызывает рывки
-
22-09-2019 - |
Вопрос
У меня какое-то прерывистое движение моего спрайта.
По сути, когда пользователь касается точки на экране, спрайт должен переместиться в эту точку.В основном это работает нормально...это даже учитывает дельту - потому что частота кадров может быть непостоянной.
Однако я заметил, что движение 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);
}
Решение
Вы хотите перейти к (targetx, targety) из любой точки (x,y) и достичь обеих координат одновременно (чтобы избежать «изгибов»).Итак, предположим, что скорость x равна vx, и вы доберетесь до цели за t секунд.Это означает, что vx = (targetx - x)/t.t должен быть одинаковым для координаты y, если вы хотите плавное движение к одной и той же точке в одно и то же время. Это означает, что t = (targetx - x)/vx, а vy на самом деле должно быть (targety - y)*vx/(targetx - Икс).
Другими словами, вы не можете установить vx и vy отдельно и получить желаемый результат.