2

所以我正在研究碰撞检测代码,我所做的是当用户矩形与他们不能移动的矩形重叠时,我阻止它们移动。因此,如果我向右移动并且撞到墙,我将无法向前移动。这行得通。但是,如果在我撞到那堵墙之后,我想从那个点向下或向上移动,我就会卡住。

这就是我检查用户是否有冲突的方式

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();
}

在我的渲染方法中,我一直调用 move userMove 方法,直到我松开键盘,将 xD,yD 变为零

4

1 回答 1

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
于 2013-08-04T19:38:27.270 回答