Java Can';你不能让子弹以正确的角度射击吗?

Java Can';你不能让子弹以正确的角度射击吗?,java,trigonometry,angle,projectile,Java,Trigonometry,Angle,Projectile,我一直在努力让子弹以我投进去的角度射击,但我遇到了一些麻烦。我正在使用eclipse和java 我的代码: x += (int) (spd * Math.cos(dir)); y -= (int) (spd * Math.sin(dir));` 感觉它不起作用的原因是因为它被强制转换为int,这可能使它非常不准确。但为了绘制矩形,它需要整数 当输入dir为0时,它很好并向右射击。问题是当我投进90球时,它不是向上射门,而是向左边射门 你知道我该怎么解决这个问题吗?谢谢 将坐标保持为浮动,仅在调

我一直在努力让子弹以我投进去的角度射击,但我遇到了一些麻烦。我正在使用eclipse和java

我的代码:

x += (int) (spd * Math.cos(dir));
y -= (int) (spd * Math.sin(dir));`
感觉它不起作用的原因是因为它被强制转换为int,这可能使它非常不准确。但为了绘制矩形,它需要整数

当输入dir为0时,它很好并向右射击。问题是当我投进90球时,它不是向上射门,而是向左边射门


你知道我该怎么解决这个问题吗?谢谢

将坐标保持为浮动,仅在调用绘图方法时转换坐标(或将坐标转换为另一个变量)。您需要为下一次迭代保留精确的值。

不,您犯了一个典型的错误:Java trig函数需要弧度,而不是度。你应该通过的不是90;它是π/2.0

因此,一定要通过乘以π/180.0将角度转换为弧度

<>这对于C、C++、java、JavaScript、C语言以及我所知道的其他语言都是正确的。我无法说出一种使用度表示角度的语言

double radians = dir*Math.PI/180.0;
x += (int)(spd*Math.cos(dir));
y -= (int) (spd * Math.sin(dir));`  // I don't know why you do this.  Funny left-handed coordinate system.
速度是速度向量的大小。如文中所述,这些方程式仅将速度表示为(vx,vy)分量

如果需要位移,则必须乘以时间步长:

vx = speed*Math.cos(angle);
vy = speed*Math.sin(angle);
dx = vx*dt;
dy = vy*dt;
x += dx;  // movement in x-direction after dt time w/ constant velocity
y += dy;  // movement in y-direction after dt time w/ constant velocity

如果涉及加速度(例如重力),则应以相同的方式计算速度随时间的变化。

是的,需要将角度保持为浮动


但更有可能的是,你说你用的是0和90。Math.cos()和Math.sin()取弧度值。如果你通过了学位考试,你肯定会让事情朝着错误的方向发展。从度转换为弧度,你的方向可能会更好。

一个问题是,当你每次迭代增加
x
y
时,舍入误差会出现。一种可能的解决方案是基于计数器计算
x
y
坐标:

x = (int) (time * spd * Math.cos(dir));
y = (int) (time * spd * Math.sin(dir));

在这里,我使用变量名
time
作为计数器,以指示它是子弹发射后经过的时间量的度量。

我所做的是取出(int)s并将其放入get方法中,但它仍然只向大约8-9个不同的方向发射。哦,是的,也是这样!完全忽略了这一部分。我认为这是问题的真正根源。好吧,我不确定如何解释发生了什么,但我做到了:dir=dir*Math.PI/2.0;但是结果是非常奇怪的,子弹似乎彼此环绕。事实上,我把它放在构造函数类中修复了这个奇怪的问题,但是它只在4个方向上发射。编辑:事实上(再次)你是对的,它是有效的,我只是把pi/2.0,这是我第一次看到的,而不是180。对不起,谢谢你的帮助!90度=&pi/2.0弧度。我不知道你在干什么。