箭头的射弹运动:根据用户的目标改变轨迹

Projectile Motion of Arrow: Altered trajectory based on User's Aim

我正在制作一款需要 "arrow" 从固定位置(设定坐标)射击的游戏。箭头的轨迹基于用户在 GUI 中单击的位置。这本质上是一个瞄准功能。我无法让箭头跟随工作路径,即使用的任何方程式都导致了奇怪的、故障的和错误的结果。

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();

    }

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

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

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

所以你的算法基本上是:

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