我知道之前已经有人问过这个问题,但是没有找到真正有效的答案。有一个类似的问题,但是速度会根据移动距离而异。
所以我遇到的问题是,我想让一个物体(在这种情况下是一个玩家)以恒定的速度沿着一条直线从点A到点B移动。这是通过点击玩家并将其拖动到我想要他走路的位置来完成的,因此可以在任何方向和距离上进行移动。
我有一些代码几乎可以解决问题,但是玩家总是稍微偏离航线,尤其是他行驶的距离越长。以下是那段代码:
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;
};
}
我希望这有意义,我只包含相关代码的部分。我认为我的问题可能在于xRatio和yRatio部分,但我无法弄清楚;我完全被卡住了。
编辑:我想补充说明,playerAngle使玩家面向拖动的方向,这一部分运行正常。
setTimeout
应该做什么?尤其是每秒钟调用60次的情况下? - Bergi