如何通过设定速度平滑移动Wizard实体至目标X坐标(替代直接赋值)
实现步进式坐标对齐功能
核心思路
先根据原逻辑计算出需要对齐到的20倍数目标坐标,然后通过每帧移动固定步长(speed=2)的方式,逐步将Wizard移动到目标位置,避免直接修改坐标的突兀感。
代码实现
首先在类中添加必要的成员变量,用于跟踪目标坐标和移动状态:
// 目标对齐坐标 private int targetX; private int targetY; // 移动步长 private final int speed = 2; // 标记是否正在执行对齐移动 private boolean isAligning = false;
然后编写计算目标坐标的方法,保留原逻辑中根据朝向决定对齐方向的规则:
// 计算X轴目标对齐坐标 private int getTargetX() { int remainder = wizard.x % 20; if (remainder == 0) return wizard.x; if ("left".equals(facing)) { return wizard.x - remainder; } else if ("right".equals(facing)) { return wizard.x + (20 - remainder); } return wizard.x; // 方向无效时保持原坐标 } // 计算Y轴目标对齐坐标 private int getTargetY() { int remainder = wizard.y % 20; if (remainder == 0) return wizard.y; if ("up".equals(facing)) { return wizard.y - remainder; } else if ("down".equals(facing)) { return wizard.y + (20 - remainder); } return wizard.y; // 方向无效时保持原坐标 }
接下来编写启动对齐的方法,触发移动流程:
// 启动坐标对齐移动 public void startAlignment() { targetX = getTargetX(); targetY = getTargetY(); isAligning = true; }
最后在游戏的帧更新逻辑中添加移动处理(需确保这个方法每帧都会被调用):
// 每帧更新移动状态 public void updateAlignmentMovement() { if (!isAligning) return; // X轴步进移动 if (wizard.x < targetX) { wizard.x += speed; // 防止过度移动,直接修正到目标 if (wizard.x > targetX) wizard.x = targetX; } else if (wizard.x > targetX) { wizard.x -= speed; if (wizard.x < targetX) wizard.x = targetX; } // Y轴步进移动 if (wizard.y < targetY) { wizard.y += speed; if (wizard.y > targetY) wizard.y = targetY; } else if (wizard.y > targetY) { wizard.y -= speed; if (wizard.y < targetY) wizard.y = targetY; } // 到达目标后停止移动 if (wizard.x == targetX && wizard.y == targetY) { isAligning = false; } }
使用方式
将你原来直接修改坐标的代码块替换为调用startAlignment(),然后确保updateAlignmentMovement()在游戏的主循环中被每帧执行即可。
内容的提问来源于stack exchange,提问作者Sekiro
相关产品推荐
相关产品推荐

