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

Love2D射线引擎中角度转归一化向量仅返回45度增量问题

问题修复方案

核心问题分析

你的移动逻辑出现45度捕捉的问题,主要来自两个关键错误:

  1. 角度转向量的轴顺序颠倒,导致方向向量逻辑混乱
  2. 移动合成公式存在符号错误和逻辑冗余,强制移动向量向45度方向对齐

步骤1:修正角度转向量函数

原函数返回的向量X/Y轴顺序颠倒,替换为标准的方向向量计算:

function AngToVec(angle)
    local rad = math.rad(angle)
    -- X轴对应cos(角度),Y轴对应sin(角度),符合2D坐标系的方向定义
    return { math.cos(rad), math.sin(rad) }
end

步骤2:简化并修正移动加速度计算

原代码的加速度公式有多余的负号和错误的向量组合,替换为清晰的向量合成逻辑:

player.Rot = AngToVec(player.Angle)
-- 计算左右移动的垂直向量(也可以用AngToVec(player.Angle + 90),结果一致)
local altRot = { -player.Rot[2], player.Rot[1] }

-- 合成前后+左右的移动向量
local moveX = player.Input[2] * player.Rot[1] + player.Input[1] * altRot[1]
local moveY = player.Input[2] * player.Rot[2] + player.Input[1] * altRot[2]

-- 可选:归一化移动向量,避免斜向移动速度过快
local length = math.sqrt(moveX^2 + moveY^2)
if length > 0 then
    moveX = moveX / length
    moveY = moveY / length
end

-- 应用速度到加速度
player.Accel[1] = moveX * player.Speed
player.Accel[2] = moveY * player.Speed

-- 更新玩家速度(原代码的Vec2未定义,直接索引X/Y轴即可)
player.Vel[1] = player.Vel[1] + player.Accel[1]
player.Vel[2] = player.Vel[2] + player.Accel[2]

额外检查点

  • 确认player.Input的取值逻辑:A键对应Input[1] = -1,D键对应Input[1] = 1;W键对应Input[2] = 1,S键对应Input[2] = -1(如果移动方向相反,调整对应符号即可)
  • 如果仍有角度捕捉问题,检查player.Angle的更新逻辑,确保角度是连续变化而非被强制取整到45度倍数

内容的提问来源于stack exchange,提问作者Thin Mint

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 00:58:26