我正在制作一款需要箭头"从静止位置(设定坐标)拍摄。箭头的轨迹基于用户在GUI中单击的位置。这基本上是一个Aiming功能。我不能让箭头跟随工作路径,任何方程式,即使用已导致奇怪,毛躁和错误的结果。
public class ReShoot implements ActionListener
{
public void actionPerformed(ActionEvent e){
ArrowShoot shoot = new ArrowShoot();
shoot.ReShoot();
}
}
public class ArrowShoot implements ActionListener
{
public Timer T = new Timer(5, this);
Arrow A = new Arrow();
public void ReShoot(){
T.start();
arrow_x=0;
arrow_y=200;
A.setBounds(0,200,10,10);
}
// MAIN: y=-16t^2 + Vy * t + h
//Vy = v * sin(a)
//Vx = v * cos(a)
//a = arctan( (200-mouse_y)/v
//v = Mouse_x - Arrow_x
//t = x / Vx
public void actionPerformed(ActionEvent e)
{//arrow_y = 0.0025 * Math.pow((mouse_x-arrow_x), 2)+ mouse_y;
Container container_arrow = getContentPane();
container_arrow.setLayout(null);
container_arrow.add(A);
A.setBounds(0,200,10,10);
arrow_x++;
double v = mouse_x/2; //height change
double a = 50* Math.atan((200-mouse_y) / (v));
double Vy = v * Math.sin(a);
double Vx = v * Math.cos(a);
double t = arrow_x/Vx;
double h = 200;
arrow_y = (16) * Math.pow(t, 2) + (Vy * t) + h;
int x = (int)Math.round(arrow_x);
int y = (int)Math.round(arrow_y);
A.setBounds(x, y,10,10);
if (arrow_y>=500)
T.stop();
}
我很确定我做错了,必须有一种更有效的方法来完成这项任务。
答案 0 :(得分:0)
看起来你没有正确计算轨迹路径。在actionPerformed
中,您正在递增箭头的x
坐标,然后计算相应的y
。这根本不起作用,因为即使您可以将y
计算为x
的函数,x
本身也是t
(时间)的函数。因此,您必须在x
时计算t
,而不是假设x
总是在下一次调用时增加1
。
鉴于您可以计算角度,您可以使用以下公式计算x
和y
的位置作为时间和角度的函数:
所以你的算法基本上是:
time++; //time variable that you maintain
arrow_x = ... //calculate using (1)
arrow_y = ... //calculate using (2)