Wiem, że zostało to zadane kilka razy wcześniej, ale nie było odpowiedzi, która faktycznie działa, co mogę znaleźć. Jest podobny, ale prędkość zmienia się w zależności od przebytej odległości.Przesuwanie obiektu wzdłuż linii prostej ze stałą prędkością od punktu A do B
Mój problem polega na tym, że próbuję uzyskać obiekt (w tym przypadku odtwarzacz), aby poruszać się wzdłuż linii prostej od punktu A do punktu B ze stałą prędkością. Odbywa się to poprzez kliknięcie na odtwarzaczu i przeciągnięcie do miejsca, do którego chcę iść, aby mógł być w dowolnym kierunku i na dowolną odległość.
Mam kod, który prawie działa, ale odtwarzacz zawsze kończy się nieco poza kursem, tym bardziej im dłuższy dystans, który pokonuje. Oto kod:
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;
};
}
Mam nadzieję, że to ma sens, musiałem uwzględnić tylko tę część kodu, która jest istotna. Myślę, że mój problem prawdopodobnie dotyczy części xRatio i yRatio, ale nie mogę tego rozgryźć; Jestem kompletnie zakłopotany.
EDYCJA: Chciałbym dodać, że PlayerAngle sprawia, że gracz twarzą w kierunku przeciągania, a ta część działa dobrze.
Czy X i Y Int? Ponieważ ruch będzie prawdopodobnie wymagał stabilnego pływaka. (Nie jestem super javascript, więc może var jest właściwy?) – ninMonkey
Co to ma zrobić 'setTimeout'? Zwłaszcza jeśli jest wywoływany 60 razy na sekundę? – Bergi
@Bergi to (zła) próba zatrzymania gracza we właściwym miejscu. Działa, ale jest dość błędny i nieefektywny. Nie miałem jednak czasu, aby przejrzeć tę część, ponieważ starałem się rozwiązać główny problem. –