2013-08-04 28 views
2

所以我正在研究一個碰撞檢測代碼,我做的是當用戶矩形與他們不能移動的矩形重疊時,我阻止他們移動。所以如果我正確地移動,並且我碰到了牆,我不能前進。這工作。然而,如果在我撞上那堵牆後,我想從這個位置向下或向上移動,我會卡住。關於重疊,玩家卡住了libgdx Rectangle

這是我的檢查,如果用戶已經colidded

private void checkCollision() { 
     for (int x = 0; x < amount; x++) { 
      if (collsionRect[x].overlaps(user)) { 
       Gdx.app.log(ChromeGame.LOG, "Overlap"); 
       xD = 0; 
       yD = 0; 
      } 
     } 
    } 

這就是我如何將我的用戶

private void moveUser() { 
    // camera.translate(xD, yD); 
    player.translate(xD, yD); 
    camera.position.set(player.getX(), player.getY(), 0); 
    // Gdx.app.log(ChromeGame.LOG, player.getX() + "," + player.getY()); 
    user = new Rectangle(player.getX(), player.getY(), player.getWidth(), 
      player.getHeight()); 
    checkCollision(); 
} 

在我的渲染方法,我保持通話,此舉userMove方法,直到我讓鍵盤轉到eit將xD,yD變爲零

回答

3

問題是您檢查矩形是否重疊。這意味着你的角色不會碰撞,除非他的一部分已經在牆內,然後他停止移動。下一次你想移動角色時,他已經發生了碰撞(他的一部分在牆內),所以checkCollision()會將xD, yD設置爲0,角色不會移動。

最簡單的解決方案是做一個「假」的移動(插值),並檢查這個新移動是否會使他碰撞,如果他會碰撞你,只是不接受這個新舉措。在僞代碼

new position = player.x + deltaX, player.y+deltaY 
create new rectangle for player from new position 
check collision with new rectangle 
if not collide player.x += deltaX, player.y+=deltaY 
+0

謝謝我現在得到它,我在移動前存儲原始位置,然後檢查它是否碰撞,如果它確實然後我將它設置爲原始 – Exikle