0

所以我正在制作一个 2D 安卓游戏,你用光标瞄准,你的角色在光标点击的地方射击。创建箭头时,将调用此方法

private final float GRAVITY = 100, SPEED = 50f;

public Arrow(float dx, float dy, float x1, float y1, float x2, float y2,)
{
    destination = new Vector2(dx, dy);//mouse clicked here

    //x1 and y1 are the starting coordinates
    bounds = new Polyline(new float[]{x1, y1, x2, y2});

    double r = Math.atan2(dy-y1, dx-x1);//calculate angle
    velocity = new Vector2();
    velocity.x =  (float)(Math.cos(r) * SPEED);
    velocity.y = (float)(Math.sin(r) * SPEED) + ACCOUNT FOR GRAVITY;

    acceleration= new Vector2(0, GRAVITY);
}

这是更新方法,非常简单

public void update(float delta)
{
    velocity.add(acceleration.cpy().scl(delta));
    position.add(velocity.cpy().scl(delta));
}

我如何解释重力?如果重力设置为 0,则箭头沿直线移动到鼠标单击的坐标,但在重力作用下,它总是短。我不知道如何解释重力。我认为三角洲可能把我搞砸了。

4

1 回答 1

2

这更像是一个数学/物理问题,而不是一个编程问题。所以首先,你知道箭头的水平速度是恒定的(除非你有空气阻力,在这种情况下要复杂得多)。您可以计算箭头到达目的地的 x 坐标所需的时间。

let (dx, dy) = displacement from launcher to destination
let c = cos(angle), s = sin(angle), vx = c * speed, vy = s * speed

vx * t = dx
t = dx / vx

使用此值,您可以计算垂直位移

dy = 0.5*acc * t^2 + V0 * t
dy = 0.5*acc * (dx/vx)^2 + vy*t

dy = 0.5*acc * (dx/(c*speed))^2 + (s*speed)*(dx/(c*speed))

因为 sin = sqrt(1 - cosine^2),

dy = 0.5*acc * (dx/(c*speed))^2 + (sqrt(1-c^2)*speed)*(dx/c*speed))

现在你有一个只有已知值(acc、dy、dx、速度)和 c 的方程。如果你解 c,你知道余弦,你可以找到罪。

于 2015-05-11T00:14:59.117 回答