与SFML

时间:2018-06-13 14:25:39

标签: c++ collision-detection sfml top-down

我和我的朋友正在开发一款自上而下的益智游戏 我们已经实现了一个可以行走并碰撞墙壁的玩家类,但问题出在碰撞本身之后。

例如:
当玩家右侧撞墙时,我们将 x 轴上的速度设置为 0 ,然后玩家停止。但在此之后,如果用户按下 up 键,则播放器向上移动一个像素,然后再次停止。
之后,如果你一直向右按向上,播放器就会像素一样穿过墙壁像素。

The player moves through the wall

以下是玩家的碰撞检测:

for (int i = 0; i < lvl.getSizeInTiles().x; i++) {
        for (int j = 0; j < lvl.getSizeInTiles().y; j++) {
            if (lvl.getTileFromBuffer(i, j).getType() == "wall") {
                if (intersects(lvl.getTileFromBuffer(i, j).getPosition().x, lvl.getTileFromBuffer(i, j).getPosition().y, lvl.getTileFromBuffer(i, j).getSize().x, lvl.getTileFromBuffer(i, j).getSize().y)) {
                    if (faceDirection == "UP" && vel.y < 0) {
                        collidesUp = true;
                    }
                    else {
                        collidesUp = false;
                    }

                    if (faceDirection == "DOWN" && vel.y > 0) {
                        collidesDown = true;
                    }
                    else {
                        collidesDown = false;
                    }

                    if (faceDirection == "LEFT" && vel.x < 0) {
                        collidesLeft = true;
                    }
                    else {
                        collidesLeft = false;
                    }

                    if (faceDirection == "RIGHT" && vel.x > 0) {
                        collidesRight = true;
                    }
                    else {
                        collidesRight = false;
                    }
                }
            }
        }
    }
}
if (vel.x > 0 && !collidesRight) {
    pos.x += vel.x;
}
if (vel.x < 0 && !collidesLeft) {
    pos.x += vel.x;
}
if (vel.y > 0 && !collidesDown) {
    pos.y += vel.y;
}
if (vel.y < 0 && !collidesUp) {
    pos.y += vel.y;
}

只需快速说明 intersect(x, y, w, h) 功能是播放器类的一部分,并告诉我们您是否需要查看它。

如果您发送有关我们代码的回复,或者将我们链接到可以找到解决方案的地方,我们将非常高兴。

非常感谢您的帮助,如果您需要,请提出问题,Arad和Ron。

1 个答案:

答案 0 :(得分:0)

只是猜测提供的信息,但请注意,当你穿过墙壁时,你的角色实际上并不是面向右边。它正面朝上,所以collidesRight将是假的。不是根据你的角色面向哪个方向来抑制移动,而是仅根据位置来抑制,即

if (intersecting_right(player, wall) && player.x_vel > 0)
    player.x_vel = 0;