当角度接近 90 时,子弹变得超快
Bullets become super fast as the angle gets closer 90
所以我正在 Java 中开发一款游戏,我正在尝试将子弹射向光标位置 - 射击部分没问题,但由于光标和玩家之间的角度(玩家射击子弹所以本质上是子弹的第一个坐标)接近 90(或 -90)子弹飞得超快,我不知道为什么
The red zone is the super-speed zone
代码:
public void run() {
super.run();
final double currentY=y;
final double currentX=x;
double slope = (cursorPos.y - currentY) / (cursorPos.x - currentX);
double angle= Math.toDegrees(Math.atan2(cursorPos.y - currentY, cursorPos.x - currentX));
System.out.println(angle);
while (true){
try {
double newY;// y = m * (x-x.) + y.
newY = ((slope*(x - currentX))+currentY);
y= (int) newY;
if ((angle <=-90 && angle>=-180) || (angle >=90 && angle<=180) )
{
x--;
}
else {
x++;
}
Thread.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
您正在按固定增量 1 及时步进 x。所以当子弹线接近垂直时,斜率 m 是一个很大的数字,并且它们在 y 中每步覆盖 m 个像素。越接近垂直,他们走得越快。
相反,您需要沿着子弹跟随的线段以固定的距离增量步进。如果端点是 (x0,y0) 和 (x1,y1),则在方程 x = t*(x1-x0)+x0 中将 t 从 0 变为 1; y=t*(y1-y0)+y0 将扫描线段。要以 1 个像素为单位扫描,您需要知道沿线有多少个像素。那是 L = sqrt(sqr(x1-x0) + sqr(y1-y0)),所以 t 的值为 i / L for i = 0 to L.
您需要使用浮点数进行这些计算。
另一个注意事项是,您最终可能会像现在这样使用 Sleep 时遇到麻烦。这会阻止 Swing 事件处理循环在等待时执行任何工作。
所以我正在 Java 中开发一款游戏,我正在尝试将子弹射向光标位置 - 射击部分没问题,但由于光标和玩家之间的角度(玩家射击子弹所以本质上是子弹的第一个坐标)接近 90(或 -90)子弹飞得超快,我不知道为什么
The red zone is the super-speed zone
代码:
public void run() {
super.run();
final double currentY=y;
final double currentX=x;
double slope = (cursorPos.y - currentY) / (cursorPos.x - currentX);
double angle= Math.toDegrees(Math.atan2(cursorPos.y - currentY, cursorPos.x - currentX));
System.out.println(angle);
while (true){
try {
double newY;// y = m * (x-x.) + y.
newY = ((slope*(x - currentX))+currentY);
y= (int) newY;
if ((angle <=-90 && angle>=-180) || (angle >=90 && angle<=180) )
{
x--;
}
else {
x++;
}
Thread.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
您正在按固定增量 1 及时步进 x。所以当子弹线接近垂直时,斜率 m 是一个很大的数字,并且它们在 y 中每步覆盖 m 个像素。越接近垂直,他们走得越快。
相反,您需要沿着子弹跟随的线段以固定的距离增量步进。如果端点是 (x0,y0) 和 (x1,y1),则在方程 x = t*(x1-x0)+x0 中将 t 从 0 变为 1; y=t*(y1-y0)+y0 将扫描线段。要以 1 个像素为单位扫描,您需要知道沿线有多少个像素。那是 L = sqrt(sqr(x1-x0) + sqr(y1-y0)),所以 t 的值为 i / L for i = 0 to L.
您需要使用浮点数进行这些计算。
另一个注意事项是,您最终可能会像现在这样使用 Sleep 时遇到麻烦。这会阻止 Swing 事件处理循环在等待时执行任何工作。