是不是有点偏差?在您所说的“点击屏幕”和heldDown
. 你读过鼠标事件处理程序吗?但我看到你想逐个滴答作响。如果路径发生变化,如果有一个布尔标志会更清楚地提醒您。那么这个部分看起来像
if (leftclicked) {
dest.setLocation(InputHandler.leftClick.xPos, InputHandler.leftClick.yPos);
leftclicked = false;
}
...
严格来说,在物理学中,速度是一个向量。它既有方向,也有大小。如果您打算将其仅视为物体可以移动的速度,并立即转动,那么接下来的三行应该没问题,尽管可读性似乎可以提高。(你必须确定所有辅助方法都在做什么。我可能更愿意在一个地方做任何需要的计算。)
但是我怀疑你确实有velocity
像矢量这样的东西。这里有一些动量的概念。我认为该multiply()
方法的实现很奇怪。如果它将角度velocity
与direction
行为角度相加/组合,则会产生这样的结果。拥有动力方面很酷,但如果需要,您应该真正考虑如何去做。
另一种解释是,您显示的代码按预期工作,沿着黑线的方向缓慢移动,但代码的其他部分与position
. 我们没有得到关于抵达时发生的事情的照片......
关于可读性的另一件事。这非常重要......“非常非常基本”的东西可能是错误的沼泽,没有简单的组织步骤。我不得不多次重写实现,因为我过分渴望并错过了设计。看起来你在我的祸根中做得很好,“一个方法/对象做一件事(好)”的原则,但遇到了麻烦......命名,所有的事情。示例:direction.setLocation()
现在,方向没有位置。重复:方向没有位置。此外,方向不需要标准化 - 它们没有长度。
反而:
direction = new Direction(dx, dy);
position.add(direction.multiply(MOVEMENT_SPEED));//assuming constant speed
在哪里
//sensible encapsulation of "direction"
class Direction {
double angle;//angle in degrees
//constructs a direction from cartesian coordinates
Direction(int x, int y){
angle = Math.toDegrees(Math.atan((double)y/x));
}
//create a vector of specified length in this direction
java.awt.Point multiply(double amt){
return new java.awt.Point(amt*Math.cos(angle), amt*Math.sin(angle))
}
...
}
嗯长答案......请在未来尝试清晰的代码和问题!:)