如何让Player以恒定每秒像素速度向鼠标位置移动?
嗨,我来帮你搞定这个恒定移动速度的问题!你的核心问题是原来的移动逻辑直接用了鼠标位置的比例,导致鼠标离玩家越远,移动速度越快。要实现固定的每秒像素移动,我们需要基于方向向量归一化来计算每帧的移动量——简单说就是先找准鼠标的方向,然后让每帧只移动固定的像素数,不管距离多远。
具体修改方案
1. 定义恒定速度参数
先设定你想要的每秒移动像素数,同时根据定时器间隔计算每帧该移动多少:
const SPEED = 100; // 这里设为100像素/秒,你可以按需调整 const FRAME_INTERVAL = 10; // 你的定时器是10ms执行一次 const PER_FRAME_MOVE = SPEED * (FRAME_INTERVAL / 1000); // 每帧移动的像素数
2. 替换移动计算逻辑
把你原来的moveMapX和moveMapY计算代码,换成下面基于方向向量的逻辑(已经完全移除clickedPosX/Y变量):
// 计算玩家中心到鼠标的方向向量 const dx = mouseX - centerPlayerX; const dy = mouseY - centerPlayerY; // 计算玩家到鼠标的直线距离 const distance = Math.sqrt(dx * dx + dy * dy); // 如果鼠标刚好在玩家中心,直接跳过移动 if (distance === 0) return; // 归一化向量:把方向向量转换成长度为1的单位向量,只保留方向 const dirX = dx / distance; const dirY = dy / distance; // 计算新的地图位置(因为地图移动和玩家移动方向相反) const moveMapX = currentMapPositionX - dirX * PER_FRAME_MOVE; const moveMapY = currentMapPositionY - dirY * PER_FRAME_MOVE;
完整修改后的定时器代码
把你的setInterval里的内容替换成这个版本:
movingInterval = setInterval(function(){ // 计算方向向量 const dx = mouseX - centerPlayerX; const dy = mouseY - centerPlayerY; const distance = Math.sqrt(dx * dx + dy * dy); if (distance === 0) return; // 鼠标在玩家中心,不移动 const dirX = dx / distance; const dirY = dy / distance; // 恒定速度配置 const SPEED = 100; // 100px/s,可自定义 const FRAME_INTERVAL = 10; const PER_FRAME_MOVE = SPEED * (FRAME_INTERVAL / 1000); // 获取当前地图背景位置 const currentMapPositionX = parseFloat($map.css("background-position-x")); const currentMapPositionY = parseFloat($map.css("background-position-y")); // 更新地图位置 const moveMapX = currentMapPositionX - dirX * PER_FRAME_MOVE; const moveMapY = currentMapPositionY - dirY * PER_FRAME_MOVE; $map.css({ "background-position-x": `${moveMapX}px`, "background-position-y": `${moveMapY}px` }); // 保持飞船旋转逻辑(调整了参数顺序让角度更准确) const angle = getDirection(centerPlayerX, centerPlayerY, mouseX, mouseY); $player.find('.ship').css('transform', 'rotate('+angle+'deg)'); }, 10);
为什么这么改?
- 归一化向量是核心:它确保不管鼠标离玩家多远,每帧的移动距离都是固定的,彻底解决了速度随距离变化的问题。
- 用
SPEED * (FRAME_INTERVAL / 1000)计算每帧移动量,能保证不管你调整定时器间隔,速度始终是你设定的每秒像素数。 - 完全移除了
clickedPosX/Y变量,改用实时的鼠标位置计算方向,符合你的要求。
内容的提问来源于stack exchange,提问作者Martijn Ebbens
相关产品推荐
相关产品推荐

