mover um sprite causa movimento espasmódico
-
22-09-2019 - |
Pergunta
Eu tenho algum movimento espumoso do meu sprite.
Basicamente, quando o usuário toca um ponto na tela, o sprite deve se mover para esse ponto. Isso está funcionando principalmente bem ... está levando em consideração um delta - porque a taxa de quadros pode não ser consistente.
No entanto, noto que o movimento Y geralmente termina antes do movimento X (mesmo quando as distâncias para viajar são as mesmas), então parece que o sprite está se movendo em uma forma 'L' em vez de uma linha diagonal suave.
Velocidade vertical e horizontal (VX, VY) estão ambos definidos como 300. Alguma idéia do que há de errado? Como posso fazer com que meu sprite se mova em uma linha diagonal suave?
- (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);
}
Solução
Você deseja mudar para (TargetX, Targety) de qualquer (x, y) e chegar a ambas as coordenadas ao mesmo tempo (para evitar o "Dogleg"). Portanto, suponha que a velocidade X seja VX e você chegue lá em segundos. Isso significa Vx = (TargetX - X)/T. T deve ser o mesmo para a coordenada y se você quiser um movimento suave para o mesmo ponto ao mesmo tempo, o que significa t = (TargetX - x)/VX e VY devem realmente ser (Targety - y)*VX/(TargetX - x).
Em outras palavras, você não pode definir VX e VY separadamente e obter o resultado desejado.