0

我正在制作一个需要从固定位置(设定坐标)射出“箭头”的游戏。箭头的轨迹基于用户在 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();

    }

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

4

1 回答 1

0

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

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

xy

所以你的算法本质上是:

time++; //time variable that you maintain
arrow_x = ... //calculate using (1)
arrow_y = ... //calculate using (2)
于 2015-05-20T19:16:35.550 回答