在java中跳跃球物理,引力

时间:2015-01-07 10:59:27

标签: java animation sprite game-physics

我制作了一个简单的代码来获得跳球位置,但我肯定错过了一些东西,因为我得到了这个:http://i60.tinypic.com/2guxibn.png

以下是获取x和y位置的代码:

public Vector2f[] draw() {
    float x = 0, y = height; // height - float value from class constructor;
    ArrayList<Vector2f> graphic = new ArrayList<Vector2f>();
    for(;;){
        Vector2f a = new Vector2f(x, y);
        graphic.add(a);
        ySpeed -= 10;
        y += ySpeed*Math.cos(angle);
        x += xSpeed*Math.sin(angle);
        if(y <= 0){
            // float coef = -10 * y / ySpeed;
            // ySpeed = ((ySpeed + coef) * (-1) ) * bouncyness;
            ySpeed = (ySpeed * (-1)) * bouncyness;
            System.out.println(ySpeed + " " + y);
            y = 0;
        }
        if(x > Main.width)
            break;
    }
    Vector2f[] graphicArray = new Vector2f[graphic.size()];
    for (int i = 0; i < graphic.size(); i++) {
        graphicArray[i] = graphic.get(i);
    }
    return graphicArray;
}

2 个答案:

答案 0 :(得分:1)

在迭代中y在第一次运行时低于X轴。然后被归零,
因此,您在该次迭代中获得的最大height低于原始height 以后也会发生同样的事情 直到y在没有设置的情况下才会变为0(我认为它总会收敛到它) 如果您将height设置为除10,它应该看起来没问题。

对于弹跳案例更改if ( y <= 0)if ( y<= 10 )并删除y = 0声明。
正确的情况(不是弹跳),设置y = Math.abs(y)

答案 1 :(得分:1)

一些想法

  • 我不清楚你在使用angle做什么。对我来说,这看起来是完全错误的。试着摆脱它。
  • 您应该将加速度在一个时间步长上进行两次积分,以使其在物理上正确运行。

    x += v + acc * ∆time * ∆time * 0.5;
    v += acc * ∆time;
    
  • 当y&lt;时,请y = -y 0

我猜你的∆time 1acc-10的位置。