Java游戏开发中弹朝向光标射击接近±90度时速度异常过快问题
问题根因
你当前的移动逻辑是固定x轴每步移动1像素,再通过斜率反推y的坐标,这种实现下子弹的实际移动速度会随角度变化:
- 角度接近0/180度时,斜率接近0,y几乎不变,每帧总位移就是1像素,速度正常
- 角度接近±90度时,斜率趋近于无穷大,x每走1像素,y会跳转数十甚至上百像素,每帧总位移远大于1,就会出现超速现象
同时当前实现还存在cursorPos.x和currentX相等时,斜率计算触发除以零异常的隐患。
修复方案
改用方向向量归一化的方式实现固定速度移动,无论朝向什么角度,子弹每帧的总位移都保持一致,彻底解决速度不均的问题。
修正后代码
public void run() { super.run(); final double startY = y; final double startX = x; // 自定义子弹每帧移动速度,数值越大速度越快 final double BULLET_SPEED = 1.0; // 计算初始位置指向光标的方向向量 double deltaX = cursorPos.x - startX; double deltaY = cursorPos.y - startY; // 计算向量模长 double distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY); // 归一化方向向量(模长转为1) double dirX = deltaX / distance; double dirY = deltaY / distance; // 用double存储中间坐标避免精度丢失 double currentX = startX; double currentY = startY; while (true) { try { // 按固定速度更新坐标 currentX += dirX * BULLET_SPEED; currentY += dirY * BULLET_SPEED; // 赋值给实际坐标变量 x = (int) currentX; y = (int) currentY; Thread.sleep(5); } catch (InterruptedException e) { e.printStackTrace(); break; // 线程中断后退出循环,避免无限运行 } } }
内容的提问来源于stack exchange,提问作者Almogbb
相关产品推荐
相关产品推荐

