Java小球远离光标

时间:2018-09-06 11:42:00

标签: java algorithm

我正在尝试制作一个图形项目,其中一个球远离我的光标,我已经做了另一种方法来围绕球寻找我的光标,当她到达时她失去了速度,所以就像她在快跑直到她来大约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
}

}

1 个答案:

答案 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旨在规范帧之间的速度,因此,如果它们之间存在某些不一致,则无需太担心。您也可以使用一个常数,但是运动有时会变得不稳定。

以上所有操作均为向量操作。