我正在尝试制作一个图形项目,其中一个球远离我的光标,我已经做了另一种方法来围绕球寻找我的光标,当她到达时她失去了速度,所以就像她在快跑直到她来大约10像素范围内,然后她失去速度,直到触摸光标。
问题是,我找不到一种使球离开光标的方式,即当我输入直径(从球开始)时,她的速度会变慢,如果我接近的话,她会开始运动可以更快地逃脱,但是当我的光标离开直径时,她会缓慢运行直到再次停止。
我希望我说清楚了,我想到了一个解决方案,但我不知道我是否可以使用伙计们在Java中建立一个库或某些内置函数: -有一个从0到100的百分比,其中我的光标和球之间的距离适合内部,例如0%是速度= 0,100%是速度= 4,您是否知道我是否可以实施?
提前谢谢!
我创建了一个Vector类,在其中进行更改并访问X和Y坐标以使球移动,我使用基本的三角函数使矢量始终具有相同的长度。
我的球(追赶者)课程的代码:
public class Chaser {
private double x;
private double y;
private double vel = 1;
private double hyp;
private Vector vector = new Vector(0, 0);
private double distance;
public Chaser(int width, int height){
x = width/2;
y = height/2;
}
public void setVel(Point m){
if(m.x != x)
hyp = Math.sqrt(Math.pow(Math.abs(m.x - x), 2) + Math.pow(Math.abs(m.y - y), 2));
else
hyp = Math.abs(m.y - y);
}
public void setDirection(Point m){
if(hyp == 0) return;
vector.change((m.x - x)/hyp, (m.y - y)/hyp);
}
public void draw(Graphics g){
g.setColor(Color.RED);
g.fillOval((int)x - 10, (int)y - 10, 20, 20);
g.setColor(Color.BLACK);
g.drawLine((int)x, (int)y, (int)(vector.getX()*15*vel) + (int)x, (int)(vector.getY()*15*vel) + (int)y);
}
public void move(Point m){
setVel(m);
setDirection(m);
useVector();
}
public void useVector(){
if(vector == null) return;
x -= vector.getX() * vel;
y -= vector.getY() * vel;
}
public void calculateVelocity(Point m){
if(vector == null) return;
// I don't know what to do yet
}
}
答案 0 :(得分:1)
如果您只是想推球,您可以做一些简单的事情。让我们使用向量使其更容易理解。说slicer
握住球的中心(x,y),ball
包含鼠标的位置(x,y)。
您可以计算球与鼠标之间的距离,即mouse
,以获取鼠标与球之间的距离。
如果距离>球半径,则鼠标在外面。
否则,您可以这样做:
(mouse - ball).length()
移动鼠标时,球将被鼠标推动。 如果您需要一点惯性,那么当您不再推动球时,球不会只是停止,那么您需要保持额外的矢量速度,并使用tmp来获得加速度。 像这样:
tmp = ball - mouse // get the vector from mouse to the ball.
tmp = tmp / tmp.length() * ball_radious // change the vector's length to match the radious of the ball.
ball = mouse + tmp // Move the ball such that the mouse will be on the edge.
您可以使用这些常数来获得所需的正确感觉。 time_delta旨在规范帧之间的速度,因此,如果它们之间存在某些不一致,则无需太担心。您也可以使用一个常数,但是运动有时会变得不稳定。
以上所有操作均为向量操作。