2011-10-13 58 views
1

我有一个图像在delta时间(dt)上以给定速度水平移动。但问题是,当图像达到世界的大小时,图像不会反弹。如何让图像反射回来,以便将图像保存在世界内部?如何让我的图像沿x轴反弹?

任何帮助都可以。

这里是我试过到目前为止:

@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

这是一个Swing相关的问题?我看到没有Swing电话在这里... – jfpoilpret

回答

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,因为这样做,图像会反弹时,它“沾上”世界的尽头。

+0

+1分别检查每一端。 – trashgod

+0

谢谢!我接受你的答案。 – jinHo

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; 
    } 
} 
+0

感谢您给出这个想法。 :-) – jinHo

1

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