箭的射弹运动:基于用户目标的改变轨迹

时间:2015-05-20 18:22:42

标签: java projectile

我正在制作一款需要箭头"从静止位置(设定坐标)拍摄。箭头的轨迹基于用户在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();

    }

我很确定我做错了,必须有一种更有效的方法来完成这项任务。

1 个答案:

答案 0 :(得分:0)

看起来你没有正确计算轨迹路径。在actionPerformed中,您正在递增箭头的x坐标,然后计算相应的y。这根本不起作用,因为即使您可以将y计算为x的函数,x本身也是t(时间)的函数。因此,您必须在x时计算t,而不是假设x 总是在下一次调用时增加1

鉴于您可以计算角度,您可以使用以下公式计算xy的位置作为时间和角度的函数:

xy

所以你的算法基本上是:

time++; //time variable that you maintain
arrow_x = ... //calculate using (1)
arrow_y = ... //calculate using (2)