2014-02-16 18 views
2

我試圖重拍突破,而我的球偶爾會跳過瓷磚,或者不正確地彈起。我認爲我發現問題在於,我的代碼檢測球是從頂部,底部還是側面傳出,並沒有說明球的「臺階」尺寸可以使其落在瓦。我試過的唯一一件事就是防止了這些bug的發生,一直在減小步長,但這會讓球的移動速度比我想要的慢。那麼,我怎樣才能保持球的速度相同,同時仍然準確地檢測它碰撞的哪一側?如何檢測碰撞的一面?

Vector2 ballCenter = new Vector2(); 
       Vector2 tileCenter = new Vector2(); 
       ballCenter = ball.getHitbox().getCenter(ballCenter); 
       tileCenter = tiles.get(i-1).getHitbox().getCenter(tileCenter); 



       if(ballCenter.y-ball.sprite.getHeight()/2>tileCenter.y){ 
        ball.velocity.y = Math.max((-1*ball.velocity.y)+2,10); 
       } 
       else if(ballCenter.y+ball.sprite.getHeight()/2<tileCenter.y){ 
        ball.velocity.y = Math.max((-1*ball.velocity.y)-1,-10); 
       } 
       else 
        ball.velocity.x *=-1; 
+0

如果你保留了當前的位置和前一個位置,那麼你可以說「如果當前位置在磚塊之上,以前的位置低於球體向上移動」等等。然後,您可以計算出球首先碰到磚的位置以及以什麼角度計算得到的路徑。 –

回答

0

通過它的外觀,您的代碼可以檢測當前步驟發生時球是否與當前瓦片發生碰撞。問題是,除非你有非常小的步長,否則恰恰在恰當的時間發生碰撞的可能性恰好與步驟一致。既然你在步驟之間發生了碰撞,你就會有像跳球一樣的東西,並且完全忽略它們。

解決此問題的一個方法是更改​​您執行碰撞檢測的方式。在這個時間點上,不要檢查球是否碰到了瓦,而是需要在當前步和前一步之間的任何時間點檢查球是否碰到了瓦。由於您既擁有球的位置和速度,而且我假設了靜態貼圖,您可以將其設置爲查找從舊球位置到球的新位置(舊球假設沒有碰撞的位置+速度)。

然後,如果存在交集(碰撞),則可以採用更多涉及的處理。

因此,僞代碼將是這個樣子:

// use some basic geometry to find intersections between the ball's motion vector 
// and the tiles bounding square 
if (isCollision(ball, tile)) 
{ 
    // If there is a collision then find out how far through the step it occurred 
    // i.e.: 0 = start, 1 = end, 0.5 = half way through 
    collision_time = findCollisionTime(ball, tile); 

    //process the part of the step before the collision 
    ball.x = ball.x + (ball.velocity.x * collision_time); 
    ball.y = ball.y + (ball.velocity.y * collision_time); 
    //or however you want to do it. 

    //update the velocity to for the collision 
    ball.velocity.x = ... 
    ball.velocity.y = ... 

    //process the part of the step after the collision 
    ball.x = ball.x + (ball.velocity.x * (1-collision_time)); 
    ball.y = ball.y + (ball.velocity.y * (1-collision_time)); 
} 

注:我在上面所示的方法假定只球移動,而且它永遠不會在一個以上的瓷磚碰撞步。它應該很容易,允許多個碰撞與一些適應和一個while循環。考慮到非靜態碰撞需要更多思考。

或者,你可以看看物理引擎爲你做這一切。

+0

關於物理引擎,我想知道這是否可能是解決方案。不過,瞭解它的工作原理總是很好的。謝謝! – user3316768

+0

@ user3316768那麼,它不一定是如何完成的,但這是我從頭到尾想出來的。順便提一句,這是[鏈接到libgdx物理引擎wiki](https://github.com/libgdx/libgdx/wiki/Physics)。 – Alan