You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:09:10