如何让我的图像沿x轴反弹?

时间:2011-10-13 14:30:15

标签: java swing awt

我有一个图像在delta时间(dt)内以给定的速度水平移动。但问题是,当图像达到世界大小的末端时,图像不会反弹。如何使图像向后反弹,以便将其保留在世界范围内?

任何帮助都可以。

这是我到目前为止所尝试的内容:

@Override
public void move(long dt)
{
    // v = dx / dt
    //   dx m = v m/s  . dt s

    double dt_s = dt / 1e9;
    double dx_m = speed * dt_s;


    double left_wall = 0;
    double right_wall = board.x1_world;

    if (x <= right_wall)
    {
        x += dx_m;
        if (x >= right_wall)
        {

            x = right_wall;
           x *= -dx_m;
        }
    }
}

3 个答案:

答案 0 :(得分:1)

    @Override
public void move(long dt)
{
    double dt_s = dt / 1e9;
    double dx_m = speed * dt_s;


    double left_wall = 0;
    double right_wall = board.x1_world;

    x += dx_m;
    if (x <= 0) speed *= -1.0;
    if (x >= right_wall) speed *= -1.0;
}

当图像的x坐标到达边框时,只需更改水平速度的方向(将其乘以-1)。但你应该使用这样的条件:

if (x >= (right_wall - width_of_image)) speed *= -1.0;

而不只是x >= right_wall,因为这样做,图像会在“触及”世界末日时反弹。

答案 1 :(得分:1)

除了按照@Oscar的建议单独检查每一端之外,您可能需要考虑图像的有限宽度,如此Subway模拟所示。

答案 2 :(得分:0)

private boolean goleft=false;//keep direction
@Override
public void move(long dt)
{
    // v = dx / dt
    //   dx m = v m/s  . dt s

    double dt_s = dt / 1e9;
    double dx_m = speed * dt_s;

    double left_wall = 0;
    double right_wall = board.x1_world;

    if(goleft)x += dx_m;
    else x-= dx_m;

    if (x >= right_wall)//touching 1 wall
    {
        x = right_wall;
        x += dx_m;
        goleft=true;
    }else if(x<=left_wall){//touching the other wall
        x = left_wall;
        x += dx_m;
        goleft=false;
    }
}