在重叠时,玩家会被卡住libgdx矩形

所以我正在研究碰撞检测代码,我所做的是当用户矩形与不能移动的矩形重叠时,我阻止他们移动。 因此,如果我向右移动,我撞墙,我不能前进。 这很有效。 然而,如果在我撞到那堵墙之后,我想向下或向上移动那个点,我会卡住。

这就是我检查用户是否已经进行了整理的方法

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方法直到我放开键盘,然后将xD,yD变为零

问题是你检查矩形是否重叠。 这意味着你的角色不会碰撞,除非他的某些部分已经在墙内,然后他就会停止移动。 下次你要移动角色时他已经碰撞(他的一部分在墙内),所以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