2017-08-16 46 views
1

所以我在android studio中做了一個突破遊戲。(Java)在突破遊戲中使用矢量碰撞

在製作了一個遊戲循環和與槳和磚的基本碰撞後,我注意到我的球已經開始通過我的磚和槳在增加速度後進行剪輯。

問題在於它在一幀中碰撞了兩次,所以我的基本碰撞是不夠的。

我讀過關於使用矢量數學解決方案。但是對我來說這太過分了,因此我的頭也圍繞着它。 我指的是這個問題的答案: Refer Here

if (RectF.intersects(bricks[i].getRect(), ball.getRect())) { 

Brick brick = bricks[i]; 

if(ball.getRect().centerX()>brick.minX() && ball.getRect().centerX() < brick.maxX()){ 

    ball.reverseYVelocity(); 

    if(ball.getRect().top > brick.getRect().centerY()){ 

     ball.clearObstacleY(brick.getRect().bottom - ball.getRect().height()); 

    } else { 

     ball.clearObstacleY(brick.getRect().top + ball.getRect().height()); 

    } 

} else { 

ball.reverseXVelocity(); 

if(ball.getRect().left > brick.getRect().centerX()){ 

    ball.clearObstacleX(brick.getRect().right + ball.getRect().width()); 

} else { 

ball.clearObstacleX(brick.getRect().left - ball.getRect().width()); 

} 
} 

而且我的球更新:

public void update(long fps, float speed){ 
    rect.left = rect.left + (xVelocity*speed/fps); 
    rect.top  = rect.top + (yVelocity*speed/fps); 
    rect.right = rect.left + ballWidth; 
    rect.bottom = rect.top - ballHeight; 
} 

那麼我將如何改變這個弄成這個樣子: Demo

提前致謝!

回答

0

在每個循環中,您應該記錄上一次球的位置。當你發現碰撞時,你應該立即將球移動到前一幀位置,然後處理反彈效果。它不應該兩次註冊碰撞,這意味着你沒有正確處理碰撞。如果你說當你提高速度時,球看起來會通過槳,那麼你需要看看你如何解決速度或提高幀率。你的FPS設置了什麼?

你還可以看到我的答案herehere

+0

我的FPS設定爲60 但我認爲解決的辦法是,如果我的下一個球的位置攔截任何塊或槳看到,如果不將其設置爲最接近的牆壁並反轉速度。 – MrPako

+0

不正確!如上所述,當您檢測到碰撞時,您應該在碰撞發生之前將球的位置設置到先前的位置,然後您可以反轉所有不考慮偏轉角度的速度。所以你需要存儲每個循環的前一幀位置 – Rob85

+0

嗯。但是如果球的位置非常遠並且球非常快,那麼它可能會錯過碰撞。實際上,我終於弄明白了,在我把所有的東西都工作後,我會發布我的答案:D – MrPako