Atualmente, tenho algo como:
float deltaX = point0.getX() - point1.getX();
float deltaY = point0.getY() - point1.getY();
E a cada 0,01 segundo, atualizo minha posição dos objetos da seguinte maneira:
object.setPosition(object.getX()-deltaX/100,object.getY()-deltaY/100);
Então isso move meu objeto do ponto0 para o ponto1 em 1 segundo. O que eu preciso é ter os 2 pontos, para poder mover o objeto do ponto0, enfrentando (na direção do) ponto1 com uma velocidade constante. Assim, quando eu tenho um ponto mais próximo do meu ponto inicial, o objeto se move em direção a ele com a mesma velocidade que faria se eu tivesse um ponto mais distante. Todas as sugestões são apreciadas. Obrigado.
game-mechanics
movement
Fofole
fonte
fonte
Respostas:
Usarei algumas estruturas de álgebra linear, pois é mais fácil descrever as operações dessa maneira. Caso você não saiba como implementar essas operações de vetor, darei uma explicação rápida no final.
Então, digamos que você comece com esses valores:
start
eend
marque os pontos finais do movimento,speed
é quantos pixels ele deve mover por segundo eelapsed
é a taxa na qual você atualizará a posição do seu objeto (alguns mecanismos já fornecem esse valor para você ):A primeira coisa que você deseja calcular é a distância entre os dois pontos e um vetor normalizado que contém a direção do início ao fim. Além disso, você deve "ajustar" a posição do objeto ao
start
ponto. Esta etapa é realizada apenas uma vez, no início:Em seguida, em seu método de atualização, você mover o objeto, adicionando uma multiplicação de
direction
,speed
eelapsed
para a sua posição. Depois disso, para verificar se o movimento terminou, você vê se a distância entre o ponto inicial e a posição atual do objeto é maior que a distância inicial calculada. Se isso for verdade, ajustamos a posição do objeto ao ponto final e paramos de movê-lo:Referência Rápida de Operações de Vetor
Representação
Soma / Subtração
Multiplique por escalar (flutuador)
Comprimento / Distância
Normalizar
Isso deve ser suficiente para converter o código acima em operações regulares, se você não tiver uma
Vector
classe disponível.Exemplo de conversão
fonte
Vector2 start;
torna-sefloat startX, startY;
. E você pode calcular facilmente a distância manualmente, como explico no final. Ou sejafloat dX = bX - aX; float dY = bY - aY; float distance = Math.sqrt(dx*dx+dy*dy);
.Crie um vetor e normalize-o. Atenção, algum pseudo-código com números errados à frente:
Isso lhe dará um vetor como:
Agora normalize o vetor e você receberá este :
A partir daqui, é o mesmo movimento do seu delta.
fonte
Copiado e colado da minha resposta para: Obter pontos em uma linha entre dois pontos
No pseudocódigo:
fonte