我有一个图像在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;
}
}
}
答案 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;
}
}