Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;与SFML的播放器墙碰撞_C++_Collision Detection_Sfml_Top Down - Fatal编程技术网

C++ c++;与SFML的播放器墙碰撞

C++ c++;与SFML的播放器墙碰撞,c++,collision-detection,sfml,top-down,C++,Collision Detection,Sfml,Top Down,我的朋友和我正在开发一款自上而下的益智游戏。 我们已经实现了一个可以行走和碰撞墙壁的播放器类,但问题是在碰撞本身之后 例如: 当玩家击中其右侧的墙时,我们将x轴上的速度设置为0,玩家停止。但在此之后,如果用户按下向上键,播放器将向上移动一个像素,然后再次停止。 之后,如果你继续交替地向右和向上按,播放器将一个像素接一个像素地穿过墙壁 这是玩家的碰撞检测: for (int i = 0; i < lvl.getSizeInTiles().x; i++) { for (int

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

例如:
当玩家击中其右侧的墙时,我们将
x
轴上的速度设置为0,玩家停止。但在此之后,如果用户按下向上键,播放器将向上移动一个像素,然后再次停止。
之后,如果你继续交替地向右和向上按,播放器将一个像素接一个像素地穿过墙壁

这是玩家的碰撞检测:

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;
}
for(int i=0;i0){
CollipsDown=真;
}
否则{
CollipsDown=错误;
}
如果(面方向==“左”&&x级<0){
collizesleft=true;
}
否则{
collizesleft=false;
}
如果(面方向==“右”&&vel.x>0){
CollipsRight=true;
}
否则{
碰撞右=假;
}
}
}
}
}
}
如果(级别x>0&!CollipsRight){
位置x+=水平x;
}
if(x级<0&!SLEFT){
位置x+=水平x;
}
如果(y级>0&!碰撞向下){
位置y+=水平y;
}
如果(y级<0&!碰撞支持){
位置y+=水平y;
}
请注意:intersect(x,y,w,h)函数是player类的一部分,请告诉我们您是否需要查看它

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


谢谢你们的帮助,如果需要的话,请提问,阿拉德和罗恩

根据提供的信息猜测一下,但请注意,当你穿过墙时,你的角色实际上并没有向右。它正面朝上,所以碰撞光是假的。与其基于角色所面对的方向来抑制移动,不如仅基于位置来抑制,即

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

如果没有完整的代码,我会从gif中猜到faceDirection的变化“不够快”,因此当你实际执行该方法时,faceDirection仍然会说
UP
,导致你的整个方法失败。我想我不明白。我的意思是,播放器和墙都是矩形,位于左上角,还有一个尺码。这个半径值是多少?@aradarbel10这只是一个例子,我真正的意思是编辑。