【问题标题】:c++ player-wall collision with SFMLc ++播放器与SFML的碰撞
【发布时间】:2018-06-13 14:25:38
【问题描述】:

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

例如:
当玩家撞到右侧的墙时,我们将 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。

【问题讨论】:

  • 如果没有完整的代码,我猜从 gif faceDirection 不会改变“足够快”,所以当你实际执行该方法时,faceDirection 仍然说UP 导致你的整个方法失败。

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


【解决方案1】:

只是对提供的信息进行猜测,但请注意,当您穿过墙壁时,您的角色实际上并没有面向右侧。它是朝上的,所以 collidesRight 是假的。与其根据角色面向的方向来禁止移动,不如仅根据位置来禁止移动,即

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

【讨论】:

  • 我想我不明白。
  • 我的意思是,播放器和墙都是矩形,具有左上角的位置和大小。这个半径值是多少?
  • @aradarbel10 这只是一个例子,我真正的意思是类似于编辑。
猜你喜欢
  • 2014-02-28
  • 2017-07-25
  • 2018-06-11
  • 2013-08-22
  • 1970-01-01
  • 2018-09-18
  • 1970-01-01
  • 2013-04-22
  • 1970-01-01
相关资源
最近更新 更多