Eu consigo identificar dois problemas. O primeiro está relacionado ao movimento suave e o segundo está relacionado ao personagem saindo da tela.
Para criar um movimento suave, você pode usar uma técnica chamada Interpolação Linear ou (LERP) para suavizar o movimento. Basicamente, como ele funciona é entre o ponto inicial e o ponto final, você calcula um conjunto de distâncias cada vez menores para simular movimentos suaves e diminuir a velocidade quando o ponto final é quase atingido.
O exemplo mais simples dessa função seria:
//point1 is the current position, will be starting position on first call
//point2 is the target position
//epsilon is the % of the distance between current and target you want
//to cover per game physics loop (a fixed realworld time based loop).
//The smaller the % the "smoother" the motion.
float lerp(float point1, float point2, float epsilon)
{
return point1 + epsilon * (point2 - point1);
}
À medida que o personagem se aproxima do ponto 2, ele diminui gradualmente. Observe que eles nunca tocam o ponto 2, mas ficam infinitamente próximos. Você precisaria corrigir isso e se o jogador estiver a uma distância infinitamente pequena do ponto 2, podemos considerar o jogador no ponto 2.
A segunda questão que você mencionou está relacionada ao seu personagem voando para fora da tela. Isso é resultado da leitura de cada entrada de atualização de loop do jogo combinada com o movimento instantâneo entre as peças.
Idealmente para resolver isso, em seu código você precisa decidir
- Quanto tempo no mundo real levaria para o personagem passar do ponto 1 para o ponto 2.
- Defina seu Lerp para executar entre o ponto 1 e dois durante essa duração
- Leia a entrada novamente quando o ponto 2 for alcançado para decidir para onde ir