2011-10-13 64 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模擬中所示。