Love2D射线引擎中角度转归一化向量仅返回45度增量问题
问题修复方案
核心问题分析
你的移动逻辑出现45度捕捉的问题,主要来自两个关键错误:
- 角度转向量的轴顺序颠倒,导致方向向量逻辑混乱
- 移动合成公式存在符号错误和逻辑冗余,强制移动向量向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
相关产品推荐
相关产品推荐

