So che questo è stato chiesto alcune volte in precedenza, ma non è stata trovata alcuna risposta che possa effettivamente funzionare. Ce n'è uno simile, ma la velocità varia a seconda della distanza percorsa.Spostamento di un oggetto lungo una linea retta a una velocità costante dal punto A al B
Quindi il mio problema è che sto cercando di ottenere un oggetto (un giocatore in questo caso) per spostare una lunga retta dal punto A a B a una velocità costante. Questo viene fatto facendo clic sul giocatore e trascinandolo dove voglio che cammini, in modo che possa essere in qualsiasi direzione e su qualsiasi distanza.
Ho un codice che funziona quasi, ma il lettore finisce sempre leggermente fuori rotta, tanto più è lunga la distanza percorsa. Ecco il codice:
window.addEventListener('mouseup', function(e) {
selectedPlayer.moveX = e.pageX;
selectedPlayer.moveY = e.pageY;
movePlayer(selectedPlayer);
});
function movePlayer(player) {
var xDistance = player.moveX - player.x;
var yDistance = player.moveY - player.y;
var travelDistance = Math.sqrt((xDistance * xDistance) + (yDistance * yDistance));
var timeToTravel = travelDistance; //This may seem pointless, but I will add a speed variable later
var playerAngle = Math.atan2(yDistance, xDistance) * (180/Math.PI);
var xRatio = Math.atan2(xDistance, travelDistance);
var yRatio = Math.atan2(yDistance, travelDistance);
//This function is called in another part of code that repeats it 60 times a second
walkPlayer = function() {
setTimeout(function(){
player.x = player.moveX;
player.y = player.moveY;
selectedPlayer = undefined;
walkPlayer = undefined;
}, timeToTravel * 20)
player.angle = playerAngle;
player.x += xRatio;
player.y += yRatio;
};
}
Spero che questo ha un senso, ho dovuto includere solo la parte del codice che è rilevante. Penso che il mio problema risieda probabilmente nelle parti di xRatio e yRatio, ma non riesco a capirlo; Sono completamente perplesso.
MODIFICA: Vorrei aggiungere che playerAngle fa affrontare il giocatore nella direzione del trascinamento e quella parte funziona correttamente.
Sono x e y int? Perché il movimento richiederà probabilmente un galleggiante per essere stabile. (Non sono un vero esperto di javascript, quindi forse var è la cosa giusta?) – ninMonkey
Che cosa dovrebbe fare "setTimeout"? Soprattutto se chiamato 60 volte al secondo? – Bergi
@Bergi è un (brutto) tentativo di fermare il giocatore nel punto giusto. Funziona ma è piuttosto bacato e inefficiente. Non ho ancora avuto il tempo di esaminare quella parte, visto che ho cercato di risolvere il problema principale. –