0

我是编程新手,我正在尝试制作一个 2d 小程序,它将使一个圆圈或球远离鼠标。我希望这个程序中的物理原理起作用的方式是让对象像一个球一样,而鼠标像一个可移动的山丘。当鼠标离球越来越近时,它会越来越快地排斥球,而当鼠标离球越来越远时,球会减速并最终停止移动。我需要同时考虑鼠标和对象之间的总距离以及 x 和 y 距离,以便对象的移动更平滑且更逼真。我遇到的最大问题是,即使两点之间的距离变大,球离开的速度也保持相对恒定。目前,速率是 x 或 y 的距离乘以一个常数,并除以总距离。当鼠标靠近对象时,这或多或少会起作用,并且速率会增加,但是当鼠标移开时它会失败。当鼠标移开时,我希望速率降低并最终变为 0,但是在我当前的设置中,x 距离也会随着距离的增加而增加,并且速率不会像我想要的那样降低,如果有的话. 我现在的方式可能需要全部拼凑起来,感谢您的帮助。如果有的话,利率不会像我想要的那样下降。我现在的方式可能需要全部拼凑起来,感谢您的帮助。如果有的话,利率不会像我想要的那样下降。我现在的方式可能需要全部拼凑起来,感谢您的帮助。

    public void mouseMoved (MouseEvent e) 
{
    //distance between x coord
    xd=e.getX()-x;
    //distance between y coord
    yd=y-e.getY();
    //total distance between mouse and ball
    d=Math.sqrt((Math.pow(xd,2))+(Math.pow(yd,2)));

    //rate of x change
    xrate=(Math.sqrt(Math.pow(xd,2))*4)/(d);
    //rate of y change
    yrate=(Math.sqrt(Math.pow(yd,2))*4)/(d);

    //determines movement of ball based on position of the mouse relative to the ball
    if(xd>0)
    {
        x=x-((int)(xrate));
    }
    if(xd<0)
    {
        x=x+((int)(xrate));
    }
    if(yd>0)
    {
        y=y+((int)(yrate));
    }
    if(yd<0)
    {
        y=y-((int)(yrate));
    }

    //updates x and y coords of ball
    repaint();
}
4

2 回答 2

0

你只是做错了数学。

 //total distance between mouse and ball
 d=Math.sqrt((Math.pow(xd,2))+(Math.pow(yd,2)));
 //rate of x change
 xrate=(Math.sqrt(Math.pow(xd,2))*4)/(d);   

想想这个:

如果你只在 x 绳上移动,只会让 yd 等于 0 并且 d=|xd|

所以 xrate = |xd|*4/(d) = d*4/d = 4。

有一种简单的方法可以完成您的任务,只需将 xrate 和 yrate 与 xd 和 yd 相关联。

你可以试试这个:

if(xd==0){
  xd = 0.1;//minimum distance
}
if(yd==0){
  yd = 0.1;
}

xrate = (1/xd)*10; // you can change number 100 for proper speed
yrate = (1/yd)*10;
x = x - xrate;
y = y - yrate;

希望这能有所帮助。

于 2012-06-11T07:10:29.960 回答
0

尝试这个-

//rate of x change
xrate=(1.0/(d))*20; //20 is just a random constant I guessed
//rate of y change
yrate=(1.0/(d))*20;
于 2012-06-11T03:45:55.223 回答