我是编程的新手,我正在尝试制作一个可以移动圆圈或球远离鼠标的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();
}
答案 0 :(得分: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;
答案 1 :(得分: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.
有一种简单的方法可以完成你的任务,只需要使用与xd和yd相关的xrate和yrate。
你可以试试这个:
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;
希望这可以提供帮助。