所以我正在研究碰撞检测代码,我所做的是当用户矩形与不能移动的矩形重叠时,我阻止他们移动。因此,如果我向右移动,我撞墙,我不能前进。这有效。然而,如果我撞到那堵墙后,我想向下或向上移动那个点,我就会卡住。
这是我检查用户是否已进行了整理的方式
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变为零
答案 0 :(得分: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